checker.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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/proxyrotator"
  9. "miniflux.app/v2/internal/reader/fetcher"
  10. "miniflux.app/v2/internal/storage"
  11. )
  12. type iconChecker struct {
  13. store *storage.Storage
  14. feed *model.Feed
  15. }
  16. func NewIconChecker(store *storage.Storage, feed *model.Feed) *iconChecker {
  17. return &iconChecker{
  18. store: store,
  19. feed: feed,
  20. }
  21. }
  22. func (c *iconChecker) fetchAndStoreIcon() {
  23. requestBuilder := fetcher.NewRequestBuilder()
  24. requestBuilder.WithUserAgent(c.feed.UserAgent, config.Opts.HTTPClientUserAgent())
  25. requestBuilder.WithCookie(c.feed.Cookie)
  26. requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
  27. requestBuilder.WithProxyRotator(proxyrotator.ProxyRotatorInstance)
  28. requestBuilder.WithCustomFeedProxyURL(c.feed.ProxyURL)
  29. requestBuilder.WithCustomApplicationProxyURL(config.Opts.HTTPClientProxyURL())
  30. requestBuilder.UseCustomApplicationProxyURL(c.feed.FetchViaProxy)
  31. requestBuilder.IgnoreTLSErrors(c.feed.AllowSelfSignedCertificates)
  32. requestBuilder.DisableHTTP2(c.feed.DisableHTTP2)
  33. iconFinder := newIconFinder(requestBuilder, c.feed.SiteURL, c.feed.IconURL)
  34. if icon, err := iconFinder.findIcon(); err != nil {
  35. slog.Debug("Unable to find feed icon",
  36. slog.Int64("feed_id", c.feed.ID),
  37. slog.String("website_url", c.feed.SiteURL),
  38. slog.String("feed_icon_url", c.feed.IconURL),
  39. slog.Any("error", err),
  40. )
  41. } else if icon == nil {
  42. slog.Debug("No icon found",
  43. slog.Int64("feed_id", c.feed.ID),
  44. slog.String("website_url", c.feed.SiteURL),
  45. slog.String("feed_icon_url", c.feed.IconURL),
  46. )
  47. } else {
  48. if err := c.store.StoreFeedIcon(c.feed.ID, icon); err != nil {
  49. slog.Error("Unable to store feed icon",
  50. slog.Int64("feed_id", c.feed.ID),
  51. slog.String("website_url", c.feed.SiteURL),
  52. slog.String("feed_icon_url", c.feed.IconURL),
  53. slog.Any("error", err),
  54. )
  55. } else {
  56. slog.Debug("Feed icon stored",
  57. slog.Int64("feed_id", c.feed.ID),
  58. slog.String("website_url", c.feed.SiteURL),
  59. slog.String("feed_icon_url", c.feed.IconURL),
  60. slog.Int64("icon_id", icon.ID),
  61. slog.String("icon_hash", icon.Hash),
  62. )
  63. }
  64. }
  65. }
  66. func (c *iconChecker) CreateFeedIconIfMissing() {
  67. if c.store.HasFeedIcon(c.feed.ID) {
  68. slog.Debug("Feed icon already exists",
  69. slog.Int64("feed_id", c.feed.ID),
  70. )
  71. return
  72. }
  73. c.fetchAndStoreIcon()
  74. }
  75. func (c *iconChecker) UpdateOrCreateFeedIcon() {
  76. c.fetchAndStoreIcon()
  77. }