""" open/dulcinea/lib/ui/rss.qpy """ from datetime import timedelta from qp.pub.common import site_now from dulcinea.util import urlopen from xml.dom.minidom import parse import socket import sys if sys.version < "3": from httplib import HTTPException else: from http.client import HTTPException class RSSFeed: def __init__(self, url, delta=None): self.url = str(url) if delta: self.delta = delta else: self.delta = timedelta(minutes=5) self.timestamp = None self.content = None def read_and_parse_url(self): timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(1.0) try: try: feed = urlopen(self.url) except (IOError, HTTPException): feed = None finally: socket.setdefaulttimeout(timeout) self.content = None self.timestamp = None if feed: try: self.content = parse(feed) except Exception: print(sys.exc_info()[1]) else: self.timestamp = None def is_stale(self): return (self.timestamp is None or site_now() > self.timestamp + self.delta) def get_content(self): if self.is_stale(): self.read_and_parse_url() return self.content def get_children_of_type(self, node, type): return [child for child in node and node.childNodes or [] if child.nodeName == type] def get_rss_node(self): return self.get_children_of_type(self.get_content(), 'rss')[0] def get_channel_node(self): return self.get_children_of_type(self.get_rss_node(), 'channel')[0] def get_channel_link(self): try: channel_node = self.get_channel_node() except IndexError: return None try: link_node = self.get_children_of_type(channel_node, 'link')[0] except IndexError: return None try: return link_node.firstChild.nodeValue except AttributeError: return None def get_item_nodes(self): try: channel_node = self.get_channel_node() except IndexError: return [] return self.get_children_of_type(channel_node, 'item') def get_title_date_description_link_for_item(self, item_node): title = description = link = None if item_node and item_node.nodeName == 'item': for child in item_node.childNodes: if child.nodeName == 'title': title = child.firstChild.nodeValue elif child.nodeName == 'pubDate': date = child.firstChild.nodeValue elif child.nodeName == 'description': description = child.firstChild.nodeValue elif child.nodeName == 'link': link = child.firstChild.nodeValue return title, date, description, link