reader is a Python feed reader library.
It is designed to allow writing feed reader applications without any business code, and without depending on a particular framework.
build status (GitHub Actions) code coverage documentation status PyPI status checked with mypy code style: black
reader allows you to:
- retrieve, store, and manage Atom, RSS, and JSON feeds
- mark articles as read or important
- add arbitrary tags/metadata to feeds and articles
- filter feeds and articles
- full-text search articles
- get statistics on feed and user activity
- write plugins to extend its functionality
- skip all the low level stuff and focus on what makes your feed reader different
...all these with:
- a stable, clearly documented API
- excellent test coverage
- fully typed Python
What reader doesn't do:
- provide an UI
- provide a REST API (yet)
- depend on a web framework
- have an opinion of how/where you use it
The following exist, but are optional (and frankly, a bit unpolished):
- a minimal web interface
- that works even with text-only browsers
- with automatic tag fixing for podcasts (MP3 enclosures)
- a command-line interface
Documentation: reader.readthedocs.io
Usage:
$ pip install reader
>>> from reader import make_reader >>> >>> reader = make_reader('db.sqlite') >>> reader.add_feed('http://www.hellointernet.fm/podcast?format=rss') >>> reader.update_feeds() >>> >>> entries = list(reader.get_entries()) >>> [e.title for e in entries] ['H.I. #108: Project Cyclops', 'H.I. #107: One Year of Weird', ...] >>> >>> reader.mark_entry_as_read(entries[0]) >>> >>> [e.title for e in reader.get_entries(read=False)] ['H.I. #107: One Year of Weird', 'H.I. #106: Water on Mars', ...] >>> [e.title for e in reader.get_entries(read=True)] ['H.I. #108: Project Cyclops'] >>> >>> reader.update_search() >>> >>> for e in reader.search_entries('year', limit=3): ... title = e.metadata.get('.title') ... print(title.value, title.highlights) ... H.I. #107: One Year of Weird (slice(15, 19, None),) H.I. #52: 20,000 Years of Torment (slice(17, 22, None),) H.I. #83: The Best Kind of Prison ()