"""RSS feed aggregator. This module contains no user-facing commands.""" import sys import os import threading import traceback import feedparser def on_connected(tenquestionmarks): _rss_loop(tenquestionmarks,tenquestionmarks.config()["rss"]["frequency"]) def _rss_loop(tenquestionmarks, frequency=900.0): try: old_entries_file = os.path.join(tenquestionmarks.directory(),"old-feed-entries") FILE = open(old_entries_file, "r") filetext = FILE.read() FILE.close() except IOError: filetext = "" open(old_entries_file, "w").close() filetext = filetext.decode("UTF-8") for feed in tenquestionmarks.config()["rss"]["feeds"]: feedname = "" if isinstance(tenquestionmarks.config()["rss"]["feeds"],dict): feedname = feed feed = tenquestionmarks.config()["rss"]["feeds"][feed] NextFeed = False tenquestionmarks.log("refresh","Refreshing feed %s" % (feed)) d = feedparser.parse(feed) for entry in d.entries: title = entry.title try: title = title.encode("ascii") except UnicodeEncodeError, uee: title = tenquestionmarks.degrade_to_ascii(title) except UnicodeDecodeError, ude: title = tenquestionmarks.degrade_to_ascii(title) if title in filetext: tenquestionmarks.log("refresh","Old entry: %s" % (title)) NextFeed = True else: FILE = open(old_entries_file, "a") try: FILE.write(title + u"\n") except Exception, e: traceback.print_exc(file=sys.stdout) tenquestionmarks.log("Error","%s %s" % (e,title)) FILE.close() tenquestionmarks.queue(tenquestionmarks.config()["rss"]["format"] % ({"title": title, "link": entry.link, "feedname": feedname})) if NextFeed: break def refresher(): _rss_loop(tenquestionmarks,frequency) t = threading.Timer(frequency, refresher) # TODO: make this static t.start()