#!/usr/bin/env python3 import sys import traceback import os from threading import Thread import time from datetime import datetime import constants import renderer import renderer import renderer_catalog import chooser import logging import trigger_catalog import utils def filter_news_during_dinnertime(page): now = datetime.now() is_dinnertime = now.hour >= 17 and now.hour <= 20 return (not is_dinnertime or not ("cnn" in page or "news" in page or "mynorthwest" in page or "seattle" in page or "stranger" in page or "twitter" in page or "wsj" in page)) def thread_change_current(): page_chooser = chooser.weighted_random_chooser_with_triggers( trigger_catalog.get_triggers(), [ filter_news_during_dinnertime ]) swap_page_target = 0 last_page = "" while True: now = time.time() (page, triggered) = page_chooser.choose_next_page() if triggered: print('chooser[%s] - WE ARE TRIGGERED.' % utils.timestamp()) if page != last_page: print('chooser[%s] - EMERGENCY PAGE %s LOAD NEEDED' % ( utils.timestamp(), page)) try: f = open(os.path.join(constants.pages_dir, 'current.shtml'), 'w') emit_wrapped(f, page) f.close() except: print('chooser[%s] - page does not exist?!' % ( utils.timestamp())) continue last_page = page swap_page_target = now + constants.refresh_period_sec # Also notify XMLHTTP clients that they need to refresh now. path = os.path.join(constants.pages_dir, 'reload_immediately.html') f = open(path, 'w') f.write('Reload, suckers!') f.close() # Fix this hack... maybe read the webserver logs and see if it # actually was picked up? time.sleep(0.750) os.remove(path) elif now >= swap_page_target: if (page == last_page): print(('chooser[%s] - nominal choice got the same page...' % ( utils.timestamp()))) continue print('chooser[%s] - nominal choice of %s' % (utils.timestamp(), page)) try: f = open(os.path.join(constants.pages_dir, 'current.shtml'), 'w') emit_wrapped(f, page) f.close() except: print('chooser[%s] - page does not exist?!' % (utils.timestamp())) continue last_page = page swap_page_target = now + constants.refresh_period_sec time.sleep(1) def pick_background_color(): now = datetime.now() if now.hour <= 6 or now.hour >= 21: return "E6B8B8" elif now.hour == 7 or now.hour == 20: return "EECDCD" else: return "FFFFFF" def emit_wrapped(f, filename): age = utils.describe_age_of_file_briefly("pages/%s" % filename) bgcolor = pick_background_color() f.write(""" Kitchen Kiosk
 
 

%s @ %s ago.

""" % (bgcolor, constants.refresh_period_sec * 1000, bgcolor, filename, filename, age)) def thread_invoke_renderers(): while True: print("renderer[%s]: invoking all renderers in catalog..." % ( utils.timestamp())) for r in renderer_catalog.get_renderers(): now = time.time() try: r.render() except Exception as e: traceback.print_exc() print("renderer[%s] unknown exception in %s, swallowing it." % ( utils.timestamp(), r.get_name())) except Error as e: traceback.print_exc() print("renderer[%s] unknown error in %s, swallowing it." % ( utils.timestamp(), r.get_name())) delta = time.time() - now if (delta > 1.0): print("renderer[%s]: Warning: %s's rendering took %5.2fs." % ( utils.timestamp(), r.get_name(), delta)) print("renderer[%s]: thread having a little break for %ds..." % ( utils.timestamp(), constants.render_period_sec)) time.sleep(constants.render_period_sec) if __name__ == "__main__": logging.basicConfig() changer_thread = None renderer_thread = None while True: if (changer_thread == None or not changer_thread.is_alive()): print("MAIN[%s] - (Re?)initializing chooser thread..." % ( utils.timestamp())) changer_thread = Thread(target = thread_change_current, args=()) changer_thread.start() if (renderer_thread == None or not renderer_thread.is_alive()): print("MAIN[%s] - (Re?)initializing render thread..." % ( utils.timestamp())) renderer_thread = Thread(target = thread_invoke_renderers, args=()) renderer_thread.start() time.sleep(60) print("Should never get here.")