+ gc_target = now + 120.0
+ logger.info("Having a little nap...")
+ time.sleep(30.0)
+
+
+def guess_page(command: str, page_chooser: chooser.chooser) -> str:
+ def normalize_page(page: str) -> str:
+ logger.debug(f"normalize_page input: {page}")
+ page = page.replace("(", " ")
+ page = page.replace("_", " ")
+ page = page.replace(")", " ")
+ page = page.replace(".html", "")
+ page = page.replace("CNNNews", "news")
+ page = page.replace("CNNTechnology", "technology")
+ page = page.replace("gocostco", "costco list")
+ page = page.replace("gohardware", "hardware list")
+ page = page.replace("gohouse", "house list honey do")
+ page = page.replace("gcal", "google calendar events")
+ page = page.replace("mynorthwest", "northwest news")
+ page = page.replace("ratago", "ratago garage door status")
+ page = page.replace("gomenu", "dinner menu")
+ page = page.replace("gmaps-seattle-unwrapped", "traffic")
+ page = page.replace("gomenu", "dinner menu")
+ page = page.replace("WSJNews", "news")
+ page = page.replace("telma", "telma cabin")
+ page = page.replace("WSJBusiness", "business news")
+ page = re.sub(r"[0-9]+", "", page)
+ logger.debug(f"normalize_page output: {page}")
+ return page
+
+ logger.info(f"No exact match for f{command}; trying to guess...")
+ best_page = None
+ best_score = None
+ for page in page_chooser.get_page_list():
+ npage = normalize_page(page)
+ score = SequenceMatcher(None, command, npage).ratio()
+ if best_score is None or score > best_score:
+ best_page = page
+ best_score = score
+ assert best_page is not None
+ logger.info(f"Best guess for f{command} => {best_page} (score = {best_score})")
+ return best_page
+
+
+def process_command(
+ command: str, page_history: List[str], page_chooser
+) -> Optional[str]:
+ command = command.lower()
+ logger.info(f"Parsing verbal command: {command}")
+ page = None
+ if "hold" in command:
+ page = page_history[0]
+ elif "down" in command:
+ os.system(
+ 'xdotool search --onlyvisible "chrom" windowactivate click --repeat 8 5'
+ )
+ return None
+ elif "up" in command:
+ os.system(
+ 'xdotool search --onlyvisible "chrom" windowactivate click --repeat 8 4'
+ )
+ return None
+ elif "back" in command:
+ page = page_history[1]
+ elif "skip" in command:
+ while True:
+ (page, _) = page_chooser.choose_next_page()
+ if page == page_history[0]:
+ logger.debug(f"{page} is the same as last time! Try again.")
+ else:
+ break
+ elif "internal" in command:
+ if "render" in command:
+ page = kiosk_constants.render_stats_pagename
+ else:
+ page = kiosk_constants.render_stats_pagename
+ elif "weather" in command:
+ if "telma" in command or "cabin" in command:
+ page = "weather-telma_3_10800.html"
+ elif "stevens" in command:
+ page = "weather-stevens_3_10800.html"
+ else:
+ page = "weather-home_3_10800.html"
+ elif "cabin" in command:
+ if "list" in command:
+ page = "Cabin-(gocabin)_2_3600.html"
+ else:
+ page = "hidden/cabin_driveway.html"
+ elif "news" in command or "headlines" in command:
+ page = "cnn-CNNNews_4_25900.html"
+ elif "clock" in command or "time" in command:
+ page = "clock_10_none.html"
+ elif "countdown" in command or "countdowns" in command:
+ page = "countdown_3_7200.html"
+ elif "costco" in command:
+ page = "Costco-(gocostco)_2_3600.html"
+ elif "calendar" in command or "events" in command:
+ page = "gcal_3_86400.html"
+ elif "countdown" in command or "countdowns" in command:
+ page = "countdown_3_7200.html"
+ elif "grocery" in command or "groceries" in command:
+ page = "Grocery-(gogrocery)_2_3600.html"
+ elif "hardware" in command:
+ page = "Hardware-(gohardware)_2_3600.html"
+ elif "garage" in command:
+ page = "myq_4_300.html"
+ elif "menu" in command:
+ page = "Menu-(gomenu)_2_3600.html"
+ elif "cron" in command or "health" in command:
+ page = "periodic-health_6_300.html"
+ elif "photo" in command or "picture" in command:
+ page = "photo_23_3600.html"
+ elif "quote" in command or "quotation" in command or "quotes" in command:
+ page = "quotes_4_10800.html"
+ elif "stevens" in command:
+ page = "stevens-conditions_1_86400.html"
+ elif "stock" in command or "stocks" in command:
+ page = "stock_3_86400.html"
+ elif "twitter" in command:
+ page = "twitter_10_3600.html"
+ elif "traffic" in command:
+ page = "gmaps-seattle-unwrapped_5_none.html"
+ elif "front" in command and "door" in command:
+ page = "hidden/frontdoor.html"
+ elif "driveway" in command:
+ page = "hidden/driveway.html"
+ elif "backyard" in command:
+ page = "hidden/backyard.html"
+ else:
+ page = guess_page(command, page_chooser)
+ assert page is not None
+ logger.info(f"Parsed to {page}")
+ return page
+
+
+@logging_utils.LoggingContext(logger, prefix="chooser:")
+def thread_change_current(command_queue: Queue) -> None:
+ page_history = ["", ""]
+ swap_page_target = 0.0