X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=reddit_renderer.py;h=d24d36063d0ce16564c0e8d7a22ed3c4d8253fce;hb=09215cf1a1498c99ee75a7cbef3ea62f58a56f0d;hp=cae9b6f0058be939453404684946a957d014a650;hpb=5e241dc47e497c547463cecc07946ea6882835a7;p=kiosk.git
diff --git a/reddit_renderer.py b/reddit_renderer.py
index cae9b6f..d24d360 100644
--- a/reddit_renderer.py
+++ b/reddit_renderer.py
@@ -1,20 +1,35 @@
-import constants
+#!/usr/bin/env python3
+
+import logging
+from typing import Callable, Dict, Iterable, List, Set
+
+import praw # type: ignore
+
+from scottutilz import profanity_filter
+
import file_writer
import grab_bag
-import renderer
-import secrets
import page_builder
-import praw
-import profanity_filter
-import random
-import renderer_catalog
+import renderer
+import kiosk_secrets as secrets
+
+
+logger = logging.getLogger(__name__)
-class reddit_renderer(renderer.debuggable_abstaining_renderer):
+class reddit_renderer(renderer.abstaining_renderer):
"""A renderer to pull text content from reddit."""
- def __init__(self, name_to_timeout_dict, subreddit_list, min_votes, font_size):
- super(reddit_renderer, self).__init__(name_to_timeout_dict, True)
+ def __init__(
+ self,
+ name_to_timeout_dict: Dict[str, int],
+ subreddit_list: List[str],
+ *,
+ min_votes: int = 20,
+ font_size: int = 24,
+ additional_filters: Iterable[Callable[[str], bool]] = [],
+ ):
+ super().__init__(name_to_timeout_dict)
self.subreddit_list = subreddit_list
self.praw = praw.Reddit(
client_id=secrets.reddit_client_id,
@@ -24,68 +39,66 @@ class reddit_renderer(renderer.debuggable_abstaining_renderer):
self.min_votes = min_votes
self.font_size = font_size
self.messages = grab_bag.grab_bag()
- self.filter = profanity_filter.profanity_filter()
- self.deduper = set()
-
- def debug_prefix(self):
- x = ""
- for subreddit in self.subreddit_list:
- x += "%s " % subreddit
- return "reddit(%s)" % x.strip()
-
- def periodic_render(self, key):
- self.debug_print('called for "%s"' % key)
+ self.filters: List[Callable[..., bool]] = [
+ profanity_filter.ProfanityFilter().contains_bad_word
+ ]
+ self.filters.extend(additional_filters)
+ self.deduper: Set[str] = set()
+
+ def periodic_render(self, key: str) -> bool:
+ logger.debug('called for "%s"' % key)
if key == "Scrape":
return self.scrape_reddit()
elif key == "Shuffle":
return self.shuffle_messages()
else:
- raise error("Unexpected operation")
+ raise Exception("Unexpected operation")
- def append_message(self, messages):
+ def append_message(self, messages: List[str]) -> None:
for msg in messages:
+ title = str(msg.title)
+ if title in self.deduper:
+ continue
+ filtered = ""
+ for filt in self.filters:
+ if filt(title) is True:
+ filtered = filt.__name__
+ break
+ if filtered != "":
+ logger.info(f'Filter {filtered} struck down "{title}"')
+ continue
+ if msg.ups < self.min_votes:
+ logger.debug(
+ f'"{title}" doesn\'t have enough upvotes to be interesting'
+ )
+ continue
+
+ self.deduper.add(title)
+ content = f"{msg.ups}"
if (
- not self.filter.contains_bad_words(msg.title)
- and msg.ups > self.min_votes
- and not msg.title in self.deduper
+ msg.thumbnail != "self"
+ and msg.thumbnail != "default"
+ and msg.thumbnail != ""
):
- try:
- self.deduper.add(msg.title)
- content = "%d" % msg.ups
- if (
- msg.thumbnail != "self"
- and msg.thumbnail != "default"
- and msg.thumbnail != ""
- ):
- content = '' % msg.thumbnail
- x = """
-
- %s + {content} |
- %s (%s) + {title} ({msg.author}) |