mirror of
https://github.com/home-assistant/core.git
synced 2025-07-09 06:17:07 +00:00
Improve feedreader roboustness (#1926)
* bugfix: ignore not existing property in feedreader item * add info and debug data * split logic in smaller and hopefully easier to understand functions
This commit is contained in:
parent
1d28fa712f
commit
8c943c966a
@ -30,6 +30,7 @@ class FeedManager(object):
|
|||||||
self._url = url
|
self._url = url
|
||||||
self._feed = None
|
self._feed = None
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
|
self._firstrun = True
|
||||||
# Initialize last entry timestamp as epoch time
|
# Initialize last entry timestamp as epoch time
|
||||||
self._last_entry_timestamp = datetime.utcfromtimestamp(0).timetuple()
|
self._last_entry_timestamp = datetime.utcfromtimestamp(0).timetuple()
|
||||||
_LOGGER.debug('Loading feed %s', self._url)
|
_LOGGER.debug('Loading feed %s', self._url)
|
||||||
@ -44,7 +45,7 @@ class FeedManager(object):
|
|||||||
def _update(self):
|
def _update(self):
|
||||||
"""Update the feed and publish new entries in the event bus."""
|
"""Update the feed and publish new entries in the event bus."""
|
||||||
import feedparser
|
import feedparser
|
||||||
_LOGGER.info('Fetching new data from feed %s', self._url)
|
_LOGGER.info('Fetching new data from feed "%s"', self._url)
|
||||||
self._feed = feedparser.parse(self._url,
|
self._feed = feedparser.parse(self._url,
|
||||||
etag=None if not self._feed
|
etag=None if not self._feed
|
||||||
else self._feed.get('etag'),
|
else self._feed.get('etag'),
|
||||||
@ -58,24 +59,42 @@ class FeedManager(object):
|
|||||||
# Using etag and modified, if there's no new data available,
|
# Using etag and modified, if there's no new data available,
|
||||||
# the entries list will be empty
|
# the entries list will be empty
|
||||||
elif len(self._feed.entries) > 0:
|
elif len(self._feed.entries) > 0:
|
||||||
_LOGGER.debug('Entries available in feed %s', self._url)
|
_LOGGER.debug('%s entri(es) available in feed %s',
|
||||||
|
len(self._feed.entries),
|
||||||
|
self._url)
|
||||||
self._publish_new_entries()
|
self._publish_new_entries()
|
||||||
self._last_entry_timestamp = \
|
|
||||||
self._feed.entries[0].published_parsed
|
|
||||||
else:
|
else:
|
||||||
self._log_no_entries()
|
self._log_no_entries()
|
||||||
|
_LOGGER.info('Fetch from feed "%s" completed', self._url)
|
||||||
|
|
||||||
|
def _update_and_fire_entry(self, entry):
|
||||||
|
"""Update last_entry_timestamp and fire entry."""
|
||||||
|
# We are lucky, `published_parsed` data available,
|
||||||
|
# let's make use of it to publish only new available
|
||||||
|
# entries since the last run
|
||||||
|
if 'published_parsed' in entry.keys():
|
||||||
|
self._last_entry_timestamp = max(entry.published_parsed,
|
||||||
|
self._last_entry_timestamp)
|
||||||
|
else:
|
||||||
|
_LOGGER.debug('No `published_parsed` info available '
|
||||||
|
'for entry "%s"', entry.title)
|
||||||
|
entry.update({'feed_url': self._url})
|
||||||
|
self._hass.bus.fire(EVENT_FEEDREADER, entry)
|
||||||
|
|
||||||
def _publish_new_entries(self):
|
def _publish_new_entries(self):
|
||||||
"""Publish new entries to the event bus."""
|
"""Publish new entries to the event bus."""
|
||||||
new_entries = False
|
new_entries = False
|
||||||
for entry in self._feed.entries:
|
for entry in self._feed.entries:
|
||||||
# Consider only entries newer then the latest parsed one
|
if self._firstrun or (
|
||||||
if entry.published_parsed > self._last_entry_timestamp:
|
'published_parsed' in entry.keys() and
|
||||||
|
entry.published_parsed > self._last_entry_timestamp):
|
||||||
|
self._update_and_fire_entry(entry)
|
||||||
new_entries = True
|
new_entries = True
|
||||||
entry.update({'feed_url': self._url})
|
else:
|
||||||
self._hass.bus.fire(EVENT_FEEDREADER, entry)
|
_LOGGER.debug('Entry %s already processed', entry.title)
|
||||||
if not new_entries:
|
if not new_entries:
|
||||||
self._log_no_entries()
|
self._log_no_entries()
|
||||||
|
self._firstrun = False
|
||||||
|
|
||||||
|
|
||||||
def setup(hass, config):
|
def setup(hass, config):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user