From 840ba0f2401cb6342e7ad6db94435c21d7ef5dd9 Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Fri, 10 May 2024 13:23:57 +0100 Subject: [PATCH] Add more refinement options for Reddit widget --- docs/configuration.md | 24 ++++++++++++++-- docs/images/reddit-field-search.png | Bin 0 -> 44930 bytes internal/feed/reddit.go | 23 +++++++++++++-- internal/widget/reddit.go | 43 ++++++++++++++++++++++++++-- 4 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 docs/images/reddit-field-search.png diff --git a/docs/configuration.md b/docs/configuration.md index c21be09..6ccd238 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -525,7 +525,7 @@ Display a list of posts from a specific subreddit. > [!WARNING] > -> Reddit does not allow unauthorized API access from VPS IPs, if you're hosting Glance on a VPS you will get a 403 response. As a workaround you can route the traffic from Glance through a VPN. +> Reddit does not allow unauthorized API access from VPS IPs, if you're hosting Glance on a VPS you will get a 403 response. As a workaround you can route the traffic from Glance through a VPN or your own HTTP proxy using the `request-url-template` property. Example: @@ -544,6 +544,10 @@ Example: | collapse-after | integer | no | 5 | | comments-url-template | string | no | https://www.reddit.com/{POST-PATH} | | request-url-template | string | no | | +| sort-by | string | no | hot | +| top-period | string | no | day | +| search | string | no | | +| extra-sort-by | string | no | | ##### `subreddit` The subreddit for which to fetch the posts from. @@ -609,6 +613,22 @@ https://proxy/{REQUEST-URL} https://your.proxy/?url={REQUEST-URL} ``` +##### `sort-by` +Can be used to specify the order in which the posts should get returned. Possible values are `hot`, `new`, `top` and `rising`. + +##### `top-perid` +Available only when `sort-by` is set to `top`. Possible values are `hour`, `day`, `week`, `month`, `year` and `all`. + +##### `search` +Keywords to search for. Searching within specific fields is also possible, **though keep in mind that Reddit may remove the ability to use any of these at any time**: + +![](images/reddit-field-search.png) + +##### `extra-sort-by` +Can be used to specify an additional sort which will be applied on top of the already sorted posts. By default does not apply any extra sorting and the only available option is `engagement`. + +The `engagement` sort tries to place the posts with the most points and comments on top, also prioritizing recent over old posts. + ### Weather Display weather information for a specific location. The data is provided by https://open-meteo.com/. @@ -622,7 +642,7 @@ Example: > [!NOTE] > -> US cities which have common names can have their state specified as the second parameter like such: +> US cities which have common names can have their state specified as the second parameter as such: > > * Greenville, North Carolina, United States > * Greenville, South Carolina, United States diff --git a/docs/images/reddit-field-search.png b/docs/images/reddit-field-search.png new file mode 100644 index 0000000000000000000000000000000000000000..97ba04ad3c545fc7eaed22984a9a9cf9cd69ee54 GIT binary patch literal 44930 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]HxLaT3TG2uhPBFGZ>w5=V53O#ragN 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 literal 0 HcmV?d00001 diff --git a/internal/feed/reddit.go b/internal/feed/reddit.go index 3ac5dee..294a627 100644 --- a/internal/feed/reddit.go +++ b/internal/feed/reddit.go @@ -30,12 +30,29 @@ type subredditResponseJson struct { } `json:"data"` } -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) +func FetchSubredditPosts(subreddit, sort, topPeriod, search, commentsUrlTemplate, requestUrlTemplate string) (ForumPosts, error) { + query := url.Values{} + var requestUrl string + + if search != "" { + query.Set("q", search+" subreddit:"+subreddit) + query.Set("sort", sort) + } + + if sort == "top" { + query.Set("t", topPeriod) + } + + if search != "" { + requestUrl = fmt.Sprintf("https://www.reddit.com/search.json?%s", query.Encode()) + } else { + requestUrl = fmt.Sprintf("https://www.reddit.com/r/%s/%s.json?%s", subreddit, sort, query.Encode()) + } + 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 42ee264..9642c1e 100644 --- a/internal/widget/reddit.go +++ b/internal/widget/reddit.go @@ -17,6 +17,10 @@ type Reddit struct { Subreddit string `yaml:"subreddit"` Style string `yaml:"style"` ShowThumbnails bool `yaml:"show-thumbnails"` + SortBy string `yaml:"sort-by"` + TopPeriod string `yaml:"top-period"` + Search string `yaml:"search"` + ExtraSortBy string `yaml:"extra-sort-by"` CommentsUrlTemplate string `yaml:"comments-url-template"` Limit int `yaml:"limit"` CollapseAfter int `yaml:"collapse-after"` @@ -36,6 +40,14 @@ func (widget *Reddit) Initialize() error { widget.CollapseAfter = 5 } + if !isValidRedditSortType(widget.SortBy) { + widget.SortBy = "hot" + } + + if !isValidRedditTopPeriod(widget.TopPeriod) { + widget.TopPeriod = "day" + } + if widget.RequestUrlTemplate != "" { if !strings.Contains(widget.RequestUrlTemplate, "{REQUEST-URL}") { return errors.New("no `{REQUEST-URL}` placeholder specified") @@ -47,8 +59,32 @@ func (widget *Reddit) Initialize() error { return nil } +func isValidRedditSortType(sortBy string) bool { + return sortBy == "hot" || + sortBy == "new" || + sortBy == "top" || + sortBy == "rising" +} + +func isValidRedditTopPeriod(period string) bool { + return period == "hour" || + period == "day" || + period == "week" || + period == "month" || + period == "year" || + period == "all" +} + func (widget *Reddit) Update(ctx context.Context) { - posts, err := feed.FetchSubredditPosts(widget.Subreddit, widget.CommentsUrlTemplate, widget.RequestUrlTemplate) + // TODO: refactor, use a struct to pass all of these + posts, err := feed.FetchSubredditPosts( + widget.Subreddit, + widget.SortBy, + widget.TopPeriod, + widget.Search, + widget.CommentsUrlTemplate, + widget.RequestUrlTemplate, + ) if !widget.canContinueUpdateAfterHandlingErr(err) { return @@ -58,7 +94,10 @@ func (widget *Reddit) Update(ctx context.Context) { posts = posts[:widget.Limit] } - posts.SortByEngagement() + if widget.ExtraSortBy == "engagement" { + posts.SortByEngagement() + } + widget.Posts = posts }