checker.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package icon // import "miniflux.app/v2/internal/reader/icon"
  4. import (
  5. "log/slog"
  6. "miniflux.app/v2/internal/config"
  7. "miniflux.app/v2/internal/model"
  8. "miniflux.app/v2/internal/reader/fetcher"
  9. "miniflux.app/v2/internal/storage"
  10. )
  11. type IconChecker struct {
  12. store *storage.Storage
  13. feed *model.Feed
  14. }
  15. func NewIconChecker(store *storage.Storage, feed *model.Feed) *IconChecker {
  16. return &IconChecker{
  17. store: store,
  18. feed: feed,
  19. }
  20. }
  21. func (c *IconChecker) fetchAndStoreIcon() {
  22. requestBuilder := fetcher.NewRequestBuilder()
  23. requestBuilder.WithUserAgent(c.feed.UserAgent, config.Opts.HTTPClientUserAgent())
  24. requestBuilder.WithCookie(c.feed.Cookie)
  25. requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
  26. requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
  27. requestBuilder.UseProxy(c.feed.FetchViaProxy)
  28. requestBuilder.IgnoreTLSErrors(c.feed.AllowSelfSignedCertificates)
  29. requestBuilder.DisableHTTP2(c.feed.DisableHTTP2)
  30. iconFinder := NewIconFinder(requestBuilder, c.feed.FeedURL, c.feed.IconURL)
  31. if icon, err := iconFinder.FindIcon(); err != nil {
  32. slog.Debug("Unable to find feed icon",
  33. slog.Int64("feed_id", c.feed.ID),
  34. slog.String("website_url", c.feed.FeedURL),
  35. slog.String("feed_icon_url", c.feed.IconURL),
  36. slog.Any("error", err),
  37. )
  38. } else if icon == nil {
  39. slog.Debug("No icon found",
  40. slog.Int64("feed_id", c.feed.ID),
  41. slog.String("website_url", c.feed.FeedURL),
  42. slog.String("feed_icon_url", c.feed.IconURL),
  43. )
  44. } else {
  45. if err := c.store.StoreFeedIcon(c.feed.ID, icon); err != nil {
  46. slog.Error("Unable to store feed icon",
  47. slog.Int64("feed_id", c.feed.ID),
  48. slog.String("website_url", c.feed.FeedURL),
  49. slog.String("feed_icon_url", c.feed.IconURL),
  50. slog.Any("error", err),
  51. )
  52. } else {
  53. slog.Debug("Feed icon stored",
  54. slog.Int64("feed_id", c.feed.ID),
  55. slog.String("website_url", c.feed.FeedURL),
  56. slog.String("feed_icon_url", c.feed.IconURL),
  57. slog.Int64("icon_id", icon.ID),
  58. slog.String("icon_hash", icon.Hash),
  59. )
  60. }
  61. }
  62. }
  63. func (c *IconChecker) CreateFeedIconIfMissing() {
  64. if c.store.HasFeedIcon(c.feed.ID) {
  65. slog.Debug("Feed icon already exists",
  66. slog.Int64("feed_id", c.feed.ID),
  67. )
  68. return
  69. }
  70. c.fetchAndStoreIcon()
  71. }
  72. func (c *IconChecker) UpdateOrCreateFeedIcon() {
  73. c.fetchAndStoreIcon()
  74. }