]> ToastFreeware Gitweb - philipp/winterrodeln/wrpylib.git/blobdiff - scripts/update_car_distances.py
VAO is missing important streets in Switzerland.
[philipp/winterrodeln/wrpylib.git] / scripts / update_car_distances.py
index 43092537552468c44c54970b823e8e9acfc1885e..d9f7abf40e61db7b4f92941b3943b5cd19a0e08b 100644 (file)
@@ -3,6 +3,7 @@ import argparse
 import configparser
 import re
 import sys
+import time
 from copy import deepcopy
 from datetime import timedelta
 from typing import List, NamedTuple, Optional
@@ -26,7 +27,12 @@ class DistInfo(NamedTuple):
     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
@@ -49,10 +55,23 @@ def vao_car_distance(vao: Vao, parking_lon: float, parking_lat: float, city: Fea
             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:
@@ -211,7 +230,7 @@ def update_car_distances(ini_files: List[str]):
     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'])