1 from bs4 import BeautifulSoup
7 import profanity_filter
12 class stranger_events_renderer(renderer.debuggable_abstaining_renderer):
13 def __init__(self, name_to_timeout_dict):
14 super(stranger_events_renderer, self).__init__(name_to_timeout_dict, True)
15 self.feed_site = "everout.com"
16 self.events = grab_bag.grab_bag()
18 def debug_prefix(self):
21 def periodic_render(self, key):
22 self.debug_print("called for action %s" % key)
23 if key == "Fetch Events":
24 return self.fetch_events()
25 elif key == "Shuffle Events":
26 return self.shuffle_events()
28 raise error("Unknown operaiton")
36 .calendar-post-title a {
37 text-decoration: none;
44 .calendar-post-category {
46 .calendar-post-location {
48 .calendar-post-price {
50 .calendar-touch-link {
53 background-color:lightyellow;
59 .calendar-post-price-mobile {
64 margin: 10px 10px 10px 10px;
68 def shuffle_events(self):
69 layout = page_builder.page_builder()
70 layout.set_layout(page_builder.page_builder.LAYOUT_FOUR_ITEMS)
71 layout.set_title("Stranger Events")
72 layout.set_style(self.get_style())
73 subset = self.events.subset(4)
75 self.debug_print("Not enough events to build page.")
80 f = file_writer.file_writer('stranger-events_2_none.html')
85 def fetch_events(self):
88 "/seattle-stranger/events/?page=1",
89 "/seattle-stranger/events/?page=2",
90 "/seattle-stranger/events/?page=3",
92 now = datetime.datetime.now()
93 ts = now + datetime.timedelta(1)
94 tomorrow = datetime.datetime.strftime(ts, "%Y-%m-%d")
95 feed_uris.append("/seattle-stranger/events/?start-date=%s" % tomorrow)
96 delta = 5 - now.weekday()
100 ts = now + datetime.timedelta(delta)
101 next_sat = datetime.datetime.strftime(ts, "%Y-%m-%d")
102 feed_uris.append("/seattle-stranger/events/?start-date=%s&page=1" % next_sat)
103 feed_uris.append("/seattle-stranger/events/?start-date=%s&page=2" % next_sat)
106 ts = now + datetime.timedelta(delta)
107 next_sun = datetime.datetime.strftime(ts, "%Y-%m-%d")
108 feed_uris.append("/seattle-stranger/events/?start-date=%s&page=1" % next_sun)
109 feed_uris.append("/seattle-stranger/events/?start-date=%s&page=2" % next_sun)
111 for uri in feed_uris:
113 self.debug_print("fetching 'https://%s%s'" % (self.feed_site, uri))
114 self.conn = http.client.HTTPSConnection(self.feed_site)
119 {"Accept-Charset": "utf-8"})
120 response = self.conn.getresponse()
121 if response.status != 200:
122 self.debug_print("Connection failed, status %d" % (
124 self.debug_print(response.getheaders())
126 raw = response.read()
128 self.debug_print("Exception talking to the stranger, ignoring.")
131 soup = BeautifulSoup(raw, "html.parser")
132 filter = profanity_filter.profanity_filter()
133 for x in soup.find_all('div', class_='row event list-item mb-3 py-3'):
135 if (filter.contains_bad_words(text)):
138 raw = raw.replace('src="/',
139 'align="left" src="https://www.thestranger.com/')
140 raw = raw.replace('href="/',
141 'href="https://www.thestranger.com/')
142 raw = raw.replace('FREE', 'Free')
143 raw = raw.replace('Save Event', '')
144 raw = re.sub('^\s*$', '', raw, 0, re.MULTILINE)
145 raw = re.sub('\n+', '\n', raw)
146 raw = re.sub('<span[^<>]*class="calendar-post-ticket"[^<>]*>.*</#span>', '', raw, 0, re.DOTALL | re.IGNORECASE)
147 self.events.add(raw.encode('utf-8'))
148 self.debug_print("fetched %d events so far." % self.events.size())
149 return self.events.size() > 0
152 #x = stranger_events_renderer({"Test", 123})
153 #x.periodic_render("Fetch Events")
154 #x.periodic_render("Shuffle Events")