class myRSSFeed: def __init__(self, feed, title, description, urlroot, docroot="./rss", maxitems=100): self._maxitems = maxitems self._items = 0 self._title = title self._description = description self._docroot = docroot self._urlroot = urlroot self._feed = feed self._fg = FeedGenerator() # make sure we have a "/" at the end of the urlroot plen = len(self._urlroot) if self._urlroot[plen - 1:] != "/": self._urlroot += "/" # make sure we have a "/" at the end of the docroot plen = len(self._docroot) if self._docroot[plen - 1:] != "/": self._docroot += "/" self._fg.id(self._urlroot + self._feed) self._fg.link(href="\"" + self._urlroot + self._feed + "\"") self._fg.description(description) self._fg.title(title) self.reopen_feed() def get_fname(self): dt = datetime.now() ts = time.mktime(dt.timetuple()) rn = random.randint(0, 10001) return (u'{}'.format(int(ts)) + "_" + str(rn) + ".html") def update_feed(self, fname, date, title, description): if (self._items == self._maxitems): # remove the oldest item self._fg.remove_item(self._items - 1) self._items -= 1 self._items += 1 fe = self._fg.add_entry() fe.id(self._urlroot + fname) fe.title(title) fe.description(description) fe.link(href=self._urlroot + fname) fe.pubDate(date) self._fg.rss_file(self._docroot + self._feed) def add_item(self, date, headline, body, htmltemplate): try: f = open(htmltemplate, "r") self._template = f.read() f.close() except: self._template = htmltemplate fname = self.get_fname() f = open(self._docroot + fname, "w") fmt = self._template f.write(fmt.format(headline, date.strftime("%Y-%m-%d %H:%M:%S"), body)) f.close() self.update_feed(fname, date, headline, body) def reopen_feed(self): d = feedparser.parse(self._docroot + self._feed) n = min(self._maxitems, len(d.entries)) for i in reversed(range(n)): fe = self._fg.add_entry() fe.id(d.entries[i].guid) fe.title(d.entries[i].title) fe.description(d.entries[i].description) fe.link(href=d.entries[i].link) fe.pubDate(d.entries[i].published) self._items += 1