diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-04-27 21:20:10 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-04-27 21:20:10 +0900 |
| commit | cb00405041ee4714b6e817e9570cfa10ae972840 (patch) | |
| tree | ff98728b3e5e099eb9ac5556eeb407c68e0fc208 /backend/feed/feed.go | |
| parent | 938863425bf8ad6c17e43b3da128f92cf6d6ab63 (diff) | |
| download | feedaka-cb00405041ee4714b6e817e9570cfa10ae972840.tar.gz feedaka-cb00405041ee4714b6e817e9570cfa10ae972840.tar.zst feedaka-cb00405041ee4714b6e817e9570cfa10ae972840.zip | |
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.
Diffstat (limited to 'backend/feed/feed.go')
| -rw-r--r-- | backend/feed/feed.go | 19 |
1 files changed, 12 insertions, 7 deletions
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 } |
