4 # Parse arbitrary XML news streams into an object type
5 # understandable by Planet UCC.
6 # Now uses feedparser to parse 9 different types of RSS _and_ Atom
13 sys.path.insert(0, 'extra')
16 feedparser.USER_AGENT = "PlanetUCC/1.0b +http://planet.ucc.asn.au/ %s" % feedparser.USER_AGENT
37 def __init__(self, URL, blogObject):
39 self.blogObject = blogObject
42 "Return a single Blog object"
44 if self.blogObject and self.blogObject.cache:
45 sys.stdout.write('Downloading feed %s... ' % self.feedURL)
47 data = feedparser.parse(self.feedURL, self.blogObject.cache.etag, self.blogObject.cache.date)
48 # check to see what we got returned
49 if data['items'] == [] and data['channel'] == {}:
50 sys.stdout.write('cached.\n')
51 return self.blogObject
53 sys.stdout.write('done.\n')
55 sys.stdout.write('failed.\n')
58 sys.stdout.write('Downloading feed (no cache) %s... ' % self.feedURL)
60 data = feedparser.parse(self.feedURL)
61 sys.stdout.write('done.\n')
63 sys.stdout.write('failed.\n')
67 cache = CacheHandler.CacheObject()
69 cache.etag = data['etag']
73 cache.date = data['modified']
78 sys.stderr.write('DEBUG: XMLParse2: cache item generation failed\n')
80 # parse the return of data into a blog
81 if data['channel'].has_key('title'):
82 item.blogTitle = data['channel']['title']
84 item.blogTitle = '(Unknown)'
85 if data['channel'].has_key('link'):
86 item.blogURL = data['channel']['link']
88 item.blogURL = self.feedURL
89 for entry in data['items']:
91 if entry.has_key('title'):
92 blogItem.itemTitle = entry['title']
94 blogItem.itemTitle = '(Untitled)'
95 if entry.has_key('link'):
96 blogItem.itemURL = entry['link']
98 blogItem.itemURL = item.blogURL
99 if entry.has_key('date_parsed'):
100 blogItem.itemDate = time.mktime(entry['date_parsed']) + 28800
102 blogItem.itemDate = 0
103 if entry.has_key('description'):
104 blogItem.contents = entry['description']
106 blogItem.contents = '(entry could not be retrieved)'
107 item.items.append(blogItem)