X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=stranger_renderer.py;h=0c566d93e3123a5e18f52a5960475140b84ac66c;hb=da3a11e9fcea80a7700eb54605512d331a9ec612;hp=2084c395a4fa4502612abeb32b26d2abffe0b65e;hpb=d6990436e08a57ce211b10058dc61fb223cb94ec;p=kiosk.git diff --git a/stranger_renderer.py b/stranger_renderer.py index 2084c39..0c566d9 100644 --- a/stranger_renderer.py +++ b/stranger_renderer.py @@ -1,32 +1,41 @@ -from bs4 import BeautifulSoup +#!/usr/bin/env python3 + import datetime +import http.client +import logging +import re +from typing import Dict + +from bs4 import BeautifulSoup # type: ignore + import file_writer import grab_bag -import http.client import page_builder import profanity_filter -import random -import re import renderer -import renderer_catalog -class stranger_events_renderer(renderer.debuggable_abstaining_renderer): - def __init__(self, name_to_timeout_dict): - super(stranger_events_renderer, self).__init__(name_to_timeout_dict, True) + +logger = logging.getLogger(__file__) + + +class stranger_events_renderer(renderer.abstaining_renderer): + def __init__(self, name_to_timeout_dict: Dict[str, int]): + super().__init__(name_to_timeout_dict) self.feed_site = "everout.com" self.events = grab_bag.grab_bag() + self.pfilter = profanity_filter.ProfanityFilter() - def debug_prefix(self): + def debug_prefix(self) -> str: return "stranger" - def periodic_render(self, key): - self.debug_print("called for action %s" % key) + def periodic_render(self, key: str) -> bool: + logger.debug("called for action %s" % key) if key == "Fetch Events": return self.fetch_events() elif key == "Shuffle Events": return self.shuffle_events() else: - raise error("Unknown operaiton") + raise Exception("Unknown operaiton") def get_style(self): return """ @@ -66,89 +75,84 @@ class stranger_events_renderer(renderer.debuggable_abstaining_renderer): } """ - def shuffle_events(self): + def shuffle_events(self) -> bool: layout = page_builder.page_builder() layout.set_layout(page_builder.page_builder.LAYOUT_FOUR_ITEMS) layout.set_title("Stranger Events") layout.set_style(self.get_style()) subset = self.events.subset(4) if subset is None: - self.debug_print("Not enough events to build page.") + logger.debug("Not enough events to build page.") return False for msg in subset: layout.add_item(msg) - f = file_writer.file_writer('stranger-events_2_36000.html') - layout.render_html(f) - f.close() + with file_writer.file_writer("stranger-events_2_36000.html") as f: + layout.render_html(f) return True - def fetch_events(self): + def fetch_events(self) -> bool: self.events.clear() - feed_uris = [ - "/stranger-seattle/events/?page=1", - "/stranger-seattle/events/?page=2", - "/stranger-seattle/events/?page=3", - ] + feed_uris = [] now = datetime.datetime.now() ts = now + datetime.timedelta(1) tomorrow = datetime.datetime.strftime(ts, "%Y-%m-%d") - feed_uris.append("/stranger-seattle/events/?start-date=%s" % tomorrow) + feed_uris.append(f"/seattle/events/?start-date={tomorrow}") delta = 5 - now.weekday() if delta <= 0: delta += 7 if delta > 1: ts = now + datetime.timedelta(delta) next_sat = datetime.datetime.strftime(ts, "%Y-%m-%d") - feed_uris.append("/stranger-seattle/events/?start-date=%s&page=1" % next_sat) - feed_uris.append("/stranger-seattle/events/?start-date=%s&page=2" % next_sat) + feed_uris.append(f"/seattle/events/?start-date={next_sat}&page=1") + feed_uris.append(f"/seattle/events/?start-date={next_sat}&page=2") delta += 1 if delta > 1: ts = now + datetime.timedelta(delta) next_sun = datetime.datetime.strftime(ts, "%Y-%m-%d") - feed_uris.append("/stranger-seattle/events/?start-date=%s&page=1" % next_sun) - feed_uris.append("/stranger-seattle/events/?start-date=%s&page=2" % next_sun) + feed_uris.append(f"/seattle/events/?start-date={next_sun}&page=1") + feed_uris.append(f"/seattle/events/?start-date={next_sun}&page=2") for uri in feed_uris: try: - self.debug_print("fetching 'https://%s%s'" % (self.feed_site, uri)) + logger.debug("fetching 'https://%s%s'" % (self.feed_site, uri)) self.conn = http.client.HTTPSConnection(self.feed_site) - self.conn.request( - "GET", - uri, - None, - {"Accept-Charset": "utf-8"}) + self.conn.request("GET", uri, None, {"Accept-Charset": "utf-8"}) response = self.conn.getresponse() if response.status != 200: - self.debug_print("Connection failed, status %d" % ( - response.status)) - self.debug_print(response.getheaders()) + logger.debug("Connection failed, status %d" % (response.status)) + logger.debug(str(response.getheaders())) continue raw = response.read() - except: - self.debug_print("Exception talking to the stranger, ignoring.") + except Exception: + logger.debug("Exception talking to the stranger, ignoring.") continue soup = BeautifulSoup(raw, "html.parser") - filter = profanity_filter.profanity_filter() - for x in soup.find_all('div', class_='row event list-item mb-3 py-3'): - text = x.get_text(); - if (filter.contains_bad_words(text)): + for x in soup.find_all("div", class_="row event list-item mb-3 py-3"): + text = x.get_text() + if self.pfilter.contains_bad_word(text): continue - raw = str(x) - raw = raw.replace('src="/', - 'align="left" src="https://www.thestranger.com/') - raw = raw.replace('href="/', - 'href="https://www.thestranger.com/') - raw = raw.replace('FREE', 'Free') - raw = raw.replace('Save Event', '') - raw = re.sub('^\s*$', '', raw, 0, re.MULTILINE) - #raw = re.sub('\n+', '\n', raw) - raw = re.sub(']*class="calendar-post-ticket"[^<>]*>.*', '', raw, 0, re.DOTALL | re.IGNORECASE) - self.events.add(raw) - self.debug_print("fetched %d events so far." % self.events.size()) + raw_str = str(x) + raw_str = raw_str.replace( + 'src="/', 'align="left" src="https://www.thestranger.com/' + ) + raw_str = raw_str.replace('href="/', 'href="https://www.thestranger.com/') + raw_str = raw_str.replace("FREE", "Free") + raw_str = raw_str.replace("Save Event", "") + raw_str = re.sub("^\s*$", "", raw_str, 0, re.MULTILINE) + raw_str = re.sub( + ']*class="calendar-post-ticket"[^<>]*>.*', + "", + raw_str, + 0, + re.DOTALL | re.IGNORECASE, + ) + self.events.add(raw_str) + logger.debug(f"fetched {self.events.size()} events so far.") return self.events.size() > 0 + # Test #x = stranger_events_renderer({"Test", 123}) #x.periodic_render("Fetch Events")