API reference

This part of the documentation covers all the interfaces of reader.

Reader object

Most of reader’s functionality can be accessed through a Reader instance.

reader.make_reader(url, *, feed_root='', plugins=..., session_timeout=(3.05, 60), reserved_name_scheme=..., search_enabled='auto')

Create a new Reader.

reader can optionally parse local files, with the feed URL either a bare path or a file URI.

The interpretation of local feed URLs depends on the value of the feed feed_root argument. It can be one of the following:

None

No local file parsing. Updating local feeds will fail.

'' (the empty string)

Full filesystem access. This should be used only if the source of feed URLs is trusted.

Both absolute and relative feed paths are supported. The current working directory is used normally (as if the path was passed to open()).

Example: Assuming the current working directory is /feeds, all of the following feed URLs correspond to /feeds/feed.xml: feed.xml, /feeds/feed.xml, file:feed.xml, and file:/feeds/feed.xml.

'/path/to/feed/root' (any non-empty string)

An absolute path; all feed URLs are interpreted as relative to it. This can be used if the source of feed URLs is untrusted.

Feed paths must be relative. The current working directory is ignored.

Example: Assuming the feed root is /feeds, feed URLs feed.xml and file:feed.xml correspond to /feeds/feed.xml. /feed.xml and file:/feed.xml are both errors.

Relative paths pointing outside the feed root are errors, to prevent directory traversal attacks. Note that symbolic links inside the feed root can point outside it.

The root and feed paths are joined and normalized with no regard for symbolic links; see os.path.normpath() for details.

Accessing device files on Windows is an error.

Parameters
  • url (str) – Path to the reader database.

  • feed_root (str or None) – Directory where to look for local feeds. One of None (don’t open local feeds; default), '' (full filesystem access), or '/path/to/feed/root' (an absolute path that feed paths are relative to).

  • plugins (iterable(str or callable(Reader)) or None) – An iterable of built-in plugin names or plugin(reader) –> None callables. The callables are called with the reader object before it is returned. Exceptions from plugin code will propagate to the caller. The only plugin used by default is reader.ua_fallback.

  • session_timeout (float or tuple(float, float) or None) – When retrieving HTTP(S) feeds, how many seconds to wait for the server to send data, as a float, or a (connect timeout, read timeout) tuple. Passed to the underlying Requests session.

  • reserved_name_scheme (dict(str, str)) – Value for reserved_name_scheme. The prefixes default to .reader./.plugin., and the separator to .

  • search_enabled (bool or None or 'auto') – Whether to enable search. One of 'auto' (enable on the first update_search() call; default), True (enable), False (disable), None (do nothing).

Returns

The reader.

Return type

Reader

Raises
  • StorageError – An error occurred while connecting to storage.

  • SearchError – An error occurred while enabling/disabling search.

  • InvalidPluginError – An invalid plugin name was passed to plugins.

  • ReaderError – An ambiguous exception occurred while creating the reader.

New in version 2.4: The search_enabled keyword argument.

Changed in version 2.4: Enable search on the first update_search() call. To get the previous behavior (leave search as-is), use search_enabled=None.

Changelog

Changed in version 2.0: feed_root now defaults to None (don’t open local feeds) instead of '' (full filesystem access).

New in version 1.17: The reserved_name_scheme keyword argument.

New in version 1.16: The plugins keyword argument. Using an invalid plugin name raises InvalidPluginError, a ValueError subclass.

New in version 1.14: The session_timeout keyword argument, with a default of (3.05, 60) seconds; the previous behavior was to never time out.

New in version 1.6: The feed_root keyword argument.

class reader.Reader(...)

A feed reader.

Persists feed and entry state, provides operations on them, and stores configuration.

Currently, the following feed types are supported:

Important

Reader objects should be created using make_reader(); the Reader constructor is not stable yet and may change without any notice.

Important

The Reader object is not thread safe; its methods should be called only from the thread that created it.

To access the same database from multiple threads, create one instance in each thread. If you have a strong use case preventing you to do so, please +1 / comment in #206.

Changelog

New in version 1.13: JSON Feed support.

after_entry_update_hooks

List of functions called for each updated entry after the feed was updated.

Each function is called with:

Each function should return None.

Warning

The only entry attributes guaranteed to be present are feed_url, id, and object_id; all other attributes may be missing (accessing them may raise AttributeError).

Changelog

New in version 1.20.

after_feed_update_hooks

List of functions called for each updated feed after the feed was updated.

Each function is called with:

  • reader – the Reader instance

  • feed – the str feed URL

Each function should return None.

Changelog

New in version 2.2.

close()

Close this Reader.

Releases any underlying resources associated with the reader.

The reader becomes unusable from this point forward; a ReaderError will be raised if any other method is called.

Raises

ReaderError

add_feed(feed)

Add a new feed.

Feed updates are enabled by default.

Parameters

feed (str or Feed) – The feed URL.

Raises
delete_feed(feed)

Delete a feed and all of its entries, metadata, and tags.

Parameters

feed (str or Feed) – The feed URL.

Raises
Changelog

New in version 1.18: Renamed from remove_feed().

change_feed_url(old, new)

Change the URL of a feed.

User-defined feed attributes are preserved: added, user_title. Feed-defined feed attributes are also preserved, at least until the next update: title, link, author (except updated, which gets set to None). All other feed attributes are set to their default values.

The entries, tags and metadata are preserved.

Parameters
  • old (str or Feed) – The old feed; must exist.

  • new (str or Feed) – The new feed; must not exist.

Raises
Changelog

New in version 1.8.

get_feeds(*, feed=None, tags=None, broken=None, updates_enabled=None, sort='title', limit=None, starting_after=None)

Get all or some of the feeds.

The tags argument can be a list of one or more feed tags. Multiple tags are interpreted as a conjunction (AND). To use a disjunction (OR), use a nested list. To negate a tag, prefix the tag value with a minus sign (-). Examples:

['one']

one

['one', 'two'] [['one'], ['two']]

one AND two

[['one', 'two']]

one OR two

[['one', 'two'], 'three']

(one OR two) AND three

['one', '-two']

one AND NOT two

Special values True and False match feeds with any tags and no tags, respectively.

True [True]

any tags

False [False]

no tags

[True, '-one']

any tags AND NOT one

[[False, 'one']]

no tags OR one

Parameters
  • feed (str or Feed or None) – Only return the feed with this URL.

  • tags (None or bool or list(str or bool or list(str or bool))) – Only return feeds matching these tags.

  • broken (bool or None) – Only return broken / healthy feeds.

  • updates_enabled (bool or None) – Only return feeds that have updates enabled / disabled.

  • sort (str) – How to order feeds; one of 'title' (by user_title or title, case insensitive; default), or 'added' (last added first).

  • limit (int or None) – A limit on the number of feeds to be returned; by default, all feeds are returned.

  • starting_after (str or Feed or None) – Return feeds after this feed; a cursor for use in pagination.

Yields

Feed – Sorted according to sort.

Raises
Changelog

New in version 1.12: The limit and starting_after keyword arguments.

New in version 1.11: The updates_enabled keyword argument.

New in version 1.7: The tags keyword argument.

New in version 1.7: The broken keyword argument.

get_feed(feed, default=no value)

Get a feed.

Like next(iter(reader.get_feeds(feed=feed)), default), but raises a custom exception instead of StopIteration.

Parameters
  • feed (str or Feed) – The feed URL.

  • default – Returned if given and the feed does not exist.

Returns

The feed.

Return type

Feed

Raises
get_feed_counts(*, feed=None, tags=None, broken=None, updates_enabled=None)

Count all or some of the feeds.

See get_feeds() for details on how filtering works.

Parameters
  • feed (str or Feed or None) – Only count the feed with this URL.

  • tags (None or bool or list(str or bool or list(str or bool))) – Only count feeds matching these tags.

  • broken (bool or None) – Only count broken / healthy feeds.

  • updates_enabled (bool or None) – Only count feeds that have updates enabled / disabled.

Returns

Return type

FeedCounts

Raises

StorageError

Changelog

New in version 1.11.

set_feed_user_title(feed, title)

Set a user-defined title for a feed.

Parameters
  • feed (str or Feed) – The feed URL.

  • title (str or None) – The title, or None to remove the current title.

Raises
enable_feed_updates(feed)

Enable updates for a feed.

See update_feeds() for details.

Parameters

feed (str or Feed) – The feed URL.

Raises
Changelog

New in version 1.11.

disable_feed_updates(feed)

Disable updates for a feed.

See update_feeds() for details.

Parameters

feed (str or Feed) – The feed URL.

Raises
Changelog

New in version 1.11.

update_feeds(*, new=None, workers=1)

Update all the feeds that have updates enabled.

Silently skip feeds that raise ParseError.

Roughly equivalent to for _ in reader.update_feed_iter(...): pass.

Parameters
  • new (bool or None) – Only update feeds that have never been updated / have been updated before. Defaults to None.

  • workers (int) – Number of threads to use when getting the feeds.

Raises

StorageError

Changelog

Changed in version 2.0: Removed the new_only parameter.

Changed in version 2.0: All parameters are keyword-only.

Changed in version 1.15: Update entries whenever their content changes, regardless of their updated date.

Content-only updates (not due to an updated change) are limited to 24 consecutive updates, to prevent spurious updates for entries whose content changes excessively (for example, because it includes the current time).

Previously, entries would be updated only if the entry updated was newer than the stored one.

Changed in version 1.11: Only update the feeds that have updates enabled.

update_feeds_iter(*, new=None, workers=1)

Update all the feeds that have updates enabled.

Parameters
  • new (bool or None) – Only update feeds that have never been updated / have been updated before. Defaults to None.

  • workers (int) – Number of threads to use when getting the feeds.

Yields

UpdateResult – An (url, value) pair; the value is one of:

  • a summary of the updated feed, if the update was successful

  • None, if the server indicated the feed has not changed since the last update

  • an exception instance

Currently, the exception is always a ParseError, but other ReaderError subclasses may be yielded in the future.

Raises

StorageError

Changelog

Changed in version 2.0: Removed the new_only parameter.

Changed in version 2.0: All parameters are keyword-only.

Changed in version 1.15: Update entries whenever their content changes. See update_feeds() for details.

New in version 1.14.

update_feed(feed)

Update a single feed.

The feed will be updated even if updates are disabled for it.

Parameters

feed (str or Feed) – The feed URL.

Returns

A summary of the updated feed or None, if the server indicated the feed has not changed since the last update.

Return type

UpdatedFeed or None

Raises
Changelog

Changed in version 1.15: Update entries whenever their content changes. See update_feeds() for details.

Changed in version 1.14: The method now returns UpdatedFeed or None instead of None.

get_entries(*, feed=None, entry=None, read=None, important=None, has_enclosures=None, feed_tags=None, sort='recent', limit=None, starting_after=None)

Get all or some of the entries.

Entries are sorted according to sort. Possible values:

'recent'

Most recent first. Currently, that means:

  • by import date for entries published less than 7 days ago

  • by published date otherwise (if an entry does not have published, updated is used)

This is to make sure newly imported entries appear at the top regardless of when the feed says they were published (sometimes, it lies by a day or two).

Note

The algorithm for “recent” is a heuristic and may change over time.

'random'

Random order (shuffled). At at most 256 entries will be returned.

Changelog

New in version 1.2.

Parameters
  • feed (str or Feed or None) – Only return the entries for this feed.

  • entry (tuple(str, str) or Entry or None) – Only return the entry with this (feed URL, entry id) tuple.

  • read (bool or None) – Only return (un)read entries.

  • important (bool or None) – Only return (un)important entries.

  • has_enclosures (bool or None) – Only return entries that (don’t) have enclosures.

  • feed_tags (None or bool or list(str or bool or list(str or bool))) – Only return the entries from feeds matching these tags; works like the get_feeds() tags argument.

  • sort (str) – How to order entries; one of 'recent' (default) or 'random'.

  • limit (int or None) – A limit on the number of entries to be returned; by default, all entries are returned.

  • starting_after (tuple(str, str) or Entry or None) – Return entries after this entry; a cursor for use in pagination. Using starting_after with sort='random' is not supported.

Yields

Entry – Sorted according to sort.

Raises
Changelog

New in version 1.12: The limit and starting_after keyword arguments.

New in version 1.7: The feed_tags keyword argument.

New in version 1.2: The sort keyword argument.

get_entry(entry, default=no value)

Get an entry.

Like next(iter(reader.get_entries(entry=entry)), default), but raises a custom exception instead of StopIteration.

Parameters
  • entry (tuple(str, str) or Entry) – (feed URL, entry id) tuple.

  • default – Returned if given and the entry does not exist.

Returns

The entry.

Return type

Entry

Raises
get_entry_counts(*, feed=None, entry=None, read=None, important=None, has_enclosures=None, feed_tags=None)

Count all or some of the entries.

See get_entries() for details on how filtering works.

Parameters
  • feed (str or Feed or None) – Only count the entries for this feed.

  • entry (tuple(str, str) or Entry or None) – Only count the entry with this (feed URL, entry id) tuple.

  • read (bool or None) – Only count (un)read entries.

  • important (bool or None) – Only count (un)important entries.

  • has_enclosures (bool or None) – Only count entries that (don’t) have enclosures.

  • feed_tags (None or bool or list(str or bool or list(str or bool))) – Only count the entries from feeds matching these tags.

Returns

Return type

EntryCounts

Raises

StorageError

Changelog

New in version 1.11.

set_entry_read(entry, read, modified=no value)

Mark an entry as read or unread, possibly with a custom timestamp.

Parameters
  • entry (tuple(str, str) or Entry) – (feed URL, entry id) tuple.

  • read (bool) – Mark the entry as read if true (default), and as unread otherwise.

  • modified (datetime or None) – Set read_modified to this. Naive datetimes are normalized by passing them to astimezone(). Defaults to the current time.

Raises
Changelog

New in version 2.2.

mark_entry_as_read(entry)

Mark an entry as read.

Alias for set_entry_read(entry, True).

Parameters

entry (tuple(str, str) or Entry) – (feed URL, entry id) tuple.

Raises
Changelog

New in version 1.18: Renamed from mark_as_read().

mark_entry_as_unread(entry)

Mark an entry as unread.

Alias for set_entry_read(entry, False).

Parameters

entry (tuple(str, str) or Entry) – (feed URL, entry id) tuple.

Raises
Changelog

New in version 1.18: Renamed from mark_as_unread().

set_entry_important(entry, important, modified=no value)

Mark an entry as important or unimportant, possibly with a custom timestamp.

Parameters
  • entry (tuple(str, str) or Entry) – (feed URL, entry id) tuple.

  • important (bool) – Mark the entry as important if true (default), and as unimportant otherwise.

  • modified (datetime or None) – Set important_modified to this. Naive datetimes are normalized by passing them to astimezone(). Defaults to the current time.

Raises
Changelog

New in version 2.2.

mark_entry_as_important(entry)

Mark an entry as important.

Alias for set_entry_important(entry, True).

Parameters

entry (tuple(str, str) or Entry) – (feed URL, entry id) tuple.

Raises
Changelog

New in version 1.18: Renamed from mark_as_important().

mark_entry_as_unimportant(entry)

Mark an entry as unimportant.

Alias for set_entry_important(entry, False).

Parameters

entry (tuple(str, str) or Entry) – (feed URL, entry id) tuple.

Raises
Changelog

New in version 1.18: Renamed from mark_as_unimportant().

get_feed_metadata(feed, key=None)

Get all or some of the metadata for a feed as (key, value) pairs.

Parameters
  • feed (str or Feed) – The feed URL.

  • key (str or None) – Only return the metadata for this key.

Yields

tuple(str, JSONType)(key, value) pairs, in undefined order. JSONType is whatever json.dumps() accepts.

Raises

StorageError

Changelog

Changed in version 2.0: The get_feed_metadata(feed, key, default=no value, /) (positional arguments only) get_feed_metadata_item() alias was removed.

Changed in version 1.18: get_feed_metadata() was renamed to get_feed_metadata_item(), iter_feed_metadata() was renamed to get_feed_metadata().

get_feed_metadata_item(feed, key, default=no value)

Get metadata for a feed.

Like next(iter(reader.get_feed_metadata(feed, key=key)), (None, default))[1], but raises a custom exception instead of StopIteration.

Parameters
  • feed (str or Feed) – The feed URL.

  • key (str) – The key of the metadata to retrieve.

  • default – Returned if given and no metadata exists for key.

Returns

The metadata value. JSONType is whatever json.dumps() accepts.

Return type

JSONType

Raises
Changelog

New in version 1.18: Renamed from get_feed_metadata().

set_feed_metadata_item(feed, key, value)

Set metadata for a feed.

Parameters
  • feed (str or Feed) – The feed URL.

  • key (str) – The key of the metadata item to set.

  • value (JSONType) – The value of the metadata item to set. JSONType is whatever json.dumps() accepts.

Raises
Changelog

New in version 1.18: Renamed from set_feed_metadata().

delete_feed_metadata_item(feed, key)

Delete metadata for a feed.

Parameters
  • feed (str or Feed) – The feed URL.

  • key (str) – The key of the metadata item to delete.

Raises
Changelog

New in version 1.18: Renamed from delete_feed_metadata().

Enable full-text search.

Calling this method if search is already enabled is a no-op.

Raises

Disable full-text search.

Calling this method if search is already disabled is a no-op.

Raises

SearchError

is_search_enabled()

Check if full-text search is enabled.

Returns

Whether search is enabled or not.

Return type

bool

Raises

SearchError

Update the full-text search index.

Search must be enabled to call this method.

If make_reader() was called with search_enabled='auto' and search is disabled, it will be enabled automatically.

Raises
search_entries(query, *, feed=None, entry=None, read=None, important=None, has_enclosures=None, feed_tags=None, sort='relevant', limit=None, starting_after=None)

Get entries matching a full-text search query.

Entries are sorted according to sort. Possible values:

'relevant'

Most relevant first.

'recent'

Most recent first. See get_entries() for details on what recent means.

Changelog

New in version 1.4.

'random'

Random order (shuffled). At at most 256 entries will be returned.

Changelog

New in version 1.10.

Note

The query syntax is dependent on the search provider.

The default (and for now, only) search provider is SQLite FTS5. You can find more details on its query syntax here: https://www.sqlite.org/fts5.html#full_text_query_syntax

The columns available in queries are:

  • title: the entry title

  • feed: the feed title

  • content: the entry main text content; this includes the summary and the value of contents that have text/(x)html, text/plain or missing content types

Query examples:

  • hello internet: entries that match “hello” and “internet”

  • hello NOT internet: entries that match “hello” but do not match “internet”

  • hello feed: cortex: entries that match “hello” anywhere, and their feed title matches “cortex”

  • hello NOT feed: internet: entries that match “hello” anywhere, and their feed title does not match “internet”

Search must be enabled to call this method.

Parameters
  • query (str) – The search query.

  • feed (str or Feed or None) – Only search the entries for this feed.

  • entry (tuple(str, str) or Entry or None) – Only search for the entry with this (feed URL, entry id) tuple.

  • read (bool or None) – Only search (un)read entries.

  • important (bool or None) – Only search (un)important entries.

  • has_enclosures (bool or None) – Only search entries that (don’t) have enclosures.

  • feed_tags (None or bool or list(str or bool or list(str or bool))) – Only return the entries from feeds matching these tags; works like the get_feeds() tags argument.

  • sort (str) – How to order results; one of 'relevant' (default), 'recent', or 'random'.

  • limit (int or None) – A limit on the number of results to be returned; by default, all results are returned.

  • starting_after (tuple(str, str) or EntrySearchResult or None) – Return results after this result; a cursor for use in pagination. Using starting_after with sort='random' is not supported.

Yields

EntrySearchResult – Sorted according to sort.

Raises
Changelog

New in version 1.12: The limit and starting_after keyword arguments.

New in version 1.7: The feed_tags keyword argument.

New in version 1.4: The sort keyword argument.

search_entry_counts(query, *, feed=None, entry=None, read=None, important=None, has_enclosures=None, feed_tags=None)

Count entries matching a full-text search query.

See search_entries() for details on how the query syntax and filtering work.

Search must be enabled to call this method.

Parameters
  • query (str) – The search query.

  • feed (str or Feed or None) – Only count the entries for this feed.

  • entry (tuple(str, str) or Entry or None) – Only count the entry with this (feed URL, entry id) tuple.

  • read (bool or None) – Only count (un)read entries.

  • important (bool or None) – Only count (un)important entries.

  • has_enclosures (bool or None) – Only count entries that (don’t) have enclosures.

  • feed_tags (None or bool or list(str or bool or list(str or bool))) – Only count the entries from feeds matching these tags.

Returns

Return type

EntrySearchCounts

Raises
Changelog

New in version 1.11.

add_feed_tag(feed, tag)

Add a tag to a feed.

Adding a tag that the feed already has is a no-op.

Parameters
  • feed (str or Feed) – The feed URL.

  • tag (str) – The tag to add.

Raises
Changelog

New in version 1.7.

remove_feed_tag(feed, tag)

Remove a tag from a feed.

Removing a tag that the feed does not have is a no-op.

Parameters
  • feed (str or Feed) – The feed URL.

  • tag (str) – The tag to remove.

Raises

StorageError

Changelog

New in version 1.7.

get_feed_tags(feed=None)

Get all or some of the feed tags.

Parameters

feed (str or Feed or None) – Only return the tags for this feed.

Yields

str – The tags, in alphabetical order.

Raises

StorageError

Changelog

New in version 1.7.

make_reader_reserved_name(key)

Create a reader-reserved tag or metadata name. See Reserved names for details.

Uses reserved_name_scheme to build names of the format:

{reader_prefix}{key}

Using the default scheme:

>>> reader.make_reader_reserved_name('key')
'.reader.key'
Parameters

key (str) – A key.

Returns

The name.

Return type

str

Changelog

New in version 1.17.

make_plugin_reserved_name(plugin_name, key=None)

Create a plugin-reserved tag or metadata name. See Reserved names for details.

Plugins should use this to generate names for plugin-specific tags and metadata.

Uses reserved_name_scheme to build names of the format:

{plugin_prefix}{plugin_name}
{plugin_prefix}{plugin_name}{separator}{key}

Using the default scheme:

>>> reader.make_plugin_reserved_name('myplugin')
'.plugin.myplugin'
>>> reader.make_plugin_reserved_name('myplugin', 'key')
'.plugin.myplugin.key'
Parameters
  • plugin_name (str) – The plugin package/module name.

  • key (str or None) – A key; if more than one reserved name is needed.

Returns

The name.

Return type

str

Changelog

New in version 1.17.

property reserved_name_scheme

Mapping used to build reserved names. See make_reader_reserved_name() and make_plugin_reserved_name() for details on how this is used.

The default scheme (these keys are required):

{'reader_prefix': '.reader.', 'plugin_prefix': '.plugin.', 'separator': '.'}

The returned mapping is immutable; assign a new mapping to change the scheme.

Changelog

New in version 1.17.

Type

dict(str, str)

Data objects

class reader.Feed(url, updated=None, title=None, link=None, author=None, subtitle=None, version=None, user_title=None, added=None, last_updated=None, last_exception=None, updates_enabled=True)

Data type representing a feed.

All datetime attributes are timezone-aware, with the timezone set to utc.

Changelog

Changed in version 2.0: datetime attributes are now timezone-aware; prior to 2.0, they were naive datetimes representing UTC times.

url

The URL of the feed.

updated = None

The date the feed was last updated, according to the feed.

title = None

The title of the feed.

The URL of a page associated with the feed.

author = None

The author of the feed.

subtitle = None

A description or subtitle for the feed.

New in version 2.4.

version = None

The feed type and version.

For Atom and RSS, provided by feedparser (e.g. atom10, rss20); full list.

For JSON Feed:

json10

JSON Feed 1.0

json11

JSON Feed 1.1

json

JSON Feed (unknown or unrecognized version)

Plugins may add other versions.

New in version 2.4.

user_title = None

User-defined feed title.

added = None

The date when the feed was added.

Changelog

New in version 1.3.

last_updated = None

The date when the feed was last retrieved by reader.

Changelog

New in version 1.3.

last_exception = None

If a ParseError happend during the last update, its cause.

Changelog

New in version 1.3.

updates_enabled = True

Whether updates are enabled for this feed.

Changelog

New in version 1.11.

property object_id

Alias for url.

Changelog

New in version 1.12.

class reader.ExceptionInfo(type_name, value_str, traceback_str)

Data type representing information about an exception.

Changelog

New in version 1.3.

type_name

The fully qualified name of the exception type.

value_str

String representation of the exception value.

traceback_str

String representation of the exception traceback.

class reader.Entry(id, updated, title=None, link=None, author=None, published=None, summary=None, content=(), enclosures=(), read=False, read_modified=None, important=False, important_modified=None, last_updated=None, original_feed_url=None, feed=None)

Data type representing an entry.

All datetime attributes are timezone-aware, with the timezone set to utc.

Changelog

Changed in version 2.0: datetime attributes are now timezone-aware; prior to 2.0, they were naive datetimes representing UTC times.

property feed_url

The feed URL.

id

The entry id.

updated

The date the entry was last updated, according to the feed.

Changelog

Changed in version 2.0: May be None in some cases. In a future version, will be None if missing in the feed; use updated_not_none for the pre-2.0 behavior.

title = None

The title of the entry.

The URL of a page associated with the entry.

author = None

The author of the feed.

published = None

The date the entry was first published.

summary = None

A summary of the entry.

content = ()

Full content of the entry. A sequence of Content objects.

enclosures = ()

External files associated with the entry. A sequence of Enclosure objects.

read = False

Whether the entry was read or not.

read_modified = None

The date when read was last set by the user; None if that never happened, or the entry predates the date being recorded.

Changelog

New in version 2.2.

important = False

Whether the entry is important or not.

important_modified = None

The date when important was last set by the user; None if that never happened, or the entry predates the date being recorded.

Changelog

New in version 2.2.

last_updated = None

The date when the entry was last updated by reader.

Changelog

New in version 1.3.

original_feed_url = None

The URL of the original feed of the entry.

If the feed URL never changed, the same as feed_url.

Changelog

New in version 1.8.

feed = None

The entry’s feed.

property object_id

Alias for (feed_url, id).

Changelog

New in version 1.12.

property updated_not_none

Like updated, but guaranteed to be set (not None).

If the entry updated is missing in the feed, defaults to when the entry was first added.

Changelog

New in version 2.0: Identical to the behavior of updated before 2.0.

class reader.Content(value, type=None, language=None)

Data type representing a piece of content.

value

The content value.

type = None

The content type.

language = None

The content language.

class reader.Enclosure(href, type=None, length=None)

Data type representing an external file.

href

The file URL.

type = None

The file content type.

length = None

The file length.

class reader.EntrySearchResult(feed_url, id, metadata=mappingproxy({}), content=mappingproxy({}))

Data type representing the result of an entry search.

metadata and content are dicts where the key is the path of an entry attribute, and the value is a HighlightedString snippet corresponding to that attribute, with HTML stripped.

>>> result = next(reader.search_entries('hello internet'))
>>> result.metadata['.title'].value
'A Recent Hello Internet'
>>> reader.get_entry(result).title
'A Recent Hello Internet'
feed_url

The feed URL.

id

The entry id.

metadata = mappingproxy({})

Matching entry metadata, in arbitrary order. Currently entry.title and entry.feed.user_title/.title.

content = mappingproxy({})

Matching entry content, sorted by relevance. Any of entry.summary and entry.content[].value.

property object_id

Alias for (feed_url, id).

Changelog

New in version 1.12.

class reader.HighlightedString(value='', highlights=())

A string that has some of its parts highlighted.

value = ''

The underlying string.

highlights = ()

The highlights; non-overlapping slices with positive start/stop and None step.

classmethod extract(text, before, after)

Extract highlights with before/after markers from text.

>>> HighlightedString.extract( '>one< two', '>', '<')
HighlightedString(value='one two', highlights=(slice(0, 3, None),))
Parameters
  • text (str) – The original text, with highlights marked by before and after.

  • before (str) – Highlight start marker.

  • after (str) – Highlight stop marker.

Returns

A highlighted string.

Return type

HighlightedString

split()

Split the highlighted string into parts.

>>> list(HighlightedString('abcd', [slice(1, 3)]))
['a', 'bc', 'd']
Yields

str – The parts (always an odd number); parts with odd indexes are highlighted, parts with even indexes are not.

apply(before, after, func=None)

Apply before/end markers on the highlighted string.

The opposite of extract().

>>> HighlightedString('abcd', [slice(1, 3)]).apply('>', '<')
'a>bc<d'
>>> HighlightedString('abcd', [slice(1, 3)]).apply('>', '<', str.upper)
'A>BC<D'
Parameters
  • before (str) – Highlight start marker.

  • after (str) – Highlight stop marker.

  • func (callable((str), str) or none) – If given, a function to apply to the string parts before adding the markers.

Returns

The string, with highlights marked by before and after.

Return type

str

class reader.FeedCounts(total=None, broken=None, updates_enabled=None)

Count information about feeds.

Changelog

New in version 1.11.

total = None

Total number of feeds.

broken = None

Number of broken feeds.

updates_enabled = None

Number of feeds that have updates enabled.

class reader.EntryCounts(total=None, read=None, important=None, has_enclosures=None, averages=None)

Count information about entries.

Changelog

New in version 1.11.

total = None

Total number of entries.

read = None

Number of read entries.

important = None

Number of important entries.

has_enclosures = None

Number of entries that have enclosures.

averages = None

Average entries per day during the last 1, 3, 12 months, as a 3-tuple.

Changelog

New in version 2.1.

class reader.EntrySearchCounts(total=None, read=None, important=None, has_enclosures=None, averages=None)

Count information about entry search results.

Changelog

New in version 1.11.

total = None

Total number of entries.

read = None

Number of read entries.

important = None

Number of important entries.

has_enclosures = None

Number of entries that have enclosures.

averages = None

Average entries per day during the last 1, 3, 12 months, as a 3-tuple.

Changelog

New in version 2.1.

class reader.UpdateResult(url, value)

Named tuple representing the result of a feed update.

Changelog

New in version 1.14.

property url

The URL of the feed.

property value

One of:

UpdatedFeed

If the update was successful; a summary of the updated feed.

None

If the server indicated the feed has not changed since the last update without returning any data.

ReaderError

If there was an error while updating the feed.

property updated_feed

The updated feed, if the update was successful, None otherwise.

Changelog

New in version 2.1.

property error

The exception, if there was an error, None otherwise.

Changelog

New in version 2.1.

property not_modified

True if the feed has not changed (either because the server returned no data, or because the data didn’t change), false otherwise.

Changelog

New in version 2.1.

class reader.UpdatedFeed(url, new, modified)

The result of a successful feed update.

Changelog

Changed in version 1.19: The updated argument/attribute was renamed to modified.

New in version 1.14.

url

The URL of the feed.

new

The number of new entries (entries that did not previously exist in storage).

modified

The number of modified entries (entries that existed in storage, but had different data than the corresponding feed file entry.)

class reader.EntryUpdateStatus(value)

Enum representing how an entry was updated.

Changelog

New in version 1.20.

NEW = 'new'

The entry did not previously exist in storage.

MODIFIED = 'modified'

The entry existed in storage, but had different data from the one in the feed file.

Exceptions

exception reader.ReaderError(message='')

Base for all public exceptions.

exception reader.FeedError(url, message='')

A feed error occurred.

Subclass of ReaderError.

url

The feed URL.

property object_id

Alias for url.

Changelog

New in version 1.12.

exception reader.FeedExistsError(url, message='')

Feed already exists.

Subclass of FeedError.

exception reader.FeedNotFoundError(url, message='')

Feed not found.

Subclass of FeedError.

exception reader.ParseError(url, message='')

An error occurred while getting/parsing feed.

The original exception should be chained to this one (e.__cause__).

Subclass of FeedError.

exception reader.EntryError(feed_url, id, message='')

An entry error occurred.

Changelog

Changed in version 1.18: The url argument/attribute was renamed to feed_url.

Subclass of ReaderError.

feed_url

The feed URL.

id

The entry id.

property object_id

Alias for (feed_url, id).

Changelog

New in version 1.12.

exception reader.EntryNotFoundError(feed_url, id, message='')

Entry not found.

Subclass of EntryError.

exception reader.MetadataError(*args, key, **kwargs)

A metadata error occurred.

Changelog

Changed in version 1.18: Signature changed from MetadataError(message='') to MetadataError(key, message='').

Subclass of ReaderError.

key

The metadata key.

exception reader.MetadataNotFoundError(*args, key, **kwargs)

Metadata not found.

Changelog

Changed in version 1.18: Signature changed from MetadataNotFoundError(url, key, message='') to MetadataNotFoundError(key, message='').

Subclass of MetadataError.

exception reader.FeedMetadataNotFoundError(url, key, message='')

Feed metadata not found.

Changelog

New in version 1.18.

Subclass of MetadataNotFoundError and FeedError.

exception reader.StorageError(message='')

An exception was raised by the underlying storage.

The original exception should be chained to this one (e.__cause__).

Subclass of ReaderError.

exception reader.SearchError(message='')

A search-related exception.

If caused by an exception raised by the underlying search provider, the original exception should be chained to this one (e.__cause__).

Subclass of ReaderError.

exception reader.SearchNotEnabledError(message='')

A search-related method was called when search was not enabled.

Subclass of SearchError.

exception reader.InvalidSearchQueryError(message='')

The search query provided was somehow invalid.

Subclass of SearchError and ValueError.

exception reader.PluginError(message='')

A plugin-related exception.

Subclass of ReaderError.

exception reader.InvalidPluginError(message='')

An invalid plugin was provided.

Changelog

New in version 1.16.

Subclass of PluginError and ValueError.