diff --git a/doc/changelog.txt b/doc/changelog.txt index b6db2e2b0..647dc3eda 100644 --- a/doc/changelog.txt +++ b/doc/changelog.txt @@ -10,6 +10,7 @@ Features: Changes: - cmdline: Added the --continue option. +- output: Add encoding, inline images and guid tags to RSS output. Fixes: - comics: Fixed Gunnerkrigcourt comic strip. diff --git a/dosagelib/events.py b/dosagelib/events.py index 0612a9f14..a464840d0 100644 --- a/dosagelib/events.py +++ b/dosagelib/events.py @@ -70,10 +70,12 @@ class RSSEventHandler(EventHandler): def comicDownloaded(self, comic, filename): """Write RSS entry for downloaded comic.""" url = self.getUrlFromFilename(filename) + title = '%s - %s' % (comic, os.path.basename(filename)) + description = '
View Comic' % (url, url) args = ( - '%s - %s' % (comic, os.path.basename(filename)), + title, url, - 'View Comic' % url, + description, util.rfc822date(time.time()) ) @@ -81,7 +83,7 @@ class RSSEventHandler(EventHandler): self.newfile = False self.rss.addItem(*args) else: - self.rss.insertHead(*args) + self.rss.addItem(*args, append=False) def end(self): """Write RSS data to file.""" diff --git a/dosagelib/rss.py b/dosagelib/rss.py index 2fd255113..f813b5361 100644 --- a/dosagelib/rss.py +++ b/dosagelib/rss.py @@ -5,63 +5,57 @@ import xml.dom.minidom import time +from .configuration import App class Feed(object): """Write an RSS feed with comic strip images.""" - def __init__(self, title, link, description, lang='en-us'): + def __init__(self, title, link, description, lang='en-us', encoding="utf-8"): """Initialize RSS writer with given title, link and description.""" + self.encoding = encoding self.rss = xml.dom.minidom.Document() - - rss_root = self.rss.appendChild(self.rss.createElement('rss')) - rss_root.setAttribute('version', '2.0') - - self.channel = rss_root.appendChild(self.rss.createElement('channel')) - + root = self.rss.appendChild(self.rss.createElement('rss')) + root.setAttribute('version', '2.0') + self.channel = root.appendChild(self.rss.createElement('channel')) self.addElement(self.channel, 'title', title) self.addElement(self.channel, 'link', link) self.addElement(self.channel, 'language', lang) self.addElement(self.channel, 'description', description) + self.addElement(self.channel, 'generator', App) def addElement(self, parent, tag, value): """Add an RSS item.""" - return parent.appendChild(self.rss.createElement(tag)).appendChild(self.rss.createTextNode(value)) + elem = self.rss.createElement(tag) + node = self.rss.createTextNode(value) + return parent.appendChild(elem).appendChild(node) - def insertHead(self, title, link, description, date): - """Insert an item head.""" - item = self.rss.createElement('item') - - self.addElement(item, 'title', title) - self.addElement(item, 'link', link) - self.addElement(item, 'description', description) - self.addElement(item, 'pubDate', date) - - elems = self.rss.getElementsByTagName('item') - if elems: - self.channel.insertBefore(item, elems[0]) - else: - self.channel.appendChild(item) - - def addItem(self, title, link, description, date): + def addItem(self, title, link, description, date, append=True): """Insert an item.""" item = self.rss.createElement('item') self.addElement(item, 'title', title) self.addElement(item, 'link', link) self.addElement(item, 'description', description) + self.addElement(item, 'guid', link) self.addElement(item, 'pubDate', date) - self.channel.appendChild(item) + if append: + self.channel.appendChild(item) + else: + elems = self.rss.getElementsByTagName('item') + if elems: + self.channel.insertBefore(item, elems[0]) + else: + self.channel.appendChild(item) def write(self, path): """Write RSS content to file.""" - file = open(path, 'w') - file.write(self.getXML()) - file.close() + with open(path, 'w') as f: + f.write(self.getXML()) def getXML(self): """Get RSS content in XML format.""" - return self.rss.toxml() + return self.rss.toxml(self.encoding) def parseFeed(filename, yesterday):