import configparser
import re
import sys
+import time
from copy import deepcopy
from datetime import timedelta
from typing import List, NamedTuple, Optional
co2_kg: float
-def vao_car_distance(vao: Vao, parking_lon: float, parking_lat: float, city: Feature) -> Optional[DistInfo]:
+class VaoError(RuntimeError):
+ pass
+
+
+def try_vao_car_distance(vao: Vao, parking_lon: float, parking_lat: float, city: Feature) -> DistInfo:
+ """may throw VaoError with JSON decoded response as argument"""
geometry = city.GetGeometryRef()
point = geometry.GetPoint(0)
city_lon, city_lat, _ = point
dist_m = leg['dist']
co2_kg = trip[0]['Eco']['co2']
return DistInfo(city['name'], city['geonames_id'], duration_minutes, dist_m, co2_kg)
- if response.get('errorCode') is not None:
- print(response)
- sys.exit(1)
- print('Unexpected result from VAO')
+ raise VaoError(response)
+
+
+def vao_car_distance(vao: Vao, parking_lon: float, parking_lat: float, city: Feature, retry_count: int = 2) -> DistInfo:
+ for c in range(retry_count):
+ try:
+ return try_vao_car_distance(vao, parking_lon, parking_lat, city)
+ except VaoError as vao_error:
+ response = vao_error.args[0]
+ if response.get('errorCode') is not None:
+ print(response['errorCode'], response.get('errorText'), f'(attempt {c+1}/{retry_count})')
+ if response['errorCode'] == 'SVC_NO_RESULT':
+ time.sleep(2.)
+ continue
+ else:
+ print('Unexpected result from VAO')
+ sys.exit(1)
def distance_meter(a: Geometry, b: Geometry) -> float:
for result in site.query(list='categorymembers', cmtitle='Kategorie:Rodelbahn', cmlimit='max'):
for page in result['categorymembers']:
print(page['title'])
- if page['title'] in ['Anzère']:
+ if page['title'] in ['Anzère', 'Hochhäderich (Falkenhütte)', 'Hochlitten-Moosalpe', 'Saas-Fee']:
continue
update_sledrun(vao, db_cities, site, page['title'])