~dosage-dev/dosage/bunch-of-comics

« back to all changes in this revision

Viewing changes to dosage/rss.py

  • Committer: ns
  • Date: 2009-12-01 07:07:18 UTC
  • Revision ID: ns@ww1aviationlinks.cjb.net-20091201070718-3xoj70sz52zsq09v
Y plugin added YAFGC

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# TODO: Not sure if this RSS output is "valid", should be though.
 
2
#       Might also be nice categorise Comics under one Item
 
3
 
 
4
import xml.dom.minidom
 
5
import time
 
6
 
 
7
class Feed(object):
 
8
    def __init__(self, title, link, description, lang='en-us'):
 
9
        self.rss = xml.dom.minidom.Document()
 
10
 
 
11
        rss_root = self.rss.appendChild(self.rss.createElement('rss'))
 
12
        rss_root.setAttribute('version', '2.0')
 
13
 
 
14
        self.channel = rss_root.appendChild(self.rss.createElement('channel'))
 
15
 
 
16
        self.addElement(self.channel, 'title', title)
 
17
        self.addElement(self.channel, 'link', link)
 
18
        self.addElement(self.channel, 'language', lang)
 
19
        self.addElement(self.channel, 'description', description)
 
20
 
 
21
    def RFC822Date(data):
 
22
        return time.strftime('%a, %d %b %Y %H:%M:%S GMT', data)
 
23
 
 
24
    def addElement(self, parent, tag, value):
 
25
        return parent.appendChild(self.rss.createElement(tag)).appendChild(self.rss.createTextNode(value))
 
26
 
 
27
    def insertHead(self, title, link, description, date):
 
28
        item = self.rss.createElement('item')
 
29
 
 
30
        self.addElement(item, 'title', title)
 
31
        self.addElement(item, 'link', link)
 
32
        self.addElement(item, 'description', description)
 
33
        self.addElement(item, 'pubDate', date)
 
34
 
 
35
        elems = self.rss.getElementsByTagName('item')
 
36
        if elems:
 
37
            self.channel.insertBefore(item, elems[0])
 
38
        else:
 
39
            self.channel.appendChild(item)
 
40
 
 
41
    def addItem(self, title, link, description, date):
 
42
        item = self.rss.createElement('item')
 
43
 
 
44
        self.addElement(item, 'title', title)
 
45
        self.addElement(item, 'link', link)
 
46
        self.addElement(item, 'description', description)
 
47
        self.addElement(item, 'pubDate', date)
 
48
 
 
49
        self.channel.appendChild(item)
 
50
 
 
51
    def write(self, path):
 
52
        file = open(path, 'w')
 
53
        file.write(self.getXML())
 
54
        file.close()
 
55
 
 
56
    def getXML(self):
 
57
        return self.rss.toxml()
 
58
 
 
59
def parseFeed(filename, yesterday):
 
60
    dom = xml.dom.minidom.parse(filename)
 
61
 
 
62
    getText = lambda node, tag: node.getElementsByTagName(tag)[0].childNodes[0].data
 
63
    getNode = lambda tag: dom.getElementsByTagName(tag)
 
64
 
 
65
    content = getNode('channel')[0] # Only one channel node
 
66
 
 
67
    feedTitle = getText(content, 'title')
 
68
    feedLink = getText(content, 'link')
 
69
    feedDesc = getText(content, 'description')
 
70
 
 
71
    feed = Feed(feedTitle, feedLink, feedDesc)
 
72
 
 
73
    for item in getNode('item'):
 
74
        itemDate = time.strptime(getText(item, 'pubDate'), '%a, %d %b %Y %H:%M:%S GMT')
 
75
        if (itemDate > yesterday): # If newer than yesterday
 
76
            feed.addItem(getText(item, 'title'),
 
77
                         getText(item, 'link'),
 
78
                         getText(item, 'description'),
 
79
                         getText(item, 'pubDate'))
 
80
    return feed