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')
34 def __init__(self, URL, blogObject):
36 self.blogObject = blogObject
39 "Return a single Blog object"
42 sys.stdout.write('Downloading feed %s...' % self.feedURL)
44 data = feedparser.parse(self.feedURL, self.blogObject.cache.etag, self.blogObject.cache.date)
45 sys.stdout.write('done.\n')
47 sys.stdout.write('failed.\n')
50 # check to see what we got returned
51 if data['items'] == [] and data['channel'] == {}:
52 sys.stdout.write('Feed %s is upto date.\n' % self.feedURL)
53 return self.blogObject
55 sys.stdout.write('Downloading feed from %s (no cache)...' % self.feedURL)
57 data = feedparser.parse(self.feedURL)
58 sys.stdout.write('done.\n')
60 sys.stdout.write('failed.\n')
64 cache = CacheHandler.CacheObject()
65 cache.etag = data['etag']
66 cache.date = data['modified']
70 # parse the return of data into a blog
71 if data['channel'].has_key('title'):
72 item.blogTitle = data['channel']['title']
74 item.blogTitle = '(Unknown)'
75 if data['channel'].has_key('link'):
76 item.blogURL = data['channel']['link']
78 item.blogURL = self.feedURL
79 for entry in data['items']:
81 if entry.has_key('title'):
82 blogItem.itemTitle = entry['title']
84 blogItem.itemTitle = '(Untitled)'
85 if entry.has_key('link'):
86 blogItem.itemURL = entry['link']
88 blogItem.itemURL = item.blogURL
89 if entry.has_key('date_parsed'):
90 blogItem.itemDate = time.mktime(entry['date_parsed'])
93 if entry.has_key('description'):
94 blogItem.contents = entry['description']
96 blogItem.contents = '(entry could not be retrieved)'
97 item.items.append(blogItem)