70 lines
2.1 KiB
Python
70 lines
2.1 KiB
Python
"""File containing Infoscreen HSL data fetcher classes."""
|
|
|
|
import requests
|
|
import json
|
|
import logging
|
|
import os
|
|
import pytz
|
|
|
|
from datetime import timedelta, datetime
|
|
from django.utils import timezone, dateparse
|
|
from django.utils.dateformat import format
|
|
|
|
from django.conf import settings
|
|
|
|
|
|
with open(os.path.join(settings.BASE_DIR, 'infoscreen', 'hsl_stops.graphql')) as stops_file:
|
|
STOPS_QUERY = stops_file.read()
|
|
|
|
with open(os.path.join(settings.BASE_DIR, 'infoscreen', 'hsl_stops_variables.json')) as vars_file:
|
|
STOPS_VARS = json.loads(vars_file.read())
|
|
|
|
API_URL = 'https://api.digitransit.fi/routing/v1/routers/hsl/index/graphql'
|
|
API_HEADERS = {'Content-Type': 'application/json'}
|
|
|
|
|
|
def fetch():
|
|
"""Fetch data from HSL API."""
|
|
|
|
query_vars = STOPS_VARS.copy()
|
|
query_vars['startTime_6'] = format(timezone.now(), 'U')
|
|
|
|
post_data = json.dumps({
|
|
'operationName': 'NearestRoutesContainer',
|
|
'query': STOPS_QUERY,
|
|
'variables': query_vars,
|
|
})
|
|
|
|
resp = requests.post(API_URL, data=post_data, headers=API_HEADERS)
|
|
|
|
data = resp.json()
|
|
|
|
items = data['data']['viewer']['_nearest']['edges']
|
|
places = map(lambda item: item['node']['place'], items)
|
|
|
|
schedule = []
|
|
for place in places:
|
|
route = place['pattern']['route']['shortName']
|
|
stop_times = place['_stoptimes']
|
|
for stop_time in stop_times:
|
|
timestamp = stop_time['serviceDay'] + stop_time['realtimeArrival']
|
|
headsign = stop_time['stopHeadsign']
|
|
stop_name = stop_time['stop']['name']
|
|
time_diff = (timestamp - timezone.now().timestamp()) / 60 # minutes
|
|
|
|
if time_diff < settings.HSL_DEPARTURE_THRESHOLD:
|
|
continue
|
|
elif time_diff < settings.HSL_HURRY_THRESHOLD:
|
|
time = '{} min'.format(int(time_diff))
|
|
else:
|
|
time = datetime.utcfromtimestamp(timestamp).strftime('%H:%M')
|
|
|
|
schedule.append({
|
|
'route': route,
|
|
'headsign': headsign,
|
|
'timestamp': time,
|
|
'stop': stop_name,
|
|
})
|
|
|
|
return schedule
|