#!/usr/bin/env python3 import json import logging import requests from typing import Dict 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 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")