mirror of
https://github.com/miniflux/v2.git
synced 2025-06-27 16:36:00 +00:00
84 lines
2.4 KiB
Go
84 lines
2.4 KiB
Go
// 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.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.fetchAndStoreIcon()
|
|
}
|
|
|
|
func (c *IconChecker) UpdateOrCreateFeedIcon() {
|
|
c.fetchAndStoreIcon()
|
|
}
|