27d28b8eef
The default encoding for source files is UTF-8 since Python 3, so we can drop all encoding headers. While we are at it, just replace them with SPDX headers.
88 lines
3.2 KiB
Python
88 lines
3.2 KiB
Python
# SPDX-License-Identifier: MIT
|
|
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
|
|
# Copyright (C) 2015-2017 Tobias Gruetzmacher
|
|
import xml.dom.minidom
|
|
import time
|
|
from .configuration import App
|
|
|
|
# TODO: Not sure if this RSS output is "valid", should be though.
|
|
# Might also be nice categorise Comics under one Item
|
|
|
|
|
|
class Feed(object):
|
|
"""Write an RSS feed with comic strip images."""
|
|
|
|
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()
|
|
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."""
|
|
elem = self.rss.createElement(tag)
|
|
node = self.rss.createTextNode(value)
|
|
return parent.appendChild(elem).appendChild(node)
|
|
|
|
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)
|
|
|
|
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."""
|
|
with open(path, 'wb') as f:
|
|
f.write(self.getXML())
|
|
|
|
def getXML(self):
|
|
"""Get RSS content in XML format."""
|
|
return self.rss.toxml(self.encoding)
|
|
|
|
|
|
def parseFeed(filename, yesterday):
|
|
"""Parse an RSS feed and filter only entries that are newer than yesterday."""
|
|
dom = xml.dom.minidom.parse(filename)
|
|
|
|
def getText(node, tag):
|
|
return node.getElementsByTagName(tag)[0].childNodes[0].data
|
|
|
|
def getNode(tag):
|
|
return dom.getElementsByTagName(tag)
|
|
|
|
content = getNode('channel')[0] # Only one channel node
|
|
|
|
feedTitle = getText(content, 'title')
|
|
feedLink = getText(content, 'link')
|
|
feedDesc = getText(content, 'description')
|
|
|
|
feed = Feed(feedTitle, feedLink, feedDesc)
|
|
|
|
for item in getNode('item'):
|
|
itemDate = time.strptime(getText(item, 'pubDate'), '%a, %d %b %Y %H:%M:%S GMT')
|
|
if (itemDate > yesterday): # If newer than yesterday
|
|
feed.addItem(getText(item, 'title'),
|
|
getText(item, 'link'),
|
|
getText(item, 'description'),
|
|
getText(item, 'pubDate'))
|
|
return feed
|