#!/usr/bin/env python3 import datetime import json import logging import requests from typing import Dict import datetime_utils import file_writer import renderer logger = logging.getLogger(__file__) 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 or 'restrictionTwo' in conditions: ret += '''
temperature: {conditions['temperature']}°{conditions['temperatureUnit'][0]}
weather: {conditions['weather']}
road: {conditions['roadCondition']}
restrictions: ''' if 'restrictionOne' in conditions: ret += f''' {conditions['restrictionOne']['travelDirectionName']}: {conditions['restrictionOne']['publicPage']}
''' if 'restrictionTwo' in conditions: ret += f''' {conditions['restrictionTwo']['travelDirectionName']}: {conditions['restrictionTwo']['publicPage']}''' 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['periodText']} {f['forecastText']} ''' ret += '
' 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] now = datetime_utils.now_pacific() tss = conditions['displayDate'] tss = tss.replace('Z', '+00:00') ts = datetime.datetime.strptime(tss, '%Y-%m-%dT%H:%M:%S.%f%z') tss = datetime_utils.describe_timedelta_briefly(now - ts) with file_writer.file_writer('stevens-conditions_5_3000.html') as f: f.write(f'''

Stevens Pass Conditions ~{tss} ago:


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