#!/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'''
temperature: |
{conditions['temperature']}°{conditions['temperatureUnit'][0]} |
weather: |
{conditions['weather']} |
road: |
{conditions['roadCondition']} |
'''
if 'restrictionOne' in conditions or 'restrictionTwo' in conditions:
ret += '''
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")