// 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/proxyrotator" "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) UpdateOrCreateFeedIcon() { requestBuilder := fetcher.NewRequestBuilder(). WithUserAgent(c.feed.UserAgent, config.Opts.HTTPClientUserAgent()). WithCookie(c.feed.Cookie). WithTimeout(config.Opts.HTTPClientTimeout()). WithProxyRotator(proxyrotator.ProxyRotatorInstance). WithCustomFeedProxyURL(c.feed.ProxyURL). WithCustomApplicationProxyURL(config.Opts.HTTPClientProxyURL()). UseCustomApplicationProxyURL(c.feed.FetchViaProxy). IgnoreTLSErrors(c.feed.AllowSelfSignedCertificates). DisableHTTP2(c.feed.DisableHTTP2) iconFinder := newIconFinder(requestBuilder, c.feed.SiteURL, 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.SiteURL), 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.SiteURL), 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.SiteURL), 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.SiteURL), 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.UpdateOrCreateFeedIcon() }