X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=stevens_renderer.py;h=0916aee9fd694b1a6a1b84e0bb251c6d459b8111;hb=86f7e14f34b43ed8eb8cf5eaf113a4ecca976327;hp=eca0dcb517dac6f2a71e41734400f93268e44fbb;hpb=75b27cc68871343681f01e3f5b04cae84b1b7b2a;p=kiosk.git diff --git a/stevens_renderer.py b/stevens_renderer.py index eca0dcb..0916aee 100644 --- a/stevens_renderer.py +++ b/stevens_renderer.py @@ -1,45 +1,116 @@ -import renderer +#!/usr/bin/env python3 + +import datetime +import json +import logging +import requests +from typing import Dict + +import datetime_utils import file_writer -import http.client -import xml.etree.ElementTree as ET - -class stevens_pass_conditions_renderer(renderer.debuggable_abstaining_renderer): - def __init__(self, name_to_timeout_dict, feed_site, feed_uris): - super(stevens_pass_conditions_renderer, self).__init__( - name_to_timeout_dict, False) - self.feed_site = feed_site - self.feed_uris = feed_uris - - def debug_prefix(self): - return "stevens" - - def periodic_render(self, key): - f = file_writer.file_writer('stevens-conditions_1_none.html') - for uri in self.feed_uris: - self.conn = http.client.HTTPSConnection(self.feed_site) - self.conn.request( - "GET", - uri, - None, - {"Accept-Charset": "utf-8"}) - response = self.conn.getresponse() - if response.status == 200: - raw = response.read() - rss = ET.fromstring(raw) - channel = rss[0] - for item in channel.getchildren(): - if item.tag == "title": - f.write("

%s


" % item.text) - f.write('') - elif item.tag == "item": - for x in item.getchildren(): - if x.tag == "description": - text = x.text - text = text.replace("Stevens Pass US2
", "") - text = text.replace("

", "
") - text = text.replace("Elevation Meters:1238
", "") - f.write('

\n%s\n' % text) - f.close() - return True - f.close() +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")