major refactoring: feed knows how to fetch itself

This commit is contained in:
2013-04-09 23:18:50 +02:00
parent 7e6c660b0c
commit a1c6ab0c09
2 changed files with 51 additions and 54 deletions

View File

@ -7,7 +7,6 @@ from sqlalchemy import create_engine, desc, func
from sqlalchemy.orm import sessionmaker
from datetime import datetime
from ddate import ddate
import feedparser
import sys
import codecs
import ConfigParser
@ -107,57 +106,6 @@ def mail_single_entries(session, sender, receiver, prefix):
else:
print 'no unmailed single entries found... not sending mail.'
def process_feed_entry(session, feed, entry):
thisentry = session.query(Entry).\
filter(Entry.title == entry.title).\
filter(Entry.link == entry.link).\
first()
if thisentry:
print ' entry already known <%s>' % entry.title
thisentry.lastfetched = datetime.now()
session.commit()
return 0
else:
print ' new entry <%s>' % entry.title
feed.entries.append(Entry(entry, feed))
session.commit()
return 1
def fetch_single_feed(session, feed):
print 'processing %d: %s' % (feed.id, feed.url)
fetched = False
if feed.feedinfo:
if (not feed.feedinfo.nextfetch) or (feed.feedinfo.nextfetch < datetime.now()):
print 'feed known, fetching...'
try:
parser = feedparser.parse(feed.url)
fetched = True
feed.feedinfo.update(parser)
except:
print 'ERROR parsing feed'
print sys.exc_info()
else:
print 'not fetching before: %s' % feed.feedinfo.nextfetch
else:
print 'feed seems to be new, fetching...'
try:
parser = feedparser.parse(feed.url)
fetched = True
feed.feedinfo = Feedinfo(parser)
except:
print 'ERROR parsing feed'
print sys.exc_info()
if fetched:
print 'processing feed entries:'
entries_new = 0
entries_total = 0
for entry in parser.entries:
entries_total = entries_total + 1
entries_new = entries_new + process_feed_entry(session, feed, entry)
session.commit()
print 'updated %d of %d entries' % (entries_new, entries_total)
def list_all_feeds(session):
allfeeds = session.query(Feed).\
order_by(Feed.id)
@ -175,7 +123,7 @@ def fetch_all_feeds(session):
filter_by(enabled=1).\
order_by(Feed.id)
for feed in allfeeds:
fetch_single_feed(session, feed)
feed.fetch()
print
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):