Modification de l'URL des infos de passage

L'identifiant de ligne est maintenant requis à la fin de l'URL.
Cette information n'étant pas utile auparavent, j'ai donc ajouté sa récupération et son stockage.
This commit is contained in:
Sasha MOREL 2023-08-26 11:33:49 +02:00
parent c2d3dab3ee
commit e81da464e5
9 changed files with 372 additions and 368 deletions

View File

@ -5,39 +5,39 @@ from stop_route import StopRoute
from datetime import datetime
if __name__ == "__main__":
if __name__ == '__main__':
for word in sys.argv [1:]:
for area in get_stop_areas_by_name (word):
stop = get_stop_by_id (area.getId ())
for stopPoint in stop.getStopPoints ():
for route in stopPoint.getRoutes ():
if "Tram" in route.getLineName():
stopRoute = StopRoute(stopPoint.getId(), route.getId())
if 'Tram' in route.getLineName ():
stopRoute = StopRoute (stopPoint.getId (), route.getId (), route.getLineId ())
line = stopRoute.get_line ()
for vehicule in line.get_vehicles ():
v = line.get_vehicle (vehicule)
if v.getRealtime ():
print (
str (v.getWaitTimeText ())
+ " ("
+ ' ('
+ datetime.fromtimestamp (v.getArrival ()).strftime (
"%H:%M"
'%H:%M'
)
+ ") → "
+ ') → '
+ v.getDestination ()
+ ", Curr location: "
+ ', Curr location: '
+ str (v.getLocation ())
)
else:
print (
"~"
'~'
+ str (v.getWaitTimeText ())
+ " ("
+ ' ('
+ datetime.fromtimestamp (v.getArrival ()).strftime (
"%H:%M"
'%H:%M'
)
+ ") → "
+ ') → '
+ v.getDestination ()
+ ", Curr location: "
+ ', Curr location: '
+ str (v.getLocation ())
)

View File

@ -1,8 +1,9 @@
class Route:
def __init__(self, name, line_name):
def __init__ (self, line_id, name, line_name):
self.id = None
self.name = name
self.line_name = line_name
self.line_id = line_id
def getId (self):
return self.id
@ -13,11 +14,14 @@ class Route:
def getLineName (self):
return self.line_name
def getLineId (self):
return self.line_id
def setId (self, id):
self.id = id
def __repr__ (self):
return self.name + " (" + self.line_name + ")"
return self.name + ' (' + self.line_name + ')'
def __str__ (self):
return self.name + " (" + self.line_name + ")"
return self.name + ' (' + self.line_name + ')'

View File

@ -5,24 +5,24 @@ from re import search
from route import Route
INFO_URL = "https://ws.infotbm.com/ws/1.0/network/stoparea-informations/%s"
INFO_URL = 'https://ws.infotbm.com/ws/1.0/network/stoparea-informations/%s'
LINE_TRANSLATE = {
"Tram A": "A",
"Tram B": "B",
"Tram C": "C",
"Tram D": "D",
"TBNight": "58",
"BAT3": "69",
'Tram A': 'A',
'Tram B': 'B',
'Tram C': 'C',
'Tram D': 'D',
'TBNight': '58',
'BAT3': '69',
}
LINE_TYPES = (
"Tram",
"Corol",
"Lianes",
"Ligne",
"Bus Relais",
"Citéis",
'Tram',
'Corol',
'Lianes',
'Ligne',
'Bus Relais',
'Citéis',
)
@ -58,38 +58,38 @@ class Stop:
self.stopPoints = stopPoints
def __repr__ (self):
return self.name + " (" + self.city + ")" + " (id: " + self.id + ")"
return self.name + ' (' + self.city + ')' + ' (id: ' + self.id + ')'
def __str__ (self):
return self.name + " (" + self.city + ")" + " (id: " + self.id + ")"
return self.name + ' (' + self.city + ')' + ' (id: ' + self.id + ')'
def get_stop_by_id (id):
data = get_data_from_json (INFO_URL % quote (id))
stop = Stop (
data["id"],
data["name"],
float(data["latitude"]),
float(data["longitude"]),
data["city"],
data ['id'],
data ['name'],
float (data ['latitude']),
float (data ['longitude']),
data ['city'],
)
stopPoints = []
for i in data["stopPoints"]:
stopPoint = StopPoint(i["name"])
for i in data ['stopPoints']:
stopPoint = StopPoint (i ['name'])
routes = []
stopPoint.setId(int(search("[0-9]+$", i["id"]).group()))
for j in i["routes"]:
route = Route(j["name"], j["line"]["name"])
stopPoint.setId (int (search ('[0-9]+$', i ['id']).group ()))
for j in i ['routes']:
route = Route (j ['id'], j ['name'], j ['line'] ['name'])
add = False
if route.getLineName () in LINE_TRANSLATE:
line_id = LINE_TRANSLATE [route.getLineName ()]
add = True
else:
try:
line_id = search("[0-9]+$", route.getLineName()).group()
line_id = search ('[0-9]+$', route.getLineName ()).group ()
except AttributeError:
continue
line_id = "%02d" % int(line_id)
line_id = '%02d' % int (line_id)
for i in LINE_TYPES:
if route.getLineName () [0:len (i)] == i:
add = True

View File

@ -2,7 +2,7 @@ from utils import get_data_from_json
from urllib.parse import quote
STOP_URL = "https://ws.infotbm.com/ws/1.0/get-schedule/%s"
STOP_URL = 'https://ws.infotbm.com/ws/1.0/get-schedule/%s'
class StopArea:
@ -21,10 +21,10 @@ class StopArea:
return self.city
def __repr__ (self):
return self.name + " (" + self.city + ")" + " (id: " + self.id + ")"
return self.name + ' (' + self.city + ')' + ' (id: ' + self.id + ')'
def __str__ (self):
return self.name + " (" + self.city + ")" + " (id: " + self.id + ")"
return self.name + ' (' + self.city + ')' + ' (id: ' + self.id + ')'
# we on only treat stops of type "stop_area"
@ -32,6 +32,6 @@ def get_stop_areas_by_name(keyword):
data = get_data_from_json (STOP_URL % quote (keyword))
stopAreas = []
for s in data:
if s["type"] == "stop_area":
stopAreas.append(StopArea(s["id"], s["name"], s["city"]))
if s ['type'] == 'stop_area':
stopAreas.append (StopArea (s ['id'], s ['name'], s ['city']))
return stopAreas

View File

@ -3,13 +3,13 @@ from time import time
from vehicle import Vehicle
SCHEDULE_URL = "https://ws.infotbm.com/ws/1.0/get-realtime-pass/%d/%s"
SCHEDULE_URL = 'https://ws.infotbm.com/ws/1.0/get-realtime-pass/%d/%s/%s'
class Line:
"""
'''
Information on the line served at a stop.
"""
'''
def __init__ (self, vehicles):
self.vehicles = vehicles
@ -28,49 +28,50 @@ class StopRoute:
self,
number,
line,
line_id,
auto_update_at_creation = True,
auto_update = False,
auto_update_delay = -1,
):
self.number = number
self.line = line
self.line_id = line_id
self.last_update = 0
self.data = None
if auto_update_at_creation:
self.update ()
def update (self, auto = False):
"""
'''
Update data.
"""
'''
data = get_data_from_json(SCHEDULE_URL % (self.number, self.line))
if "destinations" in data:
data = data["destinations"]
data = get_data_from_json (SCHEDULE_URL % (self.number, self.line, self.line_id))
if 'destinations' in data:
data = data ['destinations']
else:
return
self.last_update = time ()
if type (data) == dict:
self.data = []
# let's simplify the data
for i in data:
for j in data [i]:
location = None
try:
location = (
float(j["vehicle_lattitude"]),
float(j["vehicle_longitude"]),
float (j ['vehicle_lattitude']),
float (j ['vehicle_longitude']),
)
except TypeError:
pass
vehicle = Vehicle (
j["vehicle_id"],
j["destination_name"],
j["realtime"] == "1",
j ['vehicle_id'],
j ['destination_name'],
j ['realtime'] == '1',
location,
hms2seconds(j["waittime"]),
j["waittime_text"],
int(self.last_update + hms2seconds(j["waittime"])),
hms2seconds (j ['waittime']),
j ['waittime_text'],
int (self.last_update + hms2seconds (j ['waittime'])),
)
self.data.append (vehicle)
self.data = sorted (self.data, key = lambda vehicle: vehicle.getArrival ())
@ -78,9 +79,9 @@ class StopRoute:
self.last_update = 0
def data_age (self):
"""
'''
Returns the age of the data.
"""
'''
return time () - self.last_update

View File

@ -4,24 +4,24 @@ from urllib.error import HTTPError
def get_data_from_json (url):
"""
'''
Gets data from json at url.
"""
'''
opener = request.build_opener ()
try:
return read_json(opener.open(url).read().decode("utf8"))
return read_json (opener.open (url).read ().decode ('utf8'))
except HTTPError:
return None
def hms2seconds (hhmmss):
"""
'''
Convert H:M:S string to time in seconds.
"""
'''
try:
cut_string = hhmmss.split(":")
cut_string = hhmmss.split (':')
cut_time = (int (cut_string [0]), int (cut_string [1]), int (cut_string [2]))
return 3600 * cut_time [0] + 60 * cut_time [1] + cut_time [2]
except (IndexError, ValueError, TypeError):

View File

@ -6,13 +6,13 @@ from utils import get_data_from_json
from time import time
vcub_url = "https://ws.infotbm.com/ws/1.0/vcubs"
vcub_url = 'https://ws.infotbm.com/ws/1.0/vcubs'
class Vcub:
"""
'''
Retrieves information from stations.
"""
'''
def __init__ (
self,
@ -32,52 +32,51 @@ class Vcub:
self.update ()
def update (self, auto = False, data = None):
"""
'''
Updates data.
"""
'''
if data is None or type (data) != dict:
d = get_data_from_json (vcub_url)
else:
d = data
# the original format is awfull, so I change it a little
if type (d) == dict:
self.data = {}
d = d["lists"]
d = d ['lists']
for i in d:
e = {
"name": i["name"],
"online": i["connexionState"] == "CONNECTEE",
"plus": i["typeVlsPlus"] == "VLS_PLUS",
"empty": int(i["nbPlaceAvailable"]),
"bikes": int(i["nbBikeAvailable"]),
"ebikes": int(i["nbElectricBikeAvailable"]),
"location": (float(i["latitude"]), float(i["longitude"])),
'name': i ['name'],
'online': i ['connexionState'] == 'CONNECTEE',
'plus': i ['typeVlsPlus'] == 'VLS_PLUS',
'empty': int (i ['nbPlaceAvailable']),
'bikes': int (i ['nbBikeAvailable']),
'ebikes': int (i ['nbElectricBikeAvailable']),
'location': (float (i ['latitude']), float (i ['longitude'])),
}
self.data[int(i["id"])] = e
self.data [int (i ['id'])] = e
self.last_update = time ()
def data_age (self):
"""
'''
Computes the data's age.
"""
'''
return time () - self.last_update
def get_names (self):
"""
'''
Returns all names in a dict with id as data.
"""
'''
r = {}
for i in self.data:
r[self.data[i]["name"]] = i
r [self.data [i] ['name']] = i
return r
def get_locations (self):
"""
'''
Returns all locations in a dict with id as data.
"""
'''
r = {}
for i in self.data:
@ -85,25 +84,25 @@ class Vcub:
return r
def get_by_id (self, id):
"""
'''
Returns a station by its id.
"""
'''
class Station:
"""
'''
A station
"""
'''
def __init__ (self, data, id):
self.data = data
self.id = id
self.name = self.data["name"]
self.location = self.data["location"]
self.online = self.data["online"]
self.isplus = self.data["plus"]
self.bikes = self.data["bikes"]
self.ebikes = self.data["ebikes"]
self.empty = self.data["empty"]
self.name = self.data ['name']
self.location = self.data ['location']
self.online = self.data ['online']
self.isplus = self.data ['plus']
self.bikes = self.data ['bikes']
self.ebikes = self.data ['ebikes']
self.empty = self.data ['empty']
def __int__ (self):
return self.id