#!/usr/bin/python import sha import threading import time import urllib import xml.sax pausetime = 5 class Item: def __init__(self): self.id = None self.description = None self.title = None def getId(self): if self.id is not None: return self.id elif self.description is not None: self.id = sha.sha(self.description.encode('UTF-8')).hexdigest() return self.id class Feed: def __init__(self, url): self.url = url self.items = [] def addItem(self, item): for it in self.items: if it.getId() == item.getId(): # item already exists return self.items.append(item) print "[ " + self.title + " > " + item.title class Reader: feeds = [] def addFeed(self, feed): self.feeds.append(feed) #self.aggregate() def aggregate(self): for feed in self.feeds: parser = xml.sax.make_parser() parser.setContentHandler(RSSParser(feed)) parser.parse(feed.url) class Scheduler(threading.Thread): def __init__(self, reader): self.reader = reader self.alive = True threading.Thread.__init__(self) def run(self): print "Scheduler starting . . ." while (self.alive): self.reader.aggregate() time.sleep(pausetime) def kill(self): self.alive = False class RSSParser(xml.sax.handler.ContentHandler): def __init__(self, feed): self.feeed = feed self.item = None xml.sax.handler.ContentHandler.__init__(self) def startElement(self, name, attr): if name == "item": self.item = Item() self.data = "" def endElement(self, name): if self.item is None and name == "title": self.feeed.title = self.data if name == "item": self.feeed.addItem(self.item) self.item = None if self.item is not None: if name == "title": self.item.title = self.data elif name == "link": self.item.link = self.data elif name == "description": self.item.description = self.data def characters(self, c): self.data += c ala = Feed("http://www.alistapart.com/rss.xml") ajaxian = Feed("http://ajaxian.com/index.xml") quirksmode = Feed("http://www.quirksmode.org/blog/index.xml") reader = Reader() reader.addFeed(ala) reader.addFeed(ajaxian) reader.addFeed(quirksmode) sched = Scheduler(reader) sched.start()