aboutsummaryrefslogtreecommitdiffhomepage
path: root/backend/feed
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-04-27 21:20:10 +0900
committernsfisis <nsfisis@gmail.com>2026-04-27 21:20:10 +0900
commitcb00405041ee4714b6e817e9570cfa10ae972840 (patch)
treeff98728b3e5e099eb9ac5556eeb407c68e0fc208 /backend/feed
parent938863425bf8ad6c17e43b3da128f92cf6d6ab63 (diff)
downloadfeedaka-cb00405041ee4714b6e817e9570cfa10ae972840.tar.gz
feedaka-cb00405041ee4714b6e817e9570cfa10ae972840.tar.zst
feedaka-cb00405041ee4714b6e817e9570cfa10ae972840.zip
feat(backend): adapt feed fetch interval to update frequencyHEADmain
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')
-rw-r--r--backend/feed/feed.go19
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
}