Mercurial > hg > Feedworm
view FeedUpdater.py @ 34:5813e3c10f14
move the database logic out into its own module. Make everything reload safe so that multiple sessions can be created from interactive sessions
author | Dirk Olmes <dirk@xanthippe.ping.de> |
---|---|
date | Wed, 05 May 2010 02:14:05 +0200 |
parents | 72dfae865899 |
children | aaec263f07ca |
line wrap: on
line source
from datetime import datetime from Feed import Feed from FeedEntry import FeedEntry import feedparser import logging STATUS_ERROR = 400 log = logging.getLogger("FeedUpdater") def updateAllFeeds(session): allFeeds = session.query(Feed) for feed in allFeeds: try: FeedUpdater(session, feed).update() except FeedUpdateException: log.warn("problems while updating feed " + feed.rss_url) session.commit() def createNewFeed(url, session): result = feedparser.parse(url) title = result["feed"].title newFeed = Feed(title, url) session.add(newFeed) session.commit() FeedUpdater(newFeed).update() session.commit() class FeedUpdater(object): def __init__(self, session, feed): self.session = session self.feed = feed def update(self): log.info("updating " + self.feed.rss_url) result = self.getFeed() for entry in result.entries: self.processEntry(entry) def getFeed(self): result = feedparser.parse(self.feed.rss_url) if result["status"] >= STATUS_ERROR: raise FeedUpdateException() return result def processEntry(self, entry): self.normalize(entry) feedEntry = FeedEntry.findById(entry.id, self.session) if feedEntry is None: self.createFeedEntry(entry) def normalize(self, entry): if not hasattr(entry, "id"): entry.id = entry.link def createFeedEntry(self, entry): new = FeedEntry() new.id = entry.id new.link = entry.link new.title = entry.title new.updated = datetime(*entry.updated_parsed[:6]) new.summary = entry.summary new.feed = self.feed self.session.add(new) class FeedUpdateException(Exception): pass