.. begin-intro
**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.
.. end-intro
|build-status-github| |code-coverage| |documentation-status| |pypi-status| |type-checking| |code-style|
.. |build-status-github| image:: https://github.com/lemon24/reader/workflows/build/badge.svg
:target: https://github.com/lemon24/reader/actions?query=workflow%3Abuild
:alt: build status (GitHub Actions)
.. |code-coverage| image:: https://codecov.io/gh/lemon24/reader/branch/master/graph/badge.svg?token=lcLZaSFysf
:target: https://codecov.io/gh/lemon24/reader
:alt: code coverage
.. |documentation-status| image:: https://readthedocs.org/projects/reader/badge/?version=latest&style=flat
:target: https://reader.readthedocs.io/en/latest/?badge=latest
:alt: documentation status
.. |pypi-status| image:: https://img.shields.io/pypi/v/reader.svg
:target: https://pypi.python.org/pypi/reader
:alt: PyPI status
.. |type-checking| image:: http://www.mypy-lang.org/static/mypy_badge.svg
:target: http://mypy-lang.org/
:alt: checked with mypy
.. |code-style| image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/psf/black
:alt: code style: black
.. begin-features
*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
.. end-features
Documentation: `reader.readthedocs.io`_
.. _reader.readthedocs.io: https://reader.readthedocs.io/
Usage:
.. begin-usage
.. code-block:: bash
$ pip install reader
.. code-block:: python
>>> 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 ()
.. end-usage
Raw data
{
"_id": null,
"home_page": null,
"name": "reader",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "atom, cdf, feed, rdf, rss, json feed, web feed, podcast, feed reader, feed aggregator",
"author": "lemon24",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/c0/66/6f951ac64bf70594da2caccb318acbaa1fce4a877d0a115774bd4035670d/reader-3.16.tar.gz",
"platform": null,
"description": ".. begin-intro\n\n**reader** is a Python feed reader library.\n\nIt is designed to allow writing feed reader applications\nwithout any business code,\nand without depending on a particular framework.\n\n.. end-intro\n\n\n|build-status-github| |code-coverage| |documentation-status| |pypi-status| |type-checking| |code-style|\n\n\n.. |build-status-github| image:: https://github.com/lemon24/reader/workflows/build/badge.svg\n :target: https://github.com/lemon24/reader/actions?query=workflow%3Abuild\n :alt: build status (GitHub Actions)\n\n.. |code-coverage| image:: https://codecov.io/gh/lemon24/reader/branch/master/graph/badge.svg?token=lcLZaSFysf\n :target: https://codecov.io/gh/lemon24/reader\n :alt: code coverage\n\n.. |documentation-status| image:: https://readthedocs.org/projects/reader/badge/?version=latest&style=flat\n :target: https://reader.readthedocs.io/en/latest/?badge=latest\n :alt: documentation status\n\n.. |pypi-status| image:: https://img.shields.io/pypi/v/reader.svg\n :target: https://pypi.python.org/pypi/reader\n :alt: PyPI status\n\n.. |type-checking| image:: http://www.mypy-lang.org/static/mypy_badge.svg\n :target: http://mypy-lang.org/\n :alt: checked with mypy\n\n.. |code-style| image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n :alt: code style: black\n\n\n.. begin-features\n\n*reader* allows you to:\n\n* retrieve, store, and manage **Atom**, **RSS**, and **JSON** feeds\n* mark articles as read or important\n* add arbitrary tags/metadata to feeds and articles\n* filter feeds and articles\n* full-text search articles\n* get statistics on feed and user activity\n* write plugins to extend its functionality\n* skip all the low level stuff and focus on what makes your feed reader different\n\n...all these with:\n\n* a stable, clearly documented API\n* excellent test coverage\n* fully typed Python\n\nWhat *reader* doesn't do:\n\n* provide an UI\n* provide a REST API (yet)\n* depend on a web framework\n* have an opinion of how/where you use it\n\nThe following exist, but are optional (and frankly, a bit unpolished):\n\n* a minimal web interface\n\n * that works even with text-only browsers\n * with automatic tag fixing for podcasts (MP3 enclosures)\n\n* a command-line interface\n\n.. end-features\n\n\nDocumentation: `reader.readthedocs.io`_\n\n.. _reader.readthedocs.io: https://reader.readthedocs.io/\n\n\nUsage:\n\n.. begin-usage\n\n.. code-block:: bash\n\n $ pip install reader\n\n.. code-block:: python\n\n >>> from reader import make_reader\n >>>\n >>> reader = make_reader('db.sqlite')\n >>> reader.add_feed('http://www.hellointernet.fm/podcast?format=rss')\n >>> reader.update_feeds()\n >>>\n >>> entries = list(reader.get_entries())\n >>> [e.title for e in entries]\n ['H.I. #108: Project Cyclops', 'H.I. #107: One Year of Weird', ...]\n >>>\n >>> reader.mark_entry_as_read(entries[0])\n >>>\n >>> [e.title for e in reader.get_entries(read=False)]\n ['H.I. #107: One Year of Weird', 'H.I. #106: Water on Mars', ...]\n >>> [e.title for e in reader.get_entries(read=True)]\n ['H.I. #108: Project Cyclops']\n >>>\n >>> reader.update_search()\n >>>\n >>> for e in reader.search_entries('year', limit=3):\n ... title = e.metadata.get('.title')\n ... print(title.value, title.highlights)\n ...\n H.I. #107: One Year of Weird (slice(15, 19, None),)\n H.I. #52: 20,000 Years of Torment (slice(17, 22, None),)\n H.I. #83: The Best Kind of Prison ()\n\n.. end-usage\n",
"bugtrack_url": null,
"license": "BSD-3-Clause",
"summary": "A Python feed reader library.",
"version": "3.16",
"project_urls": {
"Changes": "https://reader.readthedocs.io/en/latest/changelog.html",
"Documentation": "https://reader.readthedocs.io/",
"Issue tracker": "https://github.com/lemon24/reader/issues",
"Source Code": "https://github.com/lemon24/reader"
},
"split_keywords": [
"atom",
" cdf",
" feed",
" rdf",
" rss",
" json feed",
" web feed",
" podcast",
" feed reader",
" feed aggregator"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "860a8e82088562d3f470f8ced41a3e7c0f39bd1864fcd3bd10147dbfed9342c4",
"md5": "8ecde51691ff1bccd7ce5d176d98a144",
"sha256": "bab88d253f61c279836db04b1e6b729861b7c31b8bf3b098d01a548975963556"
},
"downloads": -1,
"filename": "reader-3.16-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8ecde51691ff1bccd7ce5d176d98a144",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 251306,
"upload_time": "2024-12-08T12:43:34",
"upload_time_iso_8601": "2024-12-08T12:43:34.497374Z",
"url": "https://files.pythonhosted.org/packages/86/0a/8e82088562d3f470f8ced41a3e7c0f39bd1864fcd3bd10147dbfed9342c4/reader-3.16-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c0666f951ac64bf70594da2caccb318acbaa1fce4a877d0a115774bd4035670d",
"md5": "1361d7a33e9df7e9799029abec4958ba",
"sha256": "4371e414837654d798ae83b99e6bd8909c83a0a32d2e2549fa5d9e774affd7ad"
},
"downloads": -1,
"filename": "reader-3.16.tar.gz",
"has_sig": false,
"md5_digest": "1361d7a33e9df7e9799029abec4958ba",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 1490658,
"upload_time": "2024-12-08T12:43:37",
"upload_time_iso_8601": "2024-12-08T12:43:37.379390Z",
"url": "https://files.pythonhosted.org/packages/c0/66/6f951ac64bf70594da2caccb318acbaa1fce4a877d0a115774bd4035670d/reader-3.16.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-08 12:43:37",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "lemon24",
"github_project": "reader",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "reader"
}