Commit graph

2 commits

Author SHA1 Message Date
Charles Kelsoe
8f078f8248 Feature: Substack archive backfill (load older than the RSS window)
A 'Load older' control in the import window pages back through a Substack
publication's archive (/api/v1/archive?offset=) beyond the ~20-item RSS window,
fetching each older post's body on demand (/api/v1/posts/<slug>). ListItemsOptions
gains an offset; offset 0 keeps the inline-body RSS path. Generic RSS feeds expose
only their recent window, so the control is Substack-only. Defensive JSON parsing;
selection preserved across paged loads. +20 tests.
2026-06-14 17:18:56 -04:00
Charles Kelsoe
19e47bd9ad Wave C: feed sources (generic + substack) and shared mapping
- source-common: fetchAndParseFeed, mapRawItemToFeedItem (the shared
  RawFeedItem to FeedItem mapping), buildResolvedFeed, applyLimit, FeedFetchError
- source-generic: GenericRssFeedSource (RSS/Atom/podcast, body from RSS)
- source-substack: SubstackFeedSource (free RSS bodies, paywall detection sets
  audience/isTruncated; section deferred to the JSON API in a later release)
32 source tests; 194 total green; tsc + eslint clean.
2026-06-14 14:40:39 -04:00