~dosage-dev/dosage/test-mode

« back to all changes in this revision

Viewing changes to dosage/rss.py

  • Committer: ns
  • Date: 2009-12-01 06:47:33 UTC
  • Revision ID: ns@ww1aviationlinks.cjb.net-20091201064733-wqy9o7lggwhd36o3
repairĀ forĀ Lint

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