8 import profanity_filter
11 class reddit_renderer(renderer.debuggable_abstaining_renderer):
12 """A renderer to pull text content from reddit."""
14 def __init__(self, name_to_timeout_dict, subreddit_list, min_votes, font_size):
15 super(reddit_renderer, self).__init__(name_to_timeout_dict, True)
16 self.subreddit_list = subreddit_list
17 self.praw = praw.Reddit(client_id=secrets.reddit_client_id,
18 client_secret=secrets.reddit_client_secret,
19 user_agent=secrets.reddit_user_agent)
20 self.min_votes = min_votes
21 self.font_size = font_size
22 self.messages = grab_bag.grab_bag()
23 self.filter = profanity_filter.profanity_filter()
26 def debug_prefix(self):
28 for subreddit in self.subreddit_list:
29 x += ("%s " % subreddit)
30 return "reddit(%s)" % x.strip()
32 def periodic_render(self, key):
33 self.debug_print('called for "%s"' % key)
35 return self.scrape_reddit()
36 elif key == "Shuffle":
37 return self.shuffle_messages()
39 raise error('Unexpected operation')
41 def append_message(self, messages):
43 if (not self.filter.contains_bad_words(msg.title)
44 and msg.ups > self.min_votes
45 and not msg.title in self.deduper):
47 self.deduper.add(msg.title)
48 content = "%d" % msg.ups
49 if (msg.thumbnail != "self" and
50 msg.thumbnail != "default" and
52 content = '<IMG SRC="%s">' % msg.thumbnail
54 <TABLE STYLE="font-size:%dpt;">
56 <!-- The number of upvotes or item image: -->
57 <TD STYLE="font-weight:900; padding:8px;">
58 <FONT COLOR="maroon" SIZE=40>%s</FONT>
61 <!-- The content and author: -->
63 <B>%s</B><BR><FONT COLOR=#bbbbbb>(%s)</FONT>
66 </TABLE>""" % (self.font_size, content, msg.title, msg.author)
67 self.messages.add(x.encode('utf8'))
69 self.debug_print('Unexpected exception, skipping message.')
71 self.debug_print('skipped message "%s" for profanity or low score' % (
72 msg.title.encode('utf8')))
74 def scrape_reddit(self):
77 for subreddit in self.subreddit_list:
79 msg = self.praw.subreddit(subreddit).hot()
80 self.append_message(msg)
84 msg = self.praw.subreddit(subreddit).new()
85 self.append_message(msg)
89 msg = self.praw.subreddit(subreddit).rising()
90 self.append_message(msg)
94 msg = self.praw.subreddit(subreddit).controversial('week')
95 self.append_message(msg)
99 msg = self.praw.subreddit(subreddit).top('day')
100 self.append_message(msg)
103 self.debug_print("There are now %d messages" % self.messages.size())
106 def shuffle_messages(self):
107 layout = page_builder.page_builder()
108 layout.set_layout(page_builder.page_builder.LAYOUT_FOUR_ITEMS)
110 for subreddit in self.subreddit_list:
111 x += ("%s " % subreddit)
114 x = "[local interests]"
117 layout.set_title("Reddit /r/%s" % x.strip())
118 subset = self.messages.subset(4)
120 self.debug_print("Not enough messages to pick from.")
124 f = file_writer.file_writer("%s_4_10800.html" % self.subreddit_list[0])
125 layout.render_html(f)
129 class til_reddit_renderer(reddit_renderer):
130 def __init__(self, name_to_timeout_dict):
131 super(til_reddit_renderer, self).__init__(
132 name_to_timeout_dict, ["todayilearned"], 200, 20)
134 class quotes_reddit_renderer(reddit_renderer):
135 def __init__(self, name_to_timeout_dict):
136 super(quotes_reddit_renderer, self).__init__(
137 name_to_timeout_dict, ["quotes"], 200, 20)
139 class showerthoughts_reddit_renderer(reddit_renderer):
140 def __init__(self, name_to_timeout_dict):
141 super(showerthoughts_reddit_renderer, self).__init__(
142 name_to_timeout_dict, ["showerthoughts"], 350, 24)
144 class seattle_reddit_renderer(reddit_renderer):
145 def __init__(self, name_to_timeout_dict):
146 super(seattle_reddit_renderer, self).__init__(
147 name_to_timeout_dict, ["seattle","seattleWA","SeaWA","bellevue","kirkland", "CoronavirusWA"], 50, 24)
149 class lifeprotips_reddit_renderer(reddit_renderer):
150 def __init__(self, name_to_timeout_dict):
151 super(lifeprotips_reddit_renderer, self).__init__(
152 name_to_timeout_dict, ["lifeprotips"], 100, 24)
154 #x = reddit_renderer({"Test", 1234}, ["seattle","bellevue"], 50, 24)
155 #x.periodic_render("Scrape")
156 #x.periodic_render("Shuffle")