Stops
This commit is contained in:
parent
3b154cd379
commit
9c96d0f823
|
@ -0,0 +1,174 @@
|
|||
'''
|
||||
Provides all info from a stop
|
||||
'''
|
||||
|
||||
from libs import get_data_from_json
|
||||
from time import time
|
||||
|
||||
stop_schedule_url = 'http://plandynamique.infotbm.com/api/schedules?stop=%d'
|
||||
|
||||
def get_stop_list ():
|
||||
'''
|
||||
Gets stop name after its number
|
||||
'''
|
||||
l = {}
|
||||
|
||||
# Trams
|
||||
data = get_data_from_json ('http://plandynamique.infotbm.com/api/file/trams.xml')
|
||||
for i in data ['arret']:
|
||||
n = []
|
||||
if type (i ['ligne']) == dict:
|
||||
n.append (int (i ['ligne'] ['StopPointExternalCode'].replace ('TBT', '')))
|
||||
else:
|
||||
for j in i ['ligne']:
|
||||
n.append (int (j ['StopPointExternalCode'].replace ('TBT', '')))
|
||||
for j in n:
|
||||
l [j] = i ['nom']
|
||||
#Bus
|
||||
data = get_data_from_json ('http://plandynamique.infotbm.com/api/file/bus.xml')
|
||||
for i in data ['arret']:
|
||||
n = int (i ['StopPointExternalCode'].replace ('TBC', ''))
|
||||
l [n] = i ['StopName']
|
||||
|
||||
return (l)
|
||||
|
||||
class Stop ():
|
||||
'''
|
||||
Gather stop informations
|
||||
|
||||
data format as returned by infotbm:
|
||||
[
|
||||
{
|
||||
origin: str, # source de l'information, BDSI tout le temps semble-t-il
|
||||
type: str, # type de ligne (Bus, Tramway, Ferry)
|
||||
message: str,
|
||||
code: str, # nom de la ligne
|
||||
name: str, # nom complet de la ligne
|
||||
schedules: [
|
||||
{
|
||||
arrival: str,
|
||||
arrival_commande: str,
|
||||
arrival_theorique: str,
|
||||
comment: str,
|
||||
departure: str,
|
||||
departure_commande: str,
|
||||
departure_theorique: str,
|
||||
destination_id: int,
|
||||
destination_name: str,
|
||||
origin: str,
|
||||
realtime: int,
|
||||
schedule_id: int,
|
||||
trip_id: int,
|
||||
updated_at: str, # last data update
|
||||
vehicle_id: int,
|
||||
vehicle_lattitude: float,
|
||||
vehicle_longitude: float,
|
||||
vehicle_position_updated_at: str, # last update from vehicle
|
||||
waittime: str, # estimated wait time in %H:%M:%S format
|
||||
waittime_text: str # human readable estimated wait time written in French
|
||||
},
|
||||
],
|
||||
}
|
||||
]
|
||||
'''
|
||||
|
||||
def __init__ (self, number, autoupdate_at_creation = True, autoupdate = False, autoupdate_delay = -1):
|
||||
self.number = number
|
||||
self.last_update = 0
|
||||
self.data = None
|
||||
if autoupdate_at_creation:
|
||||
self.update ()
|
||||
|
||||
def update (self, auto = False):
|
||||
'''
|
||||
Updates data
|
||||
auto optionnal param is to set if a update is a automatic one, and must be performed as defined in autoupdate_delay variable
|
||||
'''
|
||||
self.data = get_data_from_json (stop_schedule_url % self.number)
|
||||
if self.data == False:
|
||||
self.data = None
|
||||
self.last_update = 0
|
||||
else:
|
||||
self.last_update = time ()
|
||||
|
||||
def data_age (self):
|
||||
'''
|
||||
Computes the data's age
|
||||
'''
|
||||
return (time () - self.last_update)
|
||||
|
||||
def lines (self):
|
||||
'''
|
||||
List lines on the stop
|
||||
Return unique indexes as known by the class
|
||||
'''
|
||||
return (list (range (0, len (self.data))))
|
||||
|
||||
def get_line (self, line):
|
||||
class Line ():
|
||||
'''
|
||||
Information about a line on a stop
|
||||
'''
|
||||
def __init__ (self, data):
|
||||
self.data = data
|
||||
|
||||
def number (self):
|
||||
return (self.data ['code'])
|
||||
|
||||
def name (self):
|
||||
return (self.data ['name'])
|
||||
|
||||
def vehicles_type (self):
|
||||
return (self.data ['type'])
|
||||
|
||||
def vehicles (self):
|
||||
return (list (range (0, len (self.data ['schedules']))))
|
||||
|
||||
def get_vehicle (self, vehicle):
|
||||
class Vehicle ():
|
||||
'''
|
||||
Information about a vehicle
|
||||
'''
|
||||
def __init__ (self, data):
|
||||
self.data = data
|
||||
|
||||
def is_realtime (self):
|
||||
return (self.data ['realtime'] == '1')
|
||||
|
||||
def waittime (self):
|
||||
return (self.data ['waittime'])
|
||||
|
||||
def waittime_hr (self):
|
||||
return (self.data ['waittime_text'])
|
||||
|
||||
def destination (self):
|
||||
return (self.data ['destination_name'])
|
||||
|
||||
def number (self):
|
||||
return (str (self.data ['vehicle_id']))
|
||||
|
||||
def location (self):
|
||||
try:
|
||||
return (float (self.data ['vehicle_lattitude']), float (self.data ['vehicle_longitude']))
|
||||
except:
|
||||
return (None)
|
||||
|
||||
return (Vehicle (self.data ['schedules'] [vehicle]))
|
||||
|
||||
return (Line (self.data [line]))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
stop_names = get_stop_list ()
|
||||
for i in (3687, 1922, 5832):
|
||||
print (str (i) + ' (' + stop_names [i] + ')')
|
||||
s = Stop (i)
|
||||
for j in s.lines ():
|
||||
l = s.get_line (j)
|
||||
print ('\t' + l.vehicles_type () + ' ' + l.number () + ' (' + l.name () + ')')
|
||||
for k in l.vehicles ():
|
||||
v = l.get_vehicle (k)
|
||||
if v.is_realtime ():
|
||||
print ('\t\t' + v.waittime_hr () + ' → ' + v.destination ())
|
||||
else:
|
||||
print ('\t\t~' + v.waittime_hr () + ' → ' + v.destination ())
|
Loading…
Reference in New Issue