view FeedUpdater.py @ 48:6e5219e05625

GUI for feed settings
author Dirk Olmes <dirk@xanthippe.ping.de>
date Sun, 16 May 2010 08:26:46 +0200
parents 0604e374c1d6
children 4b0d686493fb
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 = findFeedsToUpdate(session)
    for feed in allFeeds:
        try:
            FeedUpdater(session, feed).update()
        except FeedUpdateException:
            log.warn("problems while updating feed " + feed.rss_url)
        session.commit()

def findFeedsToUpdate(session):
    return session.query(Feed).filter(Feed.next_update < datetime.now())

def createNewFeed(url, session):
    result = feedparser.parse(url)
    title = result["feed"].title
    newFeed = Feed(title, url)
    session.add(newFeed)
    session.commit()
    
    FeedUpdater(session, 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)
        self.feed.incrementNextUpdateDate()

    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