aboutsummaryrefslogtreecommitdiff
path: root/internal/reader/handler/handler.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <f@miniflux.net> 2024-10-04 19:50:54 -0700
committerGravatar Frédéric Guillot <f@miniflux.net> 2024-10-04 20:51:40 -0700
commitf16735fd6dfdd9dbfb1d7cd7b41edd0ba4183bbd (patch)
tree84dc548ee32215916a68ec3d2b5946965e1848c0 /internal/reader/handler/handler.go
parent562a7b79a57bc9f3b25225486084fcb9da84b7d2 (diff)
downloadv2-f16735fd6dfdd9dbfb1d7cd7b41edd0ba4183bbd.tar.gz
v2-f16735fd6dfdd9dbfb1d7cd7b41edd0ba4183bbd.tar.zst
v2-f16735fd6dfdd9dbfb1d7cd7b41edd0ba4183bbd.zip
feat: update feed icon during force refresh
Diffstat (limited to 'internal/reader/handler/handler.go')
-rw-r--r--internal/reader/handler/handler.go64
1 files changed, 14 insertions, 50 deletions
diff --git a/internal/reader/handler/handler.go b/internal/reader/handler/handler.go
index 04275598..aa9d9704 100644
--- a/internal/reader/handler/handler.go
+++ b/internal/reader/handler/handler.go
@@ -93,13 +93,7 @@ func CreateFeedFromSubscriptionDiscovery(store *storage.Storage, userID int64, f
requestBuilder.IgnoreTLSErrors(feedCreationRequest.AllowSelfSignedCertificates)
requestBuilder.DisableHTTP2(feedCreationRequest.DisableHTTP2)
- checkFeedIcon(
- store,
- requestBuilder,
- subscription.ID,
- subscription.SiteURL,
- subscription.IconURL,
- )
+ icon.NewIconChecker(store, subscription).UpdateOrCreateFeedIcon()
return subscription, nil
}
@@ -188,13 +182,8 @@ func CreateFeed(store *storage.Storage, userID int64, feedCreationRequest *model
slog.String("feed_url", subscription.FeedURL),
)
- checkFeedIcon(
- store,
- requestBuilder,
- subscription.ID,
- subscription.SiteURL,
- subscription.IconURL,
- )
+ icon.NewIconChecker(store, subscription).UpdateOrCreateFeedIcon()
+
return subscription, nil
}
@@ -270,6 +259,8 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool
slog.Debug("Feed modified",
slog.Int64("user_id", userID),
slog.Int64("feed_id", feedID),
+ slog.String("etag_header", originalFeed.EtagHeader),
+ slog.String("last_modified_header", originalFeed.LastModifiedHeader),
)
responseBody, localizedError := responseHandler.ReadBody(config.Opts.HTTPClientMaxBodySize())
@@ -293,8 +284,10 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool
// If the feed has a TTL defined, we use it to make sure we don't check it too often.
newTTL = updatedFeed.TTL
+
// Set the next check at with updated arguments.
originalFeed.ScheduleNextCheck(weeklyEntryCount, newTTL)
+
slog.Debug("Updated next check date",
slog.Int64("user_id", userID),
slog.Int64("feed_id", feedID),
@@ -329,18 +322,18 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool
originalFeed.EtagHeader = responseHandler.ETag()
originalFeed.LastModifiedHeader = responseHandler.LastModified()
- checkFeedIcon(
- store,
- requestBuilder,
- originalFeed.ID,
- originalFeed.SiteURL,
- updatedFeed.IconURL,
- )
+ iconChecker := icon.NewIconChecker(store, originalFeed)
+ if forceRefresh {
+ iconChecker.UpdateOrCreateFeedIcon()
+ } else {
+ iconChecker.CreateFeedIconIfMissing()
+ }
} else {
slog.Debug("Feed not modified",
slog.Int64("user_id", userID),
slog.Int64("feed_id", feedID),
)
+
// Last-Modified may be updated even if ETag is not. In this case, per
// RFC9111 sections 3.2 and 4.3.4, the stored response must be updated.
if responseHandler.LastModified() != "" {
@@ -359,32 +352,3 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool
return nil
}
-
-func checkFeedIcon(store *storage.Storage, requestBuilder *fetcher.RequestBuilder, feedID int64, websiteURL, feedIconURL string) {
- if !store.HasIcon(feedID) {
- iconFinder := icon.NewIconFinder(requestBuilder, websiteURL, feedIconURL)
- if icon, err := iconFinder.FindIcon(); err != nil {
- slog.Debug("Unable to find feed icon",
- slog.Int64("feed_id", feedID),
- slog.String("website_url", websiteURL),
- slog.String("feed_icon_url", feedIconURL),
- slog.Any("error", err),
- )
- } else if icon == nil {
- slog.Debug("No icon found",
- slog.Int64("feed_id", feedID),
- slog.String("website_url", websiteURL),
- slog.String("feed_icon_url", feedIconURL),
- )
- } else {
- if err := store.CreateFeedIcon(feedID, icon); err != nil {
- slog.Error("Unable to store feed icon",
- slog.Int64("feed_id", feedID),
- slog.String("website_url", websiteURL),
- slog.String("feed_icon_url", feedIconURL),
- slog.Any("error", err),
- )
- }
- }
- }
-}