diff --git a/bumblebee/modules/rss.py b/bumblebee/modules/rss.py index bec9dc7..0808e23 100644 --- a/bumblebee/modules/rss.py +++ b/bumblebee/modules/rss.py @@ -23,6 +23,7 @@ import os import tempfile import logging import random +import re import bumblebee.input import bumblebee.output @@ -33,13 +34,13 @@ import bumblebee.engine class Module(bumblebee.engine.Module): REFRESH_DELAY = 600 SCROLL_SPEED = 3 - LAYOUT_STYLES_ITEMS = [[1,1,1],[2,2,1],[1,2,2],[2,1,2]] + LAYOUT_STYLES_ITEMS = [[1,1,1],[3,3,2],[2,3,3],[3,2,3]] def __init__(self, engine, config): super(Module, self).__init__(engine, config, bumblebee.output.Widget(full_text=self.ticker_update if DEPENDENCIES_OK else self._show_error) ) # Use BBC newsfeed as demo: - self._feeds = self.parameter('feeds', 'http://feeds.bbci.co.uk/news/rss.xml').split(" ") + self._feeds = self.parameter('feeds', 'https://www.espn.com/espn/rss/news').split(" ") self._refresh_countdown = 0 self._feeds_to_update = [] @@ -63,14 +64,31 @@ class Module(bumblebee.engine.Module): if self._current_item: webbrowser.open(self._current_item['link']) + def _check_for_image(self, entry): + image = next(iter([l['href'] for l in entry['links'] if l['rel']=='enclosure']), None) + if not image and 'media_content' in entry: + try: + media = sorted(entry['media_content'], key=lambda i: i['height'] if 'height' in i else 0, reverse=True) + image = next(iter([i['url'] for i in media if i['medium']=='image']), None) + except Exception: + pass + if not image: + match = re.search(']*src\s*=["\']*([^\s^>^"^\']*)["\']*', entry['summary']) + if match: + image=match.group(1) + return image if image else '' + + def _remove_tags(self, txt): + return re.sub('<[^>]*>', '', txt) + def _create_item(self, entry, url, feed): - return {'title': entry['title'].replace('\n', ' '), + return {'title': self._remove_tags(entry['title'].replace('\n', ' ')), 'link': entry['link'], 'new': all([i['title'] != entry['title'] for i in self._items]), 'source': url, - 'summary': entry['summary'], + 'summary': self._remove_tags(entry['summary']), 'feed': feed, - 'image': next(iter([l['href'] for l in entry['links'] if l['rel']=='enclosure']), ''), + 'image': self._check_for_image(entry), 'published': time.mktime(entry.published_parsed) if hasattr(entry, 'published_parsed') else 0} def _update_items_from_feed(self, url): @@ -161,7 +179,7 @@ class Module(bumblebee.engine.Module): def state(self, _): return self._state - def _create_news_element(self, item): + def _create_news_element(self, item, overlay_title): try: timestr = "" if item['published'] == 0 else str(time.ctime(item['published'])) except Exception as e: @@ -170,7 +188,7 @@ class Module(bumblebee.engine.Module): element = "
" element += "
" element += " " - element += "
"+item['title']+"
" + element += "
"+item['title']+"
" element += "
" element += "
"+item['summary']+"
" element += "
"+item['feed']+""+timestr+"
" @@ -184,7 +202,7 @@ class Module(bumblebee.engine.Module): section += "
" for j in range(0, self.LAYOUT_STYLES_ITEMS[style][i]): if newspaper_items: - section += self._create_news_element(newspaper_items[0]) + section += self._create_news_element(newspaper_items[0], self.LAYOUT_STYLES_ITEMS[style][i]!=3) del newspaper_items[0] section += "
" section += "" @@ -201,28 +219,29 @@ class Module(bumblebee.engine.Module): HTML_TEMPLATE = """