diff options
author | 2024-10-04 19:50:54 -0700 | |
---|---|---|
committer | 2024-10-04 20:51:40 -0700 | |
commit | f16735fd6dfdd9dbfb1d7cd7b41edd0ba4183bbd (patch) | |
tree | 84dc548ee32215916a68ec3d2b5946965e1848c0 /internal/reader/icon/checker.go | |
parent | 562a7b79a57bc9f3b25225486084fcb9da84b7d2 (diff) | |
download | v2-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.go | 84 |
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() +} |