#!/usr/bin/env python3 import json import logging import requests from typing import Dict import file_writer import renderer logger = logging.getLogger(__name__) class stevens_renderer(renderer.abstaining_renderer): URL = "https://wsdot.com/Travel/Real-time/Service/api/MountainPass/Details/10" def __init__(self, name_to_timeout_dict: Dict[str, int]) -> None: super().__init__(name_to_timeout_dict) def render_conditions(mp: Dict[str, str], conditions: Dict[str, str]) -> str: ret = f""" """ if "restrictionOne" in conditions and "restrictionTwo" in conditions: ret += """
Temp: {conditions['temperature']}°{conditions['temperatureUnit'][0]}
Weather: {conditions['weather']}
Roadway: {conditions['roadCondition']}
Restrictions: """ count = 0 msg = conditions["restrictionOne"].get("publicPage", "no restrictions") if msg.lower() != "no restrictions": count += 1 msg = conditions["restrictionTwo"].get("publicPage", "no restrictions") if msg.lower() != "no restrictions": count += 1 if count == 2: ret += f""" {conditions['restrictionOne']['travelDirectionName']}: {conditions['restrictionOne']['publicPage']}
{conditions['restrictionTwo']['travelDirectionName']}: {conditions['restrictionTwo']['publicPage']}""" elif count == 1: msg = conditions["restrictionOne"].get("publicPage", "no restrictions") if msg.lower() != "no restrictions": ret += f""" {conditions['restrictionOne']['travelDirectionName']}: {conditions['restrictionOne']['publicPage']}
""" else: ret += f""" {conditions['restrictionTwo']['travelDirectionName']}: {conditions['restrictionTwo']['publicPage']}
""" else: ret += """None.
""" ret += "
" return ret def render_forecast(forecasts: Dict[str, str]) -> str: ret = "" fc = forecasts["forecast"]["forecastData"] for n, f in enumerate(fc): color = "" if n % 2 == 0: color = ' BGCOLOR="#dfefff"' ret += f""" {f['forecastText']} """ ret += "
{f['periodText']}
" return ret def render_image(cameras: Dict[str, str]) -> str: for camera in cameras: if camera["cameraId"] == 8063: return f"""

{camera['cameraLabel']} ({camera['direction']})
""" return "" def periodic_render(self, unused: str) -> bool: page = requests.get(stevens_renderer.URL) if page.status_code == 200: contents = json.loads(page.content) mp = contents["mountainPass"] conditions = contents["condition"] cameras = contents["cameras"] forecasts = contents["stationForecasts"][0] with file_writer.file_writer("stevens-conditions_5_3000.html") as f: f.write( f"""

Stevens Pass Conditions:


{stevens_renderer.render_conditions(mp, conditions)} {stevens_renderer.render_image(cameras)}
{stevens_renderer.render_forecast(forecasts)}
""" ) return True return False # Test: # test = stevens_renderer({"Test", 123}) # test.periodic_render("Test")