aboutsummaryrefslogtreecommitdiff
path: root/internal/reader/icon/checker.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <f@miniflux.net> 2024-10-04 19:50:54 -0700
committerGravatar Frédéric Guillot <f@miniflux.net> 2024-10-04 20:51:40 -0700
commitf16735fd6dfdd9dbfb1d7cd7b41edd0ba4183bbd (patch)
tree84dc548ee32215916a68ec3d2b5946965e1848c0 /internal/reader/icon/checker.go
parent562a7b79a57bc9f3b25225486084fcb9da84b7d2 (diff)
downloadv2-f16735fd6dfdd9dbfb1d7cd7b41edd0ba4183bbd.tar.gz
v2-f16735fd6dfdd9dbfb1d7cd7b41edd0ba4183bbd.tar.zst
v2-f16735fd6dfdd9dbfb1d7cd7b41edd0ba4183bbd.zip
feat: update feed icon during force refresh
Diffstat (limited to 'internal/reader/icon/checker.go')
-rw-r--r--internal/reader/icon/checker.go84
1 files changed, 84 insertions, 0 deletions
diff --git a/internal/reader/icon/checker.go b/internal/reader/icon/checker.go
new file mode 100644
index 00000000..4ec63635
--- /dev/null
+++ b/internal/reader/icon/checker.go
@@ -0,0 +1,84 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+package icon // import "miniflux.app/v2/internal/reader/icon"
+
+import (
+ "log/slog"
+
+ "miniflux.app/v2/internal/config"
+ "miniflux.app/v2/internal/model"
+ "miniflux.app/v2/internal/reader/fetcher"
+ "miniflux.app/v2/internal/storage"
+)
+
+type IconChecker struct {
+ store *storage.Storage
+ feed *model.Feed
+}
+
+func NewIconChecker(store *storage.Storage, feed *model.Feed) *IconChecker {
+ return &IconChecker{
+ store: store,
+ feed: feed,
+ }
+}
+
+func (c *IconChecker) fetchAndStoreIcon() {
+ requestBuilder := fetcher.NewRequestBuilder()
+ requestBuilder.WithUserAgent(c.feed.UserAgent, config.Opts.HTTPClientUserAgent())
+ requestBuilder.WithCookie(c.feed.Cookie)
+ requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+ requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+ requestBuilder.UseProxy(c.feed.FetchViaProxy)
+ requestBuilder.IgnoreTLSErrors(c.feed.AllowSelfSignedCertificates)
+ requestBuilder.DisableHTTP2(c.feed.DisableHTTP2)
+
+ iconFinder := NewIconFinder(requestBuilder, c.feed.FeedURL, c.feed.IconURL)
+ if icon, err := iconFinder.FindIcon(); err != nil {
+ slog.Debug("Unable to find feed icon",
+ slog.Int64("feed_id", c.feed.ID),
+ slog.String("website_url", c.feed.FeedURL),
+ slog.String("feed_icon_url", c.feed.IconURL),
+ slog.Any("error", err),
+ )
+ } else if icon == nil {
+ slog.Debug("No icon found",
+ slog.Int64("feed_id", c.feed.ID),
+ slog.String("website_url", c.feed.FeedURL),
+ slog.String("feed_icon_url", c.feed.IconURL),
+ )
+ } else {
+ if err := c.store.StoreFeedIcon(c.feed.ID, icon); err != nil {
+ slog.Error("Unable to store feed icon",
+ slog.Int64("feed_id", c.feed.ID),
+ slog.String("website_url", c.feed.FeedURL),
+ slog.String("feed_icon_url", c.feed.IconURL),
+ slog.Any("error", err),
+ )
+ } else {
+ slog.Debug("Feed icon stored",
+ slog.Int64("feed_id", c.feed.ID),
+ slog.String("website_url", c.feed.FeedURL),
+ slog.String("feed_icon_url", c.feed.IconURL),
+ slog.Int64("icon_id", icon.ID),
+ slog.String("icon_hash", icon.Hash),
+ )
+ }
+ }
+}
+
+func (c *IconChecker) CreateFeedIconIfMissing() {
+ if c.store.HasFeedIcon(c.feed.ID) {
+ slog.Debug("Feed icon already exists",
+ slog.Int64("feed_id", c.feed.ID),
+ )
+ return
+ }
+
+ c.fetchAndStoreIcon()
+}
+
+func (c *IconChecker) UpdateOrCreateFeedIcon() {
+ c.fetchAndStoreIcon()
+}