]> projects.mako.cc - iron-blogger/blob - scan-feeds.py
Punts for 2012-04-17
[iron-blogger] / scan-feeds.py
1 #!/usr/bin/python
2 import yaml
3 import feedparser
4 import datetime
5 import sys
6 from dateutil.parser import parse
7 import dateutil.tz as tz
8
9 with open('bloggers.yml') as f:
10     users = yaml.safe_load(f.read())
11
12 try:
13     with open('out/report.yml') as f:
14         log = yaml.safe_load(f.read())
15 except IOError:
16     log = {}
17
18 START = datetime.datetime(2011, 10, 24, 6)
19
20 def parse_published(pub):
21     return parse(pub).astimezone(tz.tzlocal()).replace(tzinfo=None)
22
23 def get_date(post):
24     for k in ('published', 'created', 'updated'):
25         if k in post:
26             return post[k]
27
28 def get_link(post):
29     return post.link
30
31 def parse_feeds(weeks, uri):
32     feed = feedparser.parse(uri)
33
34     print >>sys.stderr, "Parsing: %s" % uri
35
36     if not feed.entries:
37         print >>sys.stderr, "WARN: no entries for ", uri
38     for post in feed.entries:
39         date = parse_published(get_date(post))
40
41         if date < START:
42             continue
43         wn = (date - START).days / 7
44
45         while len(weeks) <= wn:
46             weeks.append([])
47
48         post = dict(date=date,
49                     title=post.title,
50                     url=get_link(post))
51         if post['url'] not in [p['url'] for p in weeks[wn]]:
52             weeks[wn].append(post)
53
54 if len(sys.argv) > 1:
55     for username in sys.argv[1:]:
56         weeks = log.setdefault(username, [])
57         for l in users[username]['links']:
58             parse_feeds(weeks, l[2])
59 else:
60     for (username, u) in users.items():
61         weeks = log.setdefault(username, [])
62         for l in u['links']:
63             parse_feeds(weeks, l[2])
64
65 with open('out/report.yml', 'w') as f:
66     yaml.safe_dump(log, f)

Benjamin Mako Hill || Want to submit a patch?