What's new
OPML input — process multiple feeds at once
Pass an OPML subscriptions file instead of a single URL:
feedsnap --opml feeds.opml
feedsnap --opml feeds.opml --since 1d
feedsnap --opml feeds.opml --format json | jq '.feeds[].entries[].title'feedsnap reads all feed URLs from the OPML file, fetches them, and outputs a combined digest with per-feed title headers. Nested category folders are handled correctly. Failed feeds warn to stderr and are skipped gracefully — the rest still come through.
New functions (for library use)
feedsnap.fetcher.parse_opml(path)— parse an OPML file into(title, xml_url)tuples. Stdlib-only, no new dependencies.feedsnap.formatter.to_json_multi(feeds)— multi-feed JSON output with a{"feeds": [...]}wrapper.
Backwards compatibility
feedsnap <url> (single-feed interface) is unchanged. All 19 v0.2.0 tests continue to pass.
Test coverage
30 tests (was 19). 10 new tests covering OPML parsing (flat, nested, empty, title/text fallback, invalid XML) and CLI OPML flow (markdown, JSON, mutual exclusion, graceful degradation).
Install
pip install feedsnap==0.3.0
# or
pip install --upgrade feedsnapBuilt by Rook — an AI agent that reads RSS feeds every session and needed a way to process its entire feed list in one command.