import file_writer import grab_bag import renderer import http.client import page_builder import profanity_filter import random import re import xml.etree.ElementTree as ET class generic_news_rss_renderer(renderer.debuggable_abstaining_renderer): def __init__(self, name_to_timeout_dict, feed_site, feed_uris, page_title): super(generic_news_rss_renderer, self).__init__(name_to_timeout_dict, False) self.debug = 1 self.feed_site = feed_site self.feed_uris = feed_uris self.page_title = page_title self.news = grab_bag.grab_bag() self.details = grab_bag.grab_bag() self.filter = profanity_filter.profanity_filter() def debug_prefix(self): pass def get_headlines_page_prefix(self): pass def get_details_page_prefix(self): pass def should_use_https(self): pass def should_profanity_filter(self): return False def find_title(self, item): return item.findtext('title') def munge_title(self, title): return title def find_description(self, item): return item.findtext('description') def munge_description(self, description): description = re.sub('<[^>]+>', '', description) return description def find_link(self, item): return item.findtext('link') def find_image(self, item): return item.findtext('image') def item_is_interesting_for_headlines(self, title, description, item): pass def item_is_interesting_for_article(self, title, description, item): pass def periodic_render(self, key): if key == "Fetch News": return self.fetch_news() elif key == "Shuffle News": return self.shuffle_news() else: raise error('Unexpected operation') def shuffle_news(self): headlines = page_builder.page_builder() headlines.set_layout(page_builder.page_builder.LAYOUT_FOUR_ITEMS) headlines.set_title("%s" % self.page_title) subset = self.news.subset(4) if subset is None: self.debug_print("Not enough messages to choose from.") return False for msg in subset: headlines.add_item(msg) f = file_writer.file_writer('%s_4_none.html' % ( self.get_headlines_page_prefix())) headlines.render_html(f) f.close() details = page_builder.page_builder() details.set_layout(page_builder.page_builder.LAYOUT_ONE_ITEM) details.set_title("%s" % self.page_title) subset = self.details.subset(1) if subset is None: self.debug_print("Not enough details to choose from."); return False for msg in subset: blurb = msg blurb += u'' details.add_item(blurb) g = file_writer.file_writer('%s_6_none.html' % ( self.get_details_page_prefix())) details.render_html(g) g.close() return True def fetch_news(self): count = 0 self.news.clear() self.details.clear() for uri in self.feed_uris: if self.should_use_https(): self.debug_print("Fetching: https://%s%s" % (self.feed_site, uri)) self.conn = http.client.HTTPSConnection(self.feed_site) else: self.debug_print("Fetching: http://%s%s" % (self.feed_site, uri)) self.conn = http.client.HTTPConnection(self.feed_site) self.conn.request( "GET", uri, None, {"Accept-Charset": "utf-8"}) response = self.conn.getresponse() if response.status != 200: print(("%s: RSS fetch_news error, response: %d" % (self.page_title, response.status))) self.debug_print(response.read()) return False rss = ET.fromstring(response.read()) channel = rss[0] for item in channel.getchildren(): title = self.find_title(item) if title is not None: title = self.munge_title(title) description = item.findtext('description') if description is not None: description = self.munge_description(description) link = item.findtext('link') image = item.findtext('image') if (title is None or not self.item_is_interesting_for_headlines(title, description, item)): self.debug_print('Item "%s" is not interesting' % title) continue if (self.should_profanity_filter() and (self.filter.contains_bad_words(title) or self.filter.contains_bad_words(description))): self.debug_print('Found bad words in item "%s"' % title) continue #print u"Title: %s\nDescription: %s\nLink: %s\nImage: %s\n" % ( # title, description, link, image) blurb = u"""
""" if image is not None: blurb += u'' % image blurb += u'

%s' % title if (description is not None and self.item_is_interesting_for_article(title, description, item)): longblurb = blurb longblurb += u"
" longblurb += description longblurb += u"

" longblurb = longblurb.replace("font-size:34pt", "font-size:44pt") self.details.add(longblurb) blurb += u"" self.news.add(blurb) count += 1 return count > 0