Write line names to separate table
This commit is contained in:
parent
9f0f026d0b
commit
772d475015
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
cache/
|
||||||
|
*.pyc
|
55
monitor.py
55
monitor.py
@ -1,7 +1,8 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import requests
|
import requests
|
||||||
import json
|
import json
|
||||||
from typing import List
|
from typing import List, Dict
|
||||||
|
from io import BytesIO
|
||||||
# from pprint import pprint, pformat
|
# from pprint import pprint, pformat
|
||||||
import datetime
|
import datetime
|
||||||
import pause
|
import pause
|
||||||
@ -9,8 +10,10 @@ import sys
|
|||||||
import mysql.connector
|
import mysql.connector
|
||||||
import configparser
|
import configparser
|
||||||
import argparse
|
import argparse
|
||||||
|
from cachecontrol import CacheControl
|
||||||
|
from cachecontrol.caches.file_cache import FileCache
|
||||||
|
|
||||||
TABLE = """
|
VRR_TABLE = """
|
||||||
CREATE TABLE IF NOT EXISTS vrr (
|
CREATE TABLE IF NOT EXISTS vrr (
|
||||||
line_code varchar(9) not null,
|
line_code varchar(9) not null,
|
||||||
direction_code varchar(1) not null,
|
direction_code varchar(1) not null,
|
||||||
@ -20,6 +23,11 @@ status enum('on_time', 'early', 'late', 'cancelled', 'no_data') not null,
|
|||||||
delay_value int,
|
delay_value int,
|
||||||
primary key (line_code, direction_code, station_id, orig_datetime));
|
primary key (line_code, direction_code, station_id, orig_datetime));
|
||||||
"""
|
"""
|
||||||
|
VRR_LINES_TABLE = """
|
||||||
|
CREATE TABLE IF NOT EXISTS vrr_lines (
|
||||||
|
line_code varchar(9) not null primary key,
|
||||||
|
line_number varchar(6) not null);
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class MOT:
|
class MOT:
|
||||||
@ -33,8 +41,16 @@ class MOT:
|
|||||||
ALL_MODES = [LONG_DISTANCE_TRAIN, REGIONAL_TRAIN, COMMUTER_TRAIN, UNDERGROUND_TRAIN, TRAM, BUS, ELEVATED_TRAIN]
|
ALL_MODES = [LONG_DISTANCE_TRAIN, REGIONAL_TRAIN, COMMUTER_TRAIN, UNDERGROUND_TRAIN, TRAM, BUS, ELEVATED_TRAIN]
|
||||||
|
|
||||||
|
|
||||||
last_reply = requests.Response
|
class Line:
|
||||||
|
line_code = str
|
||||||
|
line_name = str
|
||||||
|
|
||||||
|
def __init__(self, code, name):
|
||||||
|
self.line_code = code
|
||||||
|
self.line_name = name
|
||||||
|
|
||||||
|
|
||||||
|
last_reply = None
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("-s", "--setup", help="Run the setup routine.", action="store_true", dest="setup")
|
parser.add_argument("-s", "--setup", help="Run the setup routine.", action="store_true", dest="setup")
|
||||||
|
|
||||||
@ -88,7 +104,7 @@ TRIP_CANCELLED = -9999
|
|||||||
|
|
||||||
# Initialize Requests session
|
# Initialize Requests session
|
||||||
|
|
||||||
HTTP = requests.session()
|
HTTP = CacheControl(requests.session(), cache=FileCache('.cache'))
|
||||||
|
|
||||||
|
|
||||||
def make_request_data(station_id: int, result_count: int = 8, modes: List = MOT.ALL_MODES,
|
def make_request_data(station_id: int, result_count: int = 8, modes: List = MOT.ALL_MODES,
|
||||||
@ -185,6 +201,19 @@ def fixup_data(d: dict) -> dict:
|
|||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
def make_linecode_table(data: dict) -> Dict[str, str]:
|
||||||
|
codes = {}
|
||||||
|
|
||||||
|
for trip in data['departureData']:
|
||||||
|
if trip['lineCode'] in codes:
|
||||||
|
if trip['lineNumber'] != codes[trip['lineCode']]:
|
||||||
|
print('lineCode {} already present as {}! Replacing it with {}.'.format(
|
||||||
|
trip['lineCode'], codes[trip['lineCode']], trip['lineNumber'])
|
||||||
|
)
|
||||||
|
codes[trip['lineCode']] = trip['lineNumber']
|
||||||
|
return codes
|
||||||
|
|
||||||
|
|
||||||
def print_trip(trip: dict, full_text: bool = False) -> None:
|
def print_trip(trip: dict, full_text: bool = False) -> None:
|
||||||
if full_text:
|
if full_text:
|
||||||
fmt = {
|
fmt = {
|
||||||
@ -281,11 +310,13 @@ def update(station_id: int, lines: List[str]) -> dict or None:
|
|||||||
return reply_data
|
return reply_data
|
||||||
|
|
||||||
|
|
||||||
def wait(cxn: mysql.connector.MySQLConnection, station_id: int):
|
def wait(station_id: int):
|
||||||
|
cxn = mysql.connector.MySQLConnection(**db_config)
|
||||||
cur = cxn.cursor()
|
cur = cxn.cursor()
|
||||||
while True:
|
while True:
|
||||||
data = update(station_id, USE_LINES)
|
data = update(station_id, USE_LINES)
|
||||||
if data is not None:
|
if data is not None:
|
||||||
|
line_codes = make_linecode_table(data)
|
||||||
for t in data['departureData']:
|
for t in data['departureData']:
|
||||||
cur.execute('REPLACE INTO vrr '
|
cur.execute('REPLACE INTO vrr '
|
||||||
'(line_code, direction_code, station_id, orig_datetime, status, delay_value)'
|
'(line_code, direction_code, station_id, orig_datetime, status, delay_value)'
|
||||||
@ -293,7 +324,11 @@ def wait(cxn: mysql.connector.MySQLConnection, station_id: int):
|
|||||||
'from_unixtime(%s), %s, %s)',
|
'from_unixtime(%s), %s, %s)',
|
||||||
(t['lineCode'], t['directionCode'], station_id,
|
(t['lineCode'], t['directionCode'], station_id,
|
||||||
t['orgFullTime'], _make_status_value_for_sql(t), _make_delay_value_for_sql(t['delay'])))
|
t['orgFullTime'], _make_status_value_for_sql(t), _make_delay_value_for_sql(t['delay'])))
|
||||||
cxn.commit()
|
for k, v in line_codes.items():
|
||||||
|
cur.execute('REPLACE INTO vrr_lines'
|
||||||
|
'(line_code, line_number)'
|
||||||
|
'VALUES (%s, %s)', (k, v))
|
||||||
|
cxn.commit()
|
||||||
next_refresh = get_next_refresh(data)
|
next_refresh = get_next_refresh(data)
|
||||||
print("Sleeping until " + datetime.datetime.fromtimestamp(next_refresh).isoformat(), file=sys.stderr)
|
print("Sleeping until " + datetime.datetime.fromtimestamp(next_refresh).isoformat(), file=sys.stderr)
|
||||||
pause.until(next_refresh)
|
pause.until(next_refresh)
|
||||||
@ -302,10 +337,12 @@ def wait(cxn: mysql.connector.MySQLConnection, station_id: int):
|
|||||||
def main():
|
def main():
|
||||||
cxn = mysql.connector.connect(**db_config)
|
cxn = mysql.connector.connect(**db_config)
|
||||||
cursor = cxn.cursor()
|
cursor = cxn.cursor()
|
||||||
cursor.execute(TABLE)
|
cursor.execute(VRR_TABLE)
|
||||||
|
cursor.execute(VRR_LINES_TABLE)
|
||||||
|
cursor.close()
|
||||||
|
cxn.close()
|
||||||
try:
|
try:
|
||||||
wait(cxn, USE_STATION_ID)
|
wait(USE_STATION_ID)
|
||||||
except (ValueError, TypeError) as e:
|
except (ValueError, TypeError) as e:
|
||||||
with open("fault.json", "wb") as o:
|
with open("fault.json", "wb") as o:
|
||||||
if last_reply is not None:
|
if last_reply is not None:
|
||||||
|
Loading…
Reference in New Issue
Block a user