1 from bs4 import BeautifulSoup
7 import profanity_filter
11 import renderer_catalog
14 class stranger_events_renderer(renderer.debuggable_abstaining_renderer):
15 def __init__(self, name_to_timeout_dict):
16 super(stranger_events_renderer, self).__init__(name_to_timeout_dict, True)
17 self.feed_site = "everout.com"
18 self.events = grab_bag.grab_bag()
20 def debug_prefix(self):
23 def periodic_render(self, key):
24 self.debug_print("called for action %s" % key)
25 if key == "Fetch Events":
26 return self.fetch_events()
27 elif key == "Shuffle Events":
28 return self.shuffle_events()
30 raise error("Unknown operaiton")
38 .calendar-post-title a {
39 text-decoration: none;
46 .calendar-post-category {
48 .calendar-post-location {
50 .calendar-post-price {
52 .calendar-touch-link {
55 background-color:lightyellow;
61 .calendar-post-price-mobile {
66 margin: 10px 10px 10px 10px;
70 def shuffle_events(self):
71 layout = page_builder.page_builder()
72 layout.set_layout(page_builder.page_builder.LAYOUT_FOUR_ITEMS)
73 layout.set_title("Stranger Events")
74 layout.set_style(self.get_style())
75 subset = self.events.subset(4)
77 self.debug_print("Not enough events to build page.")
82 f = file_writer.file_writer("stranger-events_2_36000.html")
87 def fetch_events(self):
90 "/stranger-seattle/events/?page=1",
91 "/stranger-seattle/events/?page=2",
92 "/stranger-seattle/events/?page=3",
94 now = datetime.datetime.now()
95 ts = now + datetime.timedelta(1)
96 tomorrow = datetime.datetime.strftime(ts, "%Y-%m-%d")
97 feed_uris.append("/stranger-seattle/events/?start-date=%s" % tomorrow)
98 delta = 5 - now.weekday()
102 ts = now + datetime.timedelta(delta)
103 next_sat = datetime.datetime.strftime(ts, "%Y-%m-%d")
105 "/stranger-seattle/events/?start-date=%s&page=1" % next_sat
108 "/stranger-seattle/events/?start-date=%s&page=2" % next_sat
112 ts = now + datetime.timedelta(delta)
113 next_sun = datetime.datetime.strftime(ts, "%Y-%m-%d")
115 "/stranger-seattle/events/?start-date=%s&page=1" % next_sun
118 "/stranger-seattle/events/?start-date=%s&page=2" % next_sun
121 for uri in feed_uris:
123 self.debug_print("fetching 'https://%s%s'" % (self.feed_site, uri))
124 self.conn = http.client.HTTPSConnection(self.feed_site)
125 self.conn.request("GET", uri, None, {"Accept-Charset": "utf-8"})
126 response = self.conn.getresponse()
127 if response.status != 200:
128 self.debug_print("Connection failed, status %d" % (response.status))
129 self.debug_print(response.getheaders())
131 raw = response.read()
133 self.debug_print("Exception talking to the stranger, ignoring.")
136 soup = BeautifulSoup(raw, "html.parser")
137 filter = profanity_filter.profanity_filter()
138 for x in soup.find_all("div", class_="row event list-item mb-3 py-3"):
140 if filter.contains_bad_words(text):
144 'src="/', 'align="left" src="https://www.thestranger.com/'
146 raw = raw.replace('href="/', 'href="https://www.thestranger.com/')
147 raw = raw.replace("FREE", "Free")
148 raw = raw.replace("Save Event", "")
149 raw = re.sub("^\s*$", "", raw, 0, re.MULTILINE)
150 # raw = re.sub('\n+', '\n', raw)
152 '<span[^<>]*class="calendar-post-ticket"[^<>]*>.*</#span>',
156 re.DOTALL | re.IGNORECASE,
159 self.debug_print("fetched %d events so far." % self.events.size())
160 return self.events.size() > 0
164 # x = stranger_events_renderer({"Test", 123})
165 # x.periodic_render("Fetch Events")
166 # x.periodic_render("Shuffle Events")