diff --git a/internal/assets/static/main.css b/internal/assets/static/main.css index 62b4480..ccad001 100644 --- a/internal/assets/static/main.css +++ b/internal/assets/static/main.css @@ -731,6 +731,7 @@ kbd:active { height: 6rem; font: inherit; outline: none; + color: var(--color-text-highlight); } .search-input::placeholder { diff --git a/internal/feed/github.go b/internal/feed/github.go index 43a2459..4d7dc73 100644 --- a/internal/feed/github.go +++ b/internal/feed/github.go @@ -8,12 +8,10 @@ import ( "time" ) -type githubReleaseResponseJson struct { +type githubReleaseLatestResponseJson struct { TagName string `json:"tag_name"` PublishedAt string `json:"published_at"` HtmlUrl string `json:"html_url"` - Draft bool `json:"draft"` - PreRelease bool `json:"prerelease"` Reactions struct { Downvotes int `json:"-1"` } `json:"reactions"` @@ -39,7 +37,7 @@ func FetchLatestReleasesFromGithub(repositories []string, token string) (AppRele requests := make([]*http.Request, len(repositories)) for i, repository := range repositories { - request, _ := http.NewRequest("GET", fmt.Sprintf("https://api.github.com/repos/%s/releases?per_page=10", repository), nil) + request, _ := http.NewRequest("GET", fmt.Sprintf("https://api.github.com/repos/%s/releases/latest", repository), nil) if token != "" { request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) @@ -48,7 +46,7 @@ func FetchLatestReleasesFromGithub(repositories []string, token string) (AppRele requests[i] = request } - task := decodeJsonFromRequestTask[[]githubReleaseResponseJson](defaultClient) + task := decodeJsonFromRequestTask[githubReleaseLatestResponseJson](defaultClient) job := newJob(task, requests).withWorkers(15) responses, errs, err := workerPoolDo(job) @@ -65,24 +63,7 @@ func FetchLatestReleasesFromGithub(repositories []string, token string) (AppRele continue } - releases := responses[i] - - if len(releases) < 1 { - failed++ - slog.Error("No releases found", "repository", repositories[i], "url", requests[i].URL) - continue - } - - var liveRelease *githubReleaseResponseJson - - for i := range releases { - release := &releases[i] - - if !release.Draft && !release.PreRelease { - liveRelease = release - break - } - } + liveRelease := &responses[i] if liveRelease == nil { slog.Error("No live release found", "repository", repositories[i], "url", requests[i].URL) diff --git a/internal/feed/rss.go b/internal/feed/rss.go index 4d22af6..74f064b 100644 --- a/internal/feed/rss.go +++ b/internal/feed/rss.go @@ -12,6 +12,7 @@ import ( "time" "github.com/mmcdole/gofeed" + gofeedext "github.com/mmcdole/gofeed/extensions" ) type RSSFeedItem struct { @@ -145,6 +146,8 @@ func getItemsFromRSSFeedTask(request RSSFeedRequest) ([]RSSFeedItem, error) { if item.Image != nil { rssItem.ImageURL = item.Image.URL + } else if url := findThumbnailInItemExtensions(item); url != "" { + rssItem.ImageURL = url } else if feed.Image != nil { rssItem.ImageURL = feed.Image.URL } @@ -161,6 +164,36 @@ func getItemsFromRSSFeedTask(request RSSFeedRequest) ([]RSSFeedItem, error) { return items, nil } +func recursiveFindThumbnailInExtensions(extensions map[string][]gofeedext.Extension) string { + for _, exts := range extensions { + for _, ext := range exts { + if ext.Name == "thumbnail" || ext.Name == "image" { + if url, ok := ext.Attrs["url"]; ok { + return url + } + } + + if ext.Children != nil { + if url := recursiveFindThumbnailInExtensions(ext.Children); url != "" { + return url + } + } + } + } + + return "" +} + +func findThumbnailInItemExtensions(item *gofeed.Item) string { + media, ok := item.Extensions["media"] + + if !ok { + return "" + } + + return recursiveFindThumbnailInExtensions(media) +} + func GetItemsFromRSSFeeds(requests []RSSFeedRequest) (RSSFeedItems, error) { job := newJob(getItemsFromRSSFeedTask, requests).withWorkers(10) feeds, errs, err := workerPoolDo(job)