From cb00405041ee4714b6e817e9570cfa10ae972840 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Mon, 27 Apr 2026 21:20:10 +0900 Subject: feat(backend): adapt feed fetch interval to update frequency Add per-feed fetch_interval_seconds (clamped to [1h, 24h]) that halves on new articles and grows 1.5x when a fetch yields nothing, replacing the fixed 1h schedule with the 10min cooldown filter. Scheduler tick shortened to 30min so the 1h floor is honored with reasonable precision. --- backend/feed/feed.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'backend/feed') diff --git a/backend/feed/feed.go b/backend/feed/feed.go index 2d84798..e37a883 100644 --- a/backend/feed/feed.go +++ b/backend/feed/feed.go @@ -76,25 +76,29 @@ func discoverFeedURL(ctx context.Context, rawURL string) (string, error) { return feedURL, nil } -func Sync(ctx context.Context, queries *db.Queries, feedID int64, f *gofeed.Feed) error { +// Sync upserts the parsed feed's items into the database and returns the +// number of newly inserted articles. The caller uses that count to drive the +// adaptive fetch interval. +func Sync(ctx context.Context, queries *db.Queries, feedID int64, f *gofeed.Feed) (int, error) { err := queries.UpdateFeedMetadata(ctx, db.UpdateFeedMetadataParams{ Title: f.Title, FetchedAt: time.Now().UTC().Format(time.RFC3339), ID: feedID, }) if err != nil { - return err + return 0, err } guids, err := queries.GetArticleGUIDsByFeed(ctx, feedID) if err != nil { - return err + return 0, err } existingFeedGUIDs := make(map[string]bool, len(guids)) for _, guid := range guids { existingFeedGUIDs[guid] = true } + newCount := 0 for _, item := range f.Items { if existingFeedGUIDs[item.GUID] { err := queries.UpdateArticle(ctx, db.UpdateArticleParams{ @@ -104,12 +108,12 @@ func Sync(ctx context.Context, queries *db.Queries, feedID int64, f *gofeed.Feed Guid: item.GUID, }) if err != nil { - return err + return newCount, err } } else { exists, err := queries.CheckArticleExistsByGUID(ctx, item.GUID) if err != nil { - return err + return newCount, err } if exists == 1 { continue @@ -122,9 +126,10 @@ func Sync(ctx context.Context, queries *db.Queries, feedID int64, f *gofeed.Feed IsRead: 0, }) if err != nil { - return err + return newCount, err } + newCount++ } } - return nil + return newCount, nil } -- cgit v1.3.1