From e546488aebaa7cf8b2571ca2eaaf8f61f9ef58d8 Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:20:03 +0000 Subject: [PATCH 1/6] Fix broken reddit video & nsfw post thumbnails --- internal/feed/reddit.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/feed/reddit.go b/internal/feed/reddit.go index 297020c..77a6e89 100644 --- a/internal/feed/reddit.go +++ b/internal/feed/reddit.go @@ -111,8 +111,8 @@ func FetchSubredditPosts(subreddit, sort, topPeriod, search, commentsUrlTemplate TimePosted: time.Unix(int64(post.Time), 0), } - if post.Thumbnail != "" && post.Thumbnail != "self" && post.Thumbnail != "default" { - forumPost.ThumbnailUrl = post.Thumbnail + if post.Thumbnail != "" && post.Thumbnail != "self" && post.Thumbnail != "default" && post.Thumbnail != "nsfw" { + forumPost.ThumbnailUrl = html.UnescapeString(post.Thumbnail) } if !post.IsSelf { From 85b8ee493e01a767eb0c5ae15c98a9bbbbe810a1 Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:24:40 +0000 Subject: [PATCH 2/6] Update dependencies --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 17aa4d4..7034fe5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.22.5 require ( github.com/mmcdole/gofeed v1.3.0 - golang.org/x/text v0.16.0 + golang.org/x/text v0.21.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -15,5 +15,5 @@ require ( github.com/mmcdole/goxpp v1.1.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - golang.org/x/net v0.27.0 // indirect + golang.org/x/net v0.33.0 // indirect ) diff --git a/go.sum b/go.sum index 28cb1ae..1f81f1c 100644 --- a/go.sum +++ b/go.sum @@ -33,8 +33,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -54,8 +54,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= From ed477e8cc6281c0764df5573057013b3896e928e Mon Sep 17 00:00:00 2001 From: Mystically <100186990+Mystically11@users.noreply.github.com> Date: Thu, 9 Jan 2025 21:19:13 +0100 Subject: [PATCH 3/6] add option to include github prereleases --- internal/feed/github.go | 37 +++++++++++++++++++++++++++++-------- internal/feed/releases.go | 7 ++++--- internal/glance/config.go | 2 +- internal/widget/releases.go | 24 +++++++++++++----------- 4 files changed, 47 insertions(+), 23 deletions(-) diff --git a/internal/feed/github.go b/internal/feed/github.go index 18487f0..9ec3733 100644 --- a/internal/feed/github.go +++ b/internal/feed/github.go @@ -18,11 +18,23 @@ type githubReleaseLatestResponseJson struct { } func fetchLatestGithubRelease(request *ReleaseRequest) (*AppRelease, error) { - httpRequest, err := http.NewRequest( - "GET", - fmt.Sprintf("https://api.github.com/repos/%s/releases/latest", request.Repository), - nil, - ) + var httpRequest *http.Request + var err error + var response githubReleaseLatestResponseJson + + if request.IncludeGithubPreReleases { + httpRequest, err = http.NewRequest( + "GET", + fmt.Sprintf("https://api.github.com/repos/%s/releases", request.Repository), + nil, + ) + } else { + httpRequest, err = http.NewRequest( + "GET", + fmt.Sprintf("https://api.github.com/repos/%s/releases/latest", request.Repository), + nil, + ) + } if err != nil { return nil, err @@ -32,10 +44,19 @@ func fetchLatestGithubRelease(request *ReleaseRequest) (*AppRelease, error) { httpRequest.Header.Add("Authorization", "Bearer "+(*request.Token)) } - response, err := decodeJsonFromRequest[githubReleaseLatestResponseJson](defaultClient, httpRequest) + if request.IncludeGithubPreReleases { + releases, err := decodeJsonFromRequest[[]githubReleaseLatestResponseJson](defaultClient, httpRequest) - if err != nil { - return nil, err + if err != nil { + return nil, err + } + response = releases[0] + } else { + response, err = decodeJsonFromRequest[githubReleaseLatestResponseJson](defaultClient, httpRequest) + + if err != nil { + return nil, err + } } return &AppRelease{ diff --git a/internal/feed/releases.go b/internal/feed/releases.go index b0cdc25..a27f7b0 100644 --- a/internal/feed/releases.go +++ b/internal/feed/releases.go @@ -16,9 +16,10 @@ const ( ) type ReleaseRequest struct { - Source ReleaseSource - Repository string - Token *string + Source ReleaseSource + Repository string + Token *string + IncludeGithubPreReleases bool } func FetchLatestReleases(requests []*ReleaseRequest) (AppReleases, error) { diff --git a/internal/glance/config.go b/internal/glance/config.go index 131ef7f..5b798e6 100644 --- a/internal/glance/config.go +++ b/internal/glance/config.go @@ -49,7 +49,7 @@ func NewConfigFromYml(contents io.Reader) (*Config, error) { func NewConfig() *Config { config := &Config{} - config.Server.Host = "" + config.Server.Host = "127.0.0.1" config.Server.Port = 8080 return config diff --git a/internal/widget/releases.go b/internal/widget/releases.go index 74b5af7..46aa21a 100644 --- a/internal/widget/releases.go +++ b/internal/widget/releases.go @@ -12,15 +12,16 @@ import ( ) type Releases struct { - widgetBase `yaml:",inline"` - Releases feed.AppReleases `yaml:"-"` - releaseRequests []*feed.ReleaseRequest `yaml:"-"` - Repositories []string `yaml:"repositories"` - Token OptionalEnvString `yaml:"token"` - GitLabToken OptionalEnvString `yaml:"gitlab-token"` - Limit int `yaml:"limit"` - CollapseAfter int `yaml:"collapse-after"` - ShowSourceIcon bool `yaml:"show-source-icon"` + widgetBase `yaml:",inline"` + Releases feed.AppReleases `yaml:"-"` + releaseRequests []*feed.ReleaseRequest `yaml:"-"` + Repositories []string `yaml:"repositories"` + Token OptionalEnvString `yaml:"token"` + GitLabToken OptionalEnvString `yaml:"gitlab-token"` + Limit int `yaml:"limit"` + CollapseAfter int `yaml:"collapse-after"` + ShowSourceIcon bool `yaml:"show-source-icon"` + IncludeGithubPreReleases bool `yaml:"include-github-prereleases"` } func (widget *Releases) Initialize() error { @@ -42,8 +43,9 @@ func (widget *Releases) Initialize() error { var request *feed.ReleaseRequest if len(parts) == 1 { request = &feed.ReleaseRequest{ - Source: feed.ReleaseSourceGithub, - Repository: repository, + Source: feed.ReleaseSourceGithub, + Repository: repository, + IncludeGithubPreReleases: widget.IncludeGithubPreReleases, } if widget.Token != "" { From 46bc36ad4ae0659288f63b71ba2904b450d04838 Mon Sep 17 00:00:00 2001 From: Mystically <100186990+Mystically11@users.noreply.github.com> Date: Thu, 9 Jan 2025 21:20:11 +0100 Subject: [PATCH 4/6] oops --- internal/glance/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/glance/config.go b/internal/glance/config.go index 5b798e6..131ef7f 100644 --- a/internal/glance/config.go +++ b/internal/glance/config.go @@ -49,7 +49,7 @@ func NewConfigFromYml(contents io.Reader) (*Config, error) { func NewConfig() *Config { config := &Config{} - config.Server.Host = "127.0.0.1" + config.Server.Host = "" config.Server.Port = 8080 return config From 0ce706e02ee803b08053549dd57272333d39e91e Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Fri, 17 Jan 2025 20:14:07 +0000 Subject: [PATCH 5/6] Update releases widget --- docs/configuration.md | 13 +++ internal/feed/releases.go | 73 ------------- internal/glance/widget-releases.go | 169 +++++++++++++++++------------ internal/widget/releases.go | 105 ------------------ 4 files changed, 115 insertions(+), 245 deletions(-) delete mode 100644 internal/feed/releases.go delete mode 100644 internal/widget/releases.go diff --git a/docs/configuration.md b/docs/configuration.md index 7bc11d8..7123692 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1332,6 +1332,19 @@ repositories: - dockerhub:nginx:stable-alpine ``` +To include prereleases you can specify the repository as an object and use the `include-prereleases` property: + +**Note: This feature is currently only available for GitHub repositories.** + +```yaml +repositories: + - gitlab:inkscape/inkscape + - repository: glanceapp/glance + include-prereleases: true + - codeberg:redict/redict +``` + + ##### `show-source-icon` Shows an icon of the source (GitHub/GitLab/Codeberg/Docker Hub) next to the repository name when set to `true`. diff --git a/internal/feed/releases.go b/internal/feed/releases.go deleted file mode 100644 index a27f7b0..0000000 --- a/internal/feed/releases.go +++ /dev/null @@ -1,73 +0,0 @@ -package feed - -import ( - "errors" - "fmt" - "log/slog" -) - -type ReleaseSource string - -const ( - ReleaseSourceCodeberg ReleaseSource = "codeberg" - ReleaseSourceGithub ReleaseSource = "github" - ReleaseSourceGitlab ReleaseSource = "gitlab" - ReleaseSourceDockerHub ReleaseSource = "dockerhub" -) - -type ReleaseRequest struct { - Source ReleaseSource - Repository string - Token *string - IncludeGithubPreReleases bool -} - -func FetchLatestReleases(requests []*ReleaseRequest) (AppReleases, error) { - job := newJob(fetchLatestReleaseTask, requests).withWorkers(20) - results, errs, err := workerPoolDo(job) - - if err != nil { - return nil, err - } - - var failed int - - releases := make(AppReleases, 0, len(requests)) - - for i := range results { - if errs[i] != nil { - failed++ - slog.Error("Failed to fetch release", "source", requests[i].Source, "repository", requests[i].Repository, "error", errs[i]) - continue - } - - releases = append(releases, *results[i]) - } - - if failed == len(requests) { - return nil, ErrNoContent - } - - releases.SortByNewest() - - if failed > 0 { - return releases, fmt.Errorf("%w: could not get %d releases", ErrPartialContent, failed) - } - - return releases, nil -} - -func fetchLatestReleaseTask(request *ReleaseRequest) (*AppRelease, error) { - switch request.Source { - case ReleaseSourceCodeberg: - return fetchLatestCodebergRelease(request) - case ReleaseSourceGithub: - return fetchLatestGithubRelease(request) - case ReleaseSourceGitlab: - return fetchLatestGitLabRelease(request) - case ReleaseSourceDockerHub: - return fetchLatestDockerHubRelease(request) - } - - return nil, errors.New("unsupported source") -} diff --git a/internal/glance/widget-releases.go b/internal/glance/widget-releases.go index 0b47783..0f1e2d9 100644 --- a/internal/glance/widget-releases.go +++ b/internal/glance/widget-releases.go @@ -11,20 +11,21 @@ import ( "sort" "strings" "time" + + "gopkg.in/yaml.v3" ) var releasesWidgetTemplate = mustParseTemplate("releases.html", "widget-base.html") type releasesWidget struct { - widgetBase `yaml:",inline"` - Releases appReleaseList `yaml:"-"` - releaseRequests []*releaseRequest `yaml:"-"` - Repositories []string `yaml:"repositories"` - Token string `yaml:"token"` - GitLabToken string `yaml:"gitlab-token"` - Limit int `yaml:"limit"` - CollapseAfter int `yaml:"collapse-after"` - ShowSourceIcon bool `yaml:"show-source-icon"` + widgetBase `yaml:",inline"` + Releases appReleaseList `yaml:"-"` + Repositories []*releaseRequest `yaml:"repositories"` + Token string `yaml:"token"` + GitLabToken string `yaml:"gitlab-token"` + Limit int `yaml:"limit"` + CollapseAfter int `yaml:"collapse-after"` + ShowSourceIcon bool `yaml:"show-source-icon"` } func (widget *releasesWidget) initialize() error { @@ -38,51 +39,21 @@ func (widget *releasesWidget) initialize() error { widget.CollapseAfter = 5 } - for _, repository := range widget.Repositories { - parts := strings.SplitN(repository, ":", 2) - var request *releaseRequest - if len(parts) == 1 { - request = &releaseRequest{ - source: releaseSourceGithub, - repository: repository, - } + for i := range widget.Repositories { + r := widget.Repositories[i] - if widget.Token != "" { - request.token = &widget.Token - } - } else if len(parts) == 2 { - if parts[0] == string(releaseSourceGitlab) { - request = &releaseRequest{ - source: releaseSourceGitlab, - repository: parts[1], - } - - if widget.GitLabToken != "" { - request.token = &widget.GitLabToken - } - } else if parts[0] == string(releaseSourceDockerHub) { - request = &releaseRequest{ - source: releaseSourceDockerHub, - repository: parts[1], - } - } else if parts[0] == string(releaseSourceCodeberg) { - request = &releaseRequest{ - source: releaseSourceCodeberg, - repository: parts[1], - } - } else { - return errors.New("invalid repository source " + parts[0]) - } + if r.source == releaseSourceGithub && widget.Token != "" { + r.token = &widget.Token + } else if r.source == releaseSourceGitlab && widget.GitLabToken != "" { + r.token = &widget.GitLabToken } - - widget.releaseRequests = append(widget.releaseRequests, request) } return nil } func (widget *releasesWidget) update(ctx context.Context) { - releases, err := fetchLatestReleases(widget.releaseRequests) + releases, err := fetchLatestReleases(widget.Repositories) if !widget.canContinueUpdateAfterHandlingErr(err) { return @@ -133,9 +104,53 @@ func (r appReleaseList) sortByNewest() appReleaseList { } type releaseRequest struct { - source releaseSource - repository string - token *string + IncludePreleases bool `yaml:"include-prereleases"` + Repository string `yaml:"repository"` + + source releaseSource + token *string +} + +func (r *releaseRequest) UnmarshalYAML(node *yaml.Node) error { + type releaseRequestAlias releaseRequest + alias := (*releaseRequestAlias)(r) + var repository string + + if err := node.Decode(&repository); err != nil { + if err := node.Decode(alias); err != nil { + return fmt.Errorf("could not umarshal repository into string or struct: %v", err) + } + } + + if r.Repository == "" { + if repository == "" { + return errors.New("repository is required") + } else { + r.Repository = repository + } + } + + parts := strings.SplitN(repository, ":", 2) + if len(parts) == 1 { + r.source = releaseSourceGithub + } else if len(parts) == 2 { + r.Repository = parts[1] + + switch parts[0] { + case string(releaseSourceGithub): + r.source = releaseSourceGithub + case string(releaseSourceGitlab): + r.source = releaseSourceGitlab + case string(releaseSourceDockerHub): + r.source = releaseSourceDockerHub + case string(releaseSourceCodeberg): + r.source = releaseSourceCodeberg + default: + return errors.New("invalid source") + } + } + + return nil } func fetchLatestReleases(requests []*releaseRequest) (appReleaseList, error) { @@ -152,7 +167,7 @@ func fetchLatestReleases(requests []*releaseRequest) (appReleaseList, error) { for i := range results { if errs[i] != nil { failed++ - slog.Error("Failed to fetch release", "source", requests[i].source, "repository", requests[i].repository, "error", errs[i]) + slog.Error("Failed to fetch release", "source", requests[i].source, "repository", requests[i].Repository, "error", errs[i]) continue } @@ -187,7 +202,7 @@ func fetchLatestReleaseTask(request *releaseRequest) (*appRelease, error) { return nil, errors.New("unsupported source") } -type githubReleaseLatestResponseJson struct { +type githubReleaseResponseJson struct { TagName string `json:"tag_name"` PublishedAt string `json:"published_at"` HtmlUrl string `json:"html_url"` @@ -197,12 +212,17 @@ type githubReleaseLatestResponseJson struct { } func fetchLatestGithubRelease(request *releaseRequest) (*appRelease, error) { - httpRequest, err := http.NewRequest( - "GET", - fmt.Sprintf("https://api.github.com/repos/%s/releases/latest", request.repository), - nil, - ) + var requestURL string + if !request.IncludePreleases { + requestURL = fmt.Sprintf("https://api.github.com/repos/%s/releases/latest", request.Repository) + } else { + requestURL = fmt.Sprintf("https://api.github.com/repos/%s/releases", request.Repository) + } + + fmt.Println(requestURL) + + httpRequest, err := http.NewRequest("GET", requestURL, nil) if err != nil { return nil, err } @@ -211,14 +231,29 @@ func fetchLatestGithubRelease(request *releaseRequest) (*appRelease, error) { httpRequest.Header.Add("Authorization", "Bearer "+(*request.token)) } - response, err := decodeJsonFromRequest[githubReleaseLatestResponseJson](defaultHTTPClient, httpRequest) - if err != nil { - return nil, err + var response githubReleaseResponseJson + + if !request.IncludePreleases { + response, err = decodeJsonFromRequest[githubReleaseResponseJson](defaultHTTPClient, httpRequest) + if err != nil { + return nil, err + } + } else { + responses, err := decodeJsonFromRequest[[]githubReleaseResponseJson](defaultHTTPClient, httpRequest) + if err != nil { + return nil, err + } + + if len(responses) == 0 { + return nil, fmt.Errorf("no releases found for repository %s", request.Repository) + } + + response = responses[0] } return &appRelease{ Source: releaseSourceGithub, - Name: request.repository, + Name: request.Repository, Version: normalizeVersionFormat(response.TagName), NotesUrl: response.HtmlUrl, TimeReleased: parseRFC3339Time(response.PublishedAt), @@ -242,10 +277,10 @@ const dockerHubSpecificTagURLFormat = "https://hub.docker.com/v2/namespaces/%s/r func fetchLatestDockerHubRelease(request *releaseRequest) (*appRelease, error) { - nameParts := strings.Split(request.repository, "/") + nameParts := strings.Split(request.Repository, "/") if len(nameParts) > 2 { - return nil, fmt.Errorf("invalid repository name: %s", request.repository) + return nil, fmt.Errorf("invalid repository name: %s", request.Repository) } else if len(nameParts) == 1 { nameParts = []string{"library", nameParts[0]} } @@ -278,7 +313,7 @@ func fetchLatestDockerHubRelease(request *releaseRequest) (*appRelease, error) { } if len(response.Results) == 0 { - return nil, fmt.Errorf("no tags found for repository: %s", request.repository) + return nil, fmt.Errorf("no tags found for repository: %s", request.Repository) } tag = &response.Results[0] @@ -331,7 +366,7 @@ func fetchLatestGitLabRelease(request *releaseRequest) (*appRelease, error) { "GET", fmt.Sprintf( "https://gitlab.com/api/v4/projects/%s/releases/permalink/latest", - url.QueryEscape(request.repository), + url.QueryEscape(request.Repository), ), nil, ) @@ -350,7 +385,7 @@ func fetchLatestGitLabRelease(request *releaseRequest) (*appRelease, error) { return &appRelease{ Source: releaseSourceGitlab, - Name: request.repository, + Name: request.Repository, Version: normalizeVersionFormat(response.TagName), NotesUrl: response.Links.Self, TimeReleased: parseRFC3339Time(response.ReleasedAt), @@ -368,7 +403,7 @@ func fetchLatestCodebergRelease(request *releaseRequest) (*appRelease, error) { "GET", fmt.Sprintf( "https://codeberg.org/api/v1/repos/%s/releases/latest", - request.repository, + request.Repository, ), nil, ) @@ -383,7 +418,7 @@ func fetchLatestCodebergRelease(request *releaseRequest) (*appRelease, error) { return &appRelease{ Source: releaseSourceCodeberg, - Name: request.repository, + Name: request.Repository, Version: normalizeVersionFormat(response.TagName), NotesUrl: response.HtmlUrl, TimeReleased: parseRFC3339Time(response.PublishedAt), diff --git a/internal/widget/releases.go b/internal/widget/releases.go deleted file mode 100644 index 46aa21a..0000000 --- a/internal/widget/releases.go +++ /dev/null @@ -1,105 +0,0 @@ -package widget - -import ( - "context" - "errors" - "html/template" - "strings" - "time" - - "github.com/glanceapp/glance/internal/assets" - "github.com/glanceapp/glance/internal/feed" -) - -type Releases struct { - widgetBase `yaml:",inline"` - Releases feed.AppReleases `yaml:"-"` - releaseRequests []*feed.ReleaseRequest `yaml:"-"` - Repositories []string `yaml:"repositories"` - Token OptionalEnvString `yaml:"token"` - GitLabToken OptionalEnvString `yaml:"gitlab-token"` - Limit int `yaml:"limit"` - CollapseAfter int `yaml:"collapse-after"` - ShowSourceIcon bool `yaml:"show-source-icon"` - IncludeGithubPreReleases bool `yaml:"include-github-prereleases"` -} - -func (widget *Releases) Initialize() error { - widget.withTitle("Releases").withCacheDuration(2 * time.Hour) - - if widget.Limit <= 0 { - widget.Limit = 10 - } - - if widget.CollapseAfter == 0 || widget.CollapseAfter < -1 { - widget.CollapseAfter = 5 - } - - var tokenAsString = widget.Token.String() - var gitLabTokenAsString = widget.GitLabToken.String() - - for _, repository := range widget.Repositories { - parts := strings.SplitN(repository, ":", 2) - var request *feed.ReleaseRequest - if len(parts) == 1 { - request = &feed.ReleaseRequest{ - Source: feed.ReleaseSourceGithub, - Repository: repository, - IncludeGithubPreReleases: widget.IncludeGithubPreReleases, - } - - if widget.Token != "" { - request.Token = &tokenAsString - } - } else if len(parts) == 2 { - if parts[0] == string(feed.ReleaseSourceGitlab) { - request = &feed.ReleaseRequest{ - Source: feed.ReleaseSourceGitlab, - Repository: parts[1], - } - - if widget.GitLabToken != "" { - request.Token = &gitLabTokenAsString - } - } else if parts[0] == string(feed.ReleaseSourceDockerHub) { - request = &feed.ReleaseRequest{ - Source: feed.ReleaseSourceDockerHub, - Repository: parts[1], - } - } else if parts[0] == string(feed.ReleaseSourceCodeberg) { - request = &feed.ReleaseRequest{ - Source: feed.ReleaseSourceCodeberg, - Repository: parts[1], - } - } else { - return errors.New("invalid repository source " + parts[0]) - } - } - - widget.releaseRequests = append(widget.releaseRequests, request) - } - - return nil -} - -func (widget *Releases) Update(ctx context.Context) { - releases, err := feed.FetchLatestReleases(widget.releaseRequests) - - if !widget.canContinueUpdateAfterHandlingErr(err) { - return - } - - if len(releases) > widget.Limit { - releases = releases[:widget.Limit] - } - - for i := range releases { - releases[i].SourceIconURL = widget.Providers.AssetResolver("icons/" + string(releases[i].Source) + ".svg") - } - - widget.Releases = releases -} - -func (widget *Releases) Render() template.HTML { - return widget.render(widget, assets.ReleasesTemplate) -} From 8a75f303bb71a8639f5c1c7cb38cb264618d91cd Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Fri, 17 Jan 2025 20:16:55 +0000 Subject: [PATCH 6/6] Remove extra whitespace --- docs/configuration.md | 2 -- internal/glance/widget-releases.go | 3 --- 2 files changed, 5 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 7123692..cc24f56 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1344,8 +1344,6 @@ repositories: - codeberg:redict/redict ``` - - ##### `show-source-icon` Shows an icon of the source (GitHub/GitLab/Codeberg/Docker Hub) next to the repository name when set to `true`. diff --git a/internal/glance/widget-releases.go b/internal/glance/widget-releases.go index 0f1e2d9..92ac003 100644 --- a/internal/glance/widget-releases.go +++ b/internal/glance/widget-releases.go @@ -213,7 +213,6 @@ type githubReleaseResponseJson struct { func fetchLatestGithubRelease(request *releaseRequest) (*appRelease, error) { var requestURL string - if !request.IncludePreleases { requestURL = fmt.Sprintf("https://api.github.com/repos/%s/releases/latest", request.Repository) } else { @@ -276,7 +275,6 @@ const dockerHubTagsURLFormat = "https://hub.docker.com/v2/namespaces/%s/reposito const dockerHubSpecificTagURLFormat = "https://hub.docker.com/v2/namespaces/%s/repositories/%s/tags/%s" func fetchLatestDockerHubRelease(request *releaseRequest) (*appRelease, error) { - nameParts := strings.Split(request.Repository, "/") if len(nameParts) > 2 { @@ -286,7 +284,6 @@ func fetchLatestDockerHubRelease(request *releaseRequest) (*appRelease, error) { } tagParts := strings.SplitN(nameParts[1], ":", 2) - var requestURL string if len(tagParts) == 2 {