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