From 24ef8f6e2a8f438c26597516b3368b334772dddc Mon Sep 17 00:00:00 2001 From: Jaryl Chng Date: Tue, 30 Apr 2024 09:21:33 +0800 Subject: [PATCH] Added a request-url-template option for Reddit requests Reddit blocks known datacenter IPs from accessing their endpoints unless you request them to unblock it. Even so it has a low chance of success. The new option will allow users to specify a request URL to handle Reddit requests. --- docs/configuration.md | 13 +++++++++++++ internal/feed/reddit.go | 8 ++++++-- internal/widget/reddit.go | 10 +++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 1e3997d..31c0a62 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -515,6 +515,7 @@ Example: | limit | integer | no | 15 | | collapse-after | integer | no | 5 | | comments-url-template | string | no | https://www.reddit.com/{POST-PATH} | +| request-url-template | string | no | | ##### `subreddit` The subreddit for which to fetch the posts from. @@ -568,6 +569,18 @@ r/selfhosted/comments/bsp01i/welcome_to_rselfhosted_please_read_this_first/ `{SUBREDDIT}` - the subreddit name +##### `request-url-template` +A custom request url that will be used to fetch the data instead. This is useful when you're hosting Glance on a VPS and Reddit is blocking the requests, and you want to route it through an HTTP proxy. + +Placeholders: + +`{REQUEST-URL}` - will be templated and replaced with the expanded request URL (i.e. https://www.reddit.com/r/selfhosted/hot.json). Example: + +``` +https://proxy/{REQUEST-URL} +https://your.proxy/?url={REQUEST-URL} +``` + ### Weather Display weather information for a specific location. The data is provided by https://open-meteo.com/. diff --git a/internal/feed/reddit.go b/internal/feed/reddit.go index c8ff4c6..3ac5dee 100644 --- a/internal/feed/reddit.go +++ b/internal/feed/reddit.go @@ -30,8 +30,12 @@ type subredditResponseJson struct { } `json:"data"` } -func FetchSubredditPosts(subreddit string, commentsUrlTemplate string) (ForumPosts, error) { - requestUrl := fmt.Sprintf("https://www.reddit.com/r/%s/hot.json", url.QueryEscape(subreddit)) +func FetchSubredditPosts(subreddit string, commentsUrlTemplate string, requestUrlTemplate string) (ForumPosts, error) { + subreddit = url.QueryEscape(subreddit) + requestUrl := fmt.Sprintf("https://www.reddit.com/r/%s/hot.json", subreddit) + if requestUrlTemplate != "" { + requestUrl = strings.ReplaceAll(requestUrlTemplate, "{REQUEST-URL}", requestUrl) + } request, err := http.NewRequest("GET", requestUrl, nil) if err != nil { diff --git a/internal/widget/reddit.go b/internal/widget/reddit.go index 2d0e944..9226b53 100644 --- a/internal/widget/reddit.go +++ b/internal/widget/reddit.go @@ -4,6 +4,7 @@ import ( "context" "errors" "html/template" + "strings" "time" "github.com/glanceapp/glance/internal/assets" @@ -19,6 +20,7 @@ type Reddit struct { CommentsUrlTemplate string `yaml:"comments-url-template"` Limit int `yaml:"limit"` CollapseAfter int `yaml:"collapse-after"` + RequestUrlTemplate string `yaml:"request-url-template"` } func (widget *Reddit) Initialize() error { @@ -34,13 +36,19 @@ func (widget *Reddit) Initialize() error { widget.CollapseAfter = 5 } + if widget.RequestUrlTemplate != "" { + if !strings.Contains(widget.RequestUrlTemplate, "{REQUEST-URL}") { + return errors.New("no `{REQUEST-URL}` placeholder specified") + } + } + widget.withTitle("/r/" + widget.Subreddit).withCacheDuration(30 * time.Minute) return nil } func (widget *Reddit) Update(ctx context.Context) { - posts, err := feed.FetchSubredditPosts(widget.Subreddit, widget.CommentsUrlTemplate) + posts, err := feed.FetchSubredditPosts(widget.Subreddit, widget.CommentsUrlTemplate, widget.RequestUrlTemplate) if !widget.canContinueUpdateAfterHandlingErr(err) { return