
    i                         d dl Z d dl T d dlZdZdZdZeedZd Zd Zd&dZd'dZ	d Z
d Zd(dZd Zd)dZd)dZd Zd)dZd Zd Zd Zd Zd Zd Zd*dZd Zd+d!Zd"Zd# Zd,d%ZdS )-    N)*zChttps://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1 344fe116f7a98031feeeeb9bee2cd80c e5f8780ae69a85b9398e9d2cabad1583zDB-Client-Idz
DB-Api-Keyc                 T   t                               d|z   dz             j        }n#  t          | |          cY S xY wt	          |           t
                              |          }i }|D ]<}||         d                             d          d         }||         d         }|||<   =|S )Nz-https://v6.vbb.transport.rest/stations?query=z$&limit=3&fuzzy=false&completion=trueid:   name)requestsgettext	db_lookupprintjsonloadssplit)operatorstationdatasearch_listr   r   s         Vc:\Users\computer\Desktop\notes\tskylt4.0\server\20260128 - new GTFS loader\germany.py	be_lookupr      s     LWTU{{||  B,7+++++	$KKK::dDK  ']4 &&s++A.G}V$Ds   %' ;c                    t                               d          j        }t                              |          }t          |           i }	 |D ]X}t          |           |d         }|d         }|                    dd                              dd          }n#  Y nxY w|||<   Yn&# t          $ r}t          |           Y d }~nd }~ww xY w|S )Nz   r   r   ( ))r   r   r   r   r   r   replace	Exceptionr   r   r   r   r   r   es          r   
_db_lookupr"   #   s    <<#D ::dD	$KKKK
$ 	# 	#G'NNNB6?DS,,44S<<DD "K	# ###588888888#s0   #B( /*BB( BB( (
C2CCdebec                    t                               d| z   dz   dd          j        }n'#  t          d           t	          | ||          cY S xY wt
                              |          }t          |           g }|d         D ]}|d         sd	|d
         d         v rs|d
         d                             d          d                             d          d                             d          d                             d          d         }nr|d
         d                             d          d                             d          d                             d          d                             d          d         }d|v r|                    dd          }n|                    dd          }|dk    rd}|d         d         }|d         d d         }|d         d         }	|	dk    rd}	n,|	dk    rd}	n#|	dk    rd}	n|	d k    rd}	n|	d!k    rd!}	n|	d"k    rd#}	|	dk    s|	dk    r>|                    d$d                              d%d                              d&d          }d'|v r|                    d(d          }d)|v r|                    d)d*           d+|v r|                    d+d*           |                    d,d-          }|d.|d d         |                    d/d0          |		                                d1g d2}
|
                    |
           t          |          r#|t          j        |         |         |          d<   |S d S )3Nz$https://v6.vbb.transport.rest/stops/D/departures?duration=60&linesOfStops=false&remarks=false&language=en   FtimeoutverifyzFALLBACK TO DB
departureswhenBrandenburg, destinationr   [r   ,    /r   ,zBerlin HauptbahnhofzBerlin r   HauptbahnhofHbfline   productsubwaymetroregionaltrainexpresssuburbantramferryshipzS+U zS zU zS+UBhfzFriedrich-Ludwig-zF.-L.-zFriedrich-Ludw.-zFriedrich-Ludw.zF.-L.0-.r   transport_moder.   direction_codeexpectedr6   
deviations)r   r   r   r   db_load_departuresr   r   r   r   upperappendlenv	operators)r   countryr   r   resultsr+   r   r6   _time__type
new_records              r   be_load_departuresrW   9   s   CGK  MS  S  ]^  gl  m  m  r?!'8W==>>>::dD	$KKKG<( #' #'
f%/x*]";F"CCC"=1&9??DDQGMMdSSTUV\\]`aabcdjjknoopqr#M26:@@EEaHNNsSSTUV\\]`aabcdjjknoopqr$$,,T\\)R5P5PddnU;;$u}}^d f%f-Dv&ss+E'	2F!!G66:%%vv9$$wff:%%vv6!!F667""VF  Fg$5$5VR0088rBBJJ4QSTT}}T\\%%<%<d"d**DLL9Lh,W,W,W!T))4<<8JH+U+U+U<< 17;;D*.+.%*3B3Z(,S(=(=PVP\P\P^P^!_!_&(	* *J
 NN:&&&&
7|| @GGX&w/= s	   (* "Adbc                    t          d           t                              d| z   dz   dd          j        }t                              |          }t          |           g }|d         D ]6}|d         s|d	         }	 |                    d
          d         }|                    d          d         }n#  Y nxY w|d         d                             dd                              dd          }n#  |d         d         }Y nxY w|                    dd          }d|v rd|v r	 d|v sd|v r)t          |           |dd          dz   |z   }|d d         }n#  Y nxY w|s|d         d         }n#  Y xY w|d         d d         }|d         d         }	nD# t          $ r7}
t          |
           |d         d         }	|d	         }n#  Y nxY wY d }
~
nd }
~
ww xY wd|	v rd}	|	dk    rd}	nP|	dk    rd }	nG|	d!k    rd }	n>|	d"k    rd }	n5|	d#k    rd }	n,|	d$k    rd }	n#|	d%k    rd }	n|	d&k    rd&}	n|	d'k    rd(}	n|	d)k    rd}	|                    d*d+          d,|d d         |                    d-d.          |		                                d/g d0}|
                    |           8t          t          |          |           t          |          r#|t          j        |         |         |          d<   |S d S )1NzDEUTSCHE BAHNz#https://v6.db.transport.rest/stops/r&   r'   Fr(   r+   r,   	directionz ,r   z (r6   r    r   BusfahrtNrSTRASTALFRBREr
   r7   r8   r   busr9   r:   r;   r<   nationalnationalExpressregionalExpressr=   r>   r?   r@   rA   taxiauptbahnhofbfrC   rD   rE   rF   rH   )r   r   r   r   r   r   r   r   r   rM   rN   rO   rP   rQ   )r   rR   r   r   rS   r+   r   r6   rT   rU   r!   rV   s               r   _db_load_departuresrj   n   s   	/<<=gE  GM  M  WX  af<  g  g  lD::dD	$KKKG<( ?' ?'
f%/xk*D

4((+

4((+DD #6*62::3rBBJJ5QSTT8:f-i8DDD<<r**D}}h}}h4<<44<<4[[[ HsNT1T !HTDD !&v.v6TT  v&ss+E$V,Y7   q$V,T2'4dd	 !!G66:%%vv:%%vv,,,wff,,,wff9$$wff:%%vv6!!F667""VFF6!!E6 +/,,}d*K*K+.%*3B3Z(,S(=(=PVP\P\P^P^!_!_&(	* *J
 NN:&&&& 
#g,,   
7|| @GGX&w/= s`    6B77B;>6C55D+1EE!&E55E:F
G&GGGGGGc                    t                               d|z             j        }t                              |          }i }t          |d         d                   D ]\  }}dt          t          |                    v r|d         d         }|D ]r}t          ||         d                    	 ||         d         d         }||         d         	                    d          
                    d	          }|||<   l#  Y pxY w|d         d         }|d         	                    d          
                    d	          }|||<   |d
k    r n|S )Nhttps://efa.vrr.de/dsw3p/XML_STOPFINDER_REQUEST?anyObjFilter_sf=2&coordOutputFormat=EPSG%3A4326&outputFormat=json&type_sf=any&name_sf=
stopFinderpointsstrrefgidr   latin1utf8   )r   r   r   r   r   	enumeratero   typer   encodedecode	r   r   r   r   xzir   r   s	            r   
vrr_lookupr}      si   <<  a  dk  k  l  l  qD::dDK\ 28 <==  
7CW&&&&\"8,A  ad5k"""1eU+BQ4<..x88??GGD(*K%% &B6?))(33::6BBD "K2vvuuvs   +AC99C=c                 V   t                               d|z             j        }t                              |          }i }t          |d         d                   D ]N\  }}|d         d         }|d                             d                              d          }|||<   |d	k    r nO|S )
Nrl   rm   rn   rp   rq   r   rr   rs   rt   )r   r   r   r   r   ru   rw   rx   )r   r   r   r   rz   r   r   s          r   _old_vrr_lookupr      s    <<  a  dk  k  l  l  qD::dDK\ 28 <==  
7 U^E"v%%h//66v>>Dr66556    vrrc                    t          d           t          |            t                              d| z   dz             j        }n&# t          $ r}t          |           Y d }~nd }~ww xY wt
                              |          }g }|d         D ]d         d                             d                              d          }n	#  d	}Y nxY w	 d         d
                             d                              d          }n#  t          d           d}Y nxY w	 |d         d         d         d         d                             d                              d          }|	                    |dz   d          }n#  t          d           Y nxY wd}		 d         d         d
         }	|	dk    rd}	|	dk    rd}	n&# t          $ r}t          |           Y d }~nd }~ww xY wd         d         
                    d          d         }
fd}g }	  |d          }t          d            n/#  	  |d!          }t          d"|           d#}n	#  d$}Y nxY wY nxY wd}	 t          d         d%                   }t          d&|           n#  Y nxY w|r	 t          j                            |d'          }|t          j        |(          z  }|                    d'          }t          d)|           n'# t          $ r}t          d*|           Y d }~nd }~ww xY w	 |	                    d+d,          }|
                    d          d         }|
                    d-          d         }n#  t          d.           Y nxY wd         d         	                    dd          	                    d/d          }
|

                    d          d         }
	 |
dk    rd         d0         }
n&# t          $ r}t          |           Y d }~nd }~ww xY w	 	 t          d1d2         d3                    d4         }n#  Y nxY w	 d5|
                                v sd5|                                v rd5}n#  Y nxY w|                                }d6|                                v sd7|                                v rd8}|d9k    rd:}n|d;k    rd8}n|d<k    rd8}n|d=k    rd8}n|d>k    rd8}n|d?k    rd8}n|d@k    rd8}n|dAk    rdA}n|dBk    rdC}n|dDk    rd5}n|d7k    rd8}n|dEk    rd:}n|dFk    rd8}n|dGk    rd5}n}|dHk    rdA}ntd5|v rd5}nmdI|v rd8}nfdJ|v rd8}n_d5|v rd5}nXd8|v rd8}nQdK|v rdA}nJdL|v rdA}nCdM|v rdA}n<dN|v rd8}n5dO|v rd8}n.dP|v rd5}n'dQ|v rdA}n dR|v rd5}ndS|v rd5}nt          dT|           d	}	 dUd         d         dV         v r_|	                    dWd                                          }|	                    dXd                                          }t          |           dYd         d         dV         v r(|	                    dZd                                          }d[d         d         dV         v r(|	                    d\d                                          }d[d         d         dV         v r(|	                    d]d                                          }n#  Y nxY w|	                    d^d_          }|	                    d`d          }|dak    rdb}|	                    dcd          }|}||	|d dd         |
	                    dedf          |                                dg|dh}||v r|                    |           t          dit)          |                     t)          |          r#|t*          j        |         |         |          dj<   |S d S )kNSTATION: VRRzhttps://efa.vrr.de/dsw3p/XML_DM_REQUEST?depSequence=30&depType=stopEvents&includeCompleteStopSeq=0&itdDateTimeDepArr=dep&language=de&maxTimeLoop=1&mode=direct&name_dm=]&outputFormat=JSON&ptOptionsActive=1&sl3plusDMMacro=1&type_dm=any&useAllStops=1&useRealtime=1departureListservingLiner   rr   rs   UNKNOWNrZ   FAIL?dmrn   pointrp   placer[   r   $Could not remove 'place' from 'name'rC   liErgRiProjR1H2numberr   r   c                    d}d}t          |                    D ]O\  }}|dk    rd}|dk    rd}|dk    r|dz  }!d         |         }t          |          d	k    rd
|z   }|||z   z  }P|                    dd          dz   }|S Nr   r   rD      r	   weekdayTdateTimer1   rC   zT:z:00ru   rO   r   rT   r,   seprz   r|   zzr+   s         r   get_timez%vrr_load_departures.<locals>.get_time	      %j&788 	% 	%DAq1uuCc1uuCcI~~ #J/2B2ww!||#(RC"H$DD||D#..6r   realDateTimeRTr   zSCHEDULED: #20250101T00:00:00delayzDELAY:%Y-%m-%dT%H:%M:%S)minuteszRT (corrected):zDelay apply error:z(+)+r/   
Name fail!r\   symbol	PRODUCT: r6   r8   r.   rc   	stadtbahns-bahnr<   r9   r:   r;   rd   re   rf   r=   r>   r?   r@   rA   rg   u-bahnregionalzugnesbrerbstrabstraniederflurstrabzugr-bahnsevschwebebahnersatzverkehreinsatzFailed to find __type: dswnetwork	Dortmund z
Dortmund, vbbr-   vrsu   KÃ¶ln zBergisch Gladbach rh   ri   r0   r5   r4     r7   rD   rE   rF   rH   LEN: r+   )r   r   r   r   r   r   r   rw   rx   r   r   intdatetimestrptime	timedeltastrftimelowerlstriprM   rN   rO   rP   rQ   )r   r   rR   r   r!   rS   rU   r   
place_namerZ   r6   r   rK   r,   r   dtrT   rV   r+   s                     @r   vrr_load_departuresr      sb	   	.	'NNN||  F  IP  P  Sr  r  s  s  x###588888888#::dDG?+ {' {'
 %]3F;BB8LLSSTZ[[&YFFF"=1+>EEhOOVVW]^^vB"4j27;EB7KRRS[\\ccdjkkZ#%5r::AE@AAAAAI,'6}EkR$$#i$$#i+++588888888+ m,X6<<SAA!DD     J3x//d33$HZ00T=$///"%ZZ22 EJ}5g>??h&&&& 33!*33D:MNNB(,U;;;;B;;':;;D+T2222  3 3 3.222222223U3//

3*

3*|$$$ m,X6>>s2FFNNuUWXXD::c??1%D,BJJz-'@'J+++588888888+$
{Jv$6y$ABBB"=1DDTZZ\\))Udjjll-B-B$fDD\\^^Ffllnn,,FLLNN0J0JU\F!!G66:%%vv:%%vv,,,wff,,,wff9$$wff:%%vv6!!F667""VFF6!!E668##gVV8##gVV=((7&&4%4&&5&&''&5&&F""WFFF""VFF6!!F66"f,,vff&7&&V##gVV&5&&&((6&& F**UFFf$$uff0&999#Z6}EiPPP<<R88??AAD<<b99@@BBD$KKKZ6}EiPPP<<<<CCEEDZ6}EiPPP<<
B77>>@@DZ6}EiPPP<<(<bAAHHJJDDD <<d33D<<c**Du}}^d<<c**DE*.+4%*3B3Z(,S(=(=PVP\P\P^P^!_!_&0	2 2J
 W$$hNN:&&&&	'3w<<   
7|| @GGX&w/= s   %A 
A)A$$A)4CC4DD AF  F$F>>
G!GG!H..I1IIII +JJAK44
L>LLAM))M<O&&
P	0PP	$P33P7;.Q**Q./D/[[#c                 "    t          | |          S )N)	r}   r   r   r   r   r   r   r   r   r    s          r   r   r     s    h(((r   c                 *    t          | dd          S )NrX   r#   r   rR   )
r   	xmltodictr   r   r   extendrO   rP   colorrQ   	r   r   rR   r   rS   add_departuresort_by_timer   r   s	          @@r   rL   rL     s    wtDDDDr   c                 &    t          | dd          S )Nr   r#   r   )r   r   r   r   r   r   r   r   r   r   r   ro   rM   rN   rO   rP   rQ   )r   r   rR   r   rS   r+   r   r!   r6   	scheduledrT   rU   rV   s                r   ___db_load_departuresr   0  s    wEEEEr   c                 p   t                               d|z   dz             j        }t                              |          }i }	 |D ]I}|d         }|d         }|                    dd                              dd          }n#  Y nxY w|||<   Jn&# t          $ r}t          |           Y d }~nd }~ww xY w|S )NzBhttps://int.bahn.de/web/api/reiseloesung/orte?typ=ALL&suchbegriff=z&limit=5extIdr   r   r   r   )r   r   r   r   r   r   r   r   r    s          r   db_trains_lookupr     s    <<\]ddeooppuD::dDK$ 	# 	#G!B6?DS,,44S<<DD "K	# ###588888888#s0   B *BB BB 
B3B..B3c                 x   dd l dd lddlm} g }dfd	} ||           }|                     || d                     d } ||          }t	          |          rXt          t          j        d         d	z   t          j        d
         z              |t          j        |         |         |          d<   |S |S )Nr   )r   Fc                    ddl m }m}  |j                    }|r| |d          z   }|                    d          dd          }|                    d          }t	          d|            t	          d	|            t	          ||z              d
| z   dz   |z   dz   |z   }d| z   dz   |z   dz   |z   }t
          t          d}t	          |           t                              ||          j	        }	t	          |	           
                    |	          }	                    |	dd          }
                    |
          }	g }|	d         d         D ]m}t	                       t	          |g           t	          d           |d          n<#  t	          t          j        d         dz   t          j        d         z              Y rxY w|d         d         }n	#  d}Y nxY w	 |d         }|d         d         }n#  |d         d         }Y nxY wn<#  t	          t          j        d         dz   t          j        d         z              Y xY w|d         d         }n=#  t	          t          j        d         dz   t          j        d         z              Y @xY w|d k    rd!}n|d"k    rd#}n|d$k    rd!}n|d%k    rd#}nd}|d         d&         }|                    d'          d(d          }|d         }n#  Y nxY w |j        |d)          }|                    d*          }d+}|                    d,d-          }t	          t          j        d.         |z   ||||           t	          t          j        d                    ||||                    d/d0          |                                d1g d2}|                    |           o|S )3Nr   )r   r   r1   hoursz%Y%m%dr
   %Hzd=zt=z1https://iris.noncd.db.de/iris-tts/timetable/plan/r2   zIhttps://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/plan/r   headersF)indentensure_ascii	timetablesz--------------dpyellowzNot departing!whitetlz@frC   z@lz@fbzCould not determine linez@ppthzCould not determine NAMENr   Sr   FDz@pt|
%y%m%d%H%Mr   TRAINr[   r   redrD   rE   rF   rH   )r   r   nowr   r   API_IDAPI_KEYr   r   r   parsedumpsr   rP   r   r   r   r   rM   rN   )r   plushourr   r   r   dturlr   r   json_outputrS   r|   rZ   r6   r   r,   r   rU   rV   r   r   s                       r   r   z1_db_trains_load_departures.<locals>.add_departure  s	   00000000hlnn 	+		****CLL""122&LLh1hhh1hhac


A'I#MaOPSSTUUYZaabeefgghkklmm  	c


||C|116d t$$ jjaejDDzz+&&k"3' +	' +	'AGGG1#JJJ"###4agh'*::QWW=MMNNNtWT]#IIIwdGDMTT-qwu~agh'*DDqwwGWWXXX$(agh'*DDqwwGWWXXXCSc!!s99c!!s99c!!s99!) T75>D::c??233'DQDD""466B;;233DF<<B''D!'%.4'D$GGG!''"###*.+4%)(,S(=(=PVP\P\P^P^!_!_&(	* *J
 NN:&&&&sT   F7G	GG"H*G98H9H	H7II7J(K11K5T)r   c                     t          | t                    s| S |                     d          }t          |t                    s| S |                    d            | S )Nr+   c                 .    |                      dd          S )NrJ   r   )r   )r   s    r   <lambda>zB_db_trains_load_departures.<locals>.sort_by_time.<locals>.<lambda>  s    aeeJ&;&; r   key)
isinstancedictr   listsort)r   r+   s     r   r   z0_db_trains_load_departures.<locals>.sort_by_time  s^    $%% 	KXXl++
*d++ 	K;;<<<r   greenSuccessr   r+   )F)	r   r   r   r   rO   r   rP   r   rQ   r   s	          @@r   _db_trains_load_departuresr
    s   KKK!!!!!!GM M M M M M M^ mG$$GNN==4888999
 
 
 l7##G
7|| agg*QWW-==>>>@GGX&w/=Nr   c                     t            d|  d| d| }t                              |t                    }|j        dk    rt          d|j        |j                   dS t                              |j                  S )z'Fetch planned departures for a station.z/plan/r2   r      zError fetching plan:N	BASE_URLr   r   r   status_coder   r   ET
fromstring)evadatehourr   rs        r   
fetch_planr  
  sw    
0
0S
0
04
0
0$
0
0CS'**A}$amQV<<<t==   r   c                     t            d|  }t                              |t                    }|j        dk    rt          d|j        |j                   dS t                              |j                  S )z&Fetch real-time changes for a station.z/fchg/r   r  zError fetching changes:Nr  )r  r   r  s      r   fetch_changesr    sg    
"
"S
"
"CS'**A}'???t==   r   c           	         i }|                      d          D ]}|                    d          }|                    d          }|/|                    d          }d}|.|                    dd           |                    dd           }|                    d	d          }|r|                    d
          d         nd}||                    d          |                    d          ||                    d	          i |d||<   |S )z7Parse planned departures into a dict keyed by train ID.r   r   r   Nr   cr   nppthr   r   ptpp)train_idtime_plannedplatform_plannedr6   r.   changesheadsign)findallr   findr   )	xml_rootr+   r   r  r   r   r6   r  r#  s	            r   
parse_planr'    s   Jc"" 
 
55;;VVD\\:VVD\\>ffS"oo8rvvc288Dvvfb!!*.84::c??2&&D !FF4LL "t66&>>  
  

8 r   c                    |                     d          D ]}|                    d          }|| vr|                    d          }|4|                    d          r$|                    d          | |         d         d<   |                    d          r$|                    d          | |         d         d	<   |                    d
          r$|                    d
          | |         d         d<   | S )z2Apply real-time changes to the planned departures.r   r   r   Nctr"  time_actualcpplatform_actualcsstatus)r$  r   r%  )r+   r&  r   r  r   s        r   apply_changesr/  ;  s    c"" E E55;;:%%VVD\\:66$<< 	J=?VVD\\Jx +M:66$<< 	NACJx +,=>66$<< 	E8:tJx +H5r   c                 l    t           j                             | d          }|                    d          S )Nr   r   )r   r   r   )tsr   s     r   iris_to_isor2  P  s-    			#	#B	5	5B;;*+++r   c                 j   t          d           g }t          |                                 d           D ]#}|d         }|d                             d|          }|d                             d|d                   }|d                             d	d
          }|dk    rt          d           {|                    dd          }t	          |          dk    r|d         dk    rd|d         z   }|                    dd          }	t          ||	|           |	dt          |          |                    dd          ddg d}
|                    |
           %|rVt          t          j	        d         dz   t          j	        d         z              |t          j
        d         d         |         d<   |S ) Nz#
=== REAL-TIME DEPARTURE BOARD ===
c                     | d         S )Nr    )rz   s    r   r  zprint_board.<locals>.<lambda>Z  s    1^;L r   r  r   r"  r*  r,  r!  r.  r   r  z  CANCELLEDr6   u   â€”   r   r   r   r#  rC   rD   rE   r   rF   rH   r  r	  r   r#   	db_trainsr+   )r   sortedvaluesr   rO   r2  r   rN   rP   r   rQ   )r+   r   rS   r<   plannedactualplatformr.  r6   r   rV   s              r   print_boardr=  U  s   	
1222G
))++1L1LMMM # #'y!%%mW==#''(95AS;TUUy!%%h33S==-   yy,,t99>>d1gnnS47]dyyZ00dD&!!!  !#F++<<S11WMM
 

 	z"""" Hagg*QWW-==>>>@GD+&w/=Nr   r7  c                 T   t           j                                         }|                    d          }|                    d          }|t          j        d          z   }|                    d          }|                    d          }t	          | ||          }	t	          | ||          }
t          |           }i }|	"|                    t          |	                     |
"|                    t          |
                     |t          ||          }t          ||            d S )Nz%y%m%dr   r1   r   )
r   r   r   r   r  r  updater'  r/  r=  )r   rR   r   r   date1hour1	next_timedate2hour2
plan_xml_1
plan_xml_2changes_xmlr+   s                r   db_trains_load_departuresrH  }  s%   




!
!C LL""ELLE h(q1111Ix((Et$$E GUE22JGUE22J((K J*Z00111*Z00111 ":{;;
 
G$$$$$r   c                    t                               d|z             j        }t                              |          }i }t          |d         d                   D ]\  }}dt          t          |                    v r^|d         d         }|D ]L}t          ||         d                    	 ||         d         d         }||         d         }|||<   F#  Y JxY w|d         d         }|d         }|||<   |dk    r n|S )	Nzhttps://projekte.kvv-efa.de/sl3-alone/XML_STOPFINDER_REQUEST?anyObjFilter_sf=2&coordOutputFormat=EPSG%3A4326&outputFormat=json&type_sf=any&name_sf=rm   rn   ro   rp   rq   r   rt   )	r   r   r   r   r   ru   ro   rv   r   ry   s	            r   
kvv_lookuprJ    s1   <<  n  qx  x  y  y  ~D::dDK\ 28 <==  
7CW&&&&\"8,A  ad5k"""1eU+BQ4<D(*K%% &B6?D "K2vvuuvs   +'CCkvvc                    t          d           t          |            t                              d| z   dz             j        }n&# t          $ r}t          |           Y d }~nd }~ww xY wt
                              |          }g }|d         D ]d         d         }n	#  d}Y nxY w	 d         d         }n#  t          d	           d
}Y nxY w	 |d         d         d         d         d         }|                    |dz   d          }n#  t          d           Y nxY wd}		 d         d         d         }	|	dk    rd}	|	dk    rd}	n&# t          $ r}t          |           Y d }~nd }~ww xY wd         d                             d          d         }
fd}g }	  |d          }t          d           n.#  	  |d          }t          d            d!}n	#  d"}Y nxY wY nxY w	 |                    d          d         }|                    d#          d         }n#  t          d$           Y nxY wd         d                             dd                              d%d          }
|
                    d          d         }
	 |
dk    rd         d&         }
n&# t          $ r}t          |           Y d }~nd }~ww xY w	 	 t          d'd(         d)                    d*         }n#  Y nxY w	 d+|
	                                v sd+|	                                v rd+}n#  Y nxY w|	                                }d,|	                                v sd-|	                                v rd.}|d/k    rd0}n|d1k    rd.}n|d2k    rd.}n|d3k    rd.}n|d4k    rd.}n|d5k    rd.}n|d6k    rd.}n|d7k    rd7}n|d8k    rd9}n|d:k    rd+}n|d-k    rd.}n|d;k    rd0}n|d<k    rd.}n|d=k    rd+}n}|d>k    rd7}ntd+|v rd+}nmd?|v rd.}nfd@|v rd.}n_d+|v rd+}nXd.|v rd.}nQdA|v rd7}nJdB|v rd7}nCdC|v rd7}n<dD|v rd.}n5dE|v rd.}n.dF|v rd+}n'dG|v rd7}n dH|v rd+}ndI|v rd+}nt          dJ|           d}	 dKd         d         dL         v r(|                    dMd          
                                }dNd         d         dL         v r(|                    dOd          
                                }n#  Y nxY w|                    dPdQ          }|                    dRd          }|dSk    rdT}|                    dUd          }|}||	|d dV         |
                    dWdX          |                                dY|dZ}||v r|                    |           t          d[t          |                     t          |          r#|t          j        |         |         |          d\<   |S d S )]Nr   zhttps://projekte.kvv-efa.de/sl3-alone/XML_DM_REQUEST?depSequence=30&depType=stopEvents&includeCompleteStopSeq=0&itdDateTimeDepArr=dep&language=de&maxTimeLoop=1&mode=direct&name_dm=r   r   r   r   r   rZ   r   r   r   rn   r   rp   r   r[   r   r   rC   r   r   r   r   r   r   r   r   c                    d}d}t          |                    D ]O\  }}|dk    rd}|dk    rd}|dk    r|dz  }!d         |         }t          |          d	k    rd
|z   }|||z   z  }P|                    dd          dz   }|S r   r   r   s         r   r   z%kvv_load_departures.<locals>.get_time  r   r   r   r   r   	SCHEDULEDr   r   r/   r   r\   r   r   r6   r8   r.   rc   r   r   r<   r9   r:   r;   rd   re   rf   r=   r>   r?   r@   rA   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   rh   ri   r0   r5   r4   r   r7   rD   rE   rF   rH   r   r+   )r   r   r   r   r   r   r   r   r   r   r   rM   rN   rO   rP   rQ   )r   r   rR   r   r!   rS   rU   r   r   rZ   r6   r   rK   r,   rT   rV   r+   s                   @r   kvv_load_departuresrO    sq   	.	'NNN||  S  V]  ]  `    @  @  E###588888888#::dDG?+ b' b'
 %]3F;&YFFF"=1+>vB"4j27;EB7KZ#%5r::AE@AAAAAI,'6}EkR$$#i$$#i+++588888888+ m,X6<<SAA!DD     J3x//d33$HZ00T;'''"%ZZ22


3*

3*|$$$ m,X6>>s2FFNNuUWXXD::c??1%D,BJJz-'@'J+++588888888+$
{Jv$6y$ABBB"=1DDTZZ\\))Udjjll-B-B$fDD\\^^Ffllnn,,FLLNN0J0JU\F!!G66:%%vv:%%vv,,,wff,,,wff9$$wff:%%vv6!!F667""VFF6!!E668##gVV8##gVV=((7&&4%4&&5&&''&5&&F""WFFF""VFF6!!F66"f,,vff&7&&V##gVV&5&&&((6&& F**UFFf$$uff0&999#Z6}EiPPP<<R88??AADZ6}EiPPP<<<<CCEEDDD <<d33D<<c**Du}}^d<<c**DE*.+4%*3B3Z(,S(=(=PVP\P\P^P^!_!_&0	2 2J
 W$$hNN:&&&&	'3w<<   
7|| @GGX&w/= s   %A 
A)A$$A)B""B(,B;;C9DD!'$E
E/E**E/!F<<G'?GG'G" G'+6H""H5
J
K)J==K$K,,K04.L##L'(A<S%%S)z$2f2f720d-5c27-4d8b-aaba-ffdd7c4a848cc                    d }d                     |t                    }t                              |                                          }i }|                    dg           }|D ][}|                    d          }|s|                    d          }	|                    d          }
|	r|
sI ||
          }|r|||	<   \|S )Nc                 x    |                      d          D ]#}|                    d          r|dd         c S $dS )z:Extracts the numeric stop ID from a HAFAS location string.@zL=r
   N)r   
startswith)	hafas_strparts     r   extract_hafas_stop_idz)rmv_lookup.<locals>.extract_hafas_stop_idj  sL    OOC(( 	  	 Dt$$  ABBx tr   zPhttps://www.rmv.de/hapi/location.name?input={station}&format=json&accessId={key})r   r  stopLocationOrCoordLocationStopLocationr   r   )formatRMV_API_KEYr   r   r   )r   r   rV  r   r   r   itemsitemstopr   raw_idstop_ids               r   
rmv_lookupr`  i  s      	6fW+f.. 
 <<!!##DKHH2B77E ( (xx'' 	xx$ 	6 	''// 	( 'Kr   rmvc                 J   | }t          d           t          d|           	 t                              d|z   dz   t          z             j        }n)# t
          $ r}t          d|           g cY d }~S d }~ww xY w	 t                              |          }n)# t
          $ r}t          d|           g cY d }~S d }~ww xY wt          dt          |	                                                     g }	 t          |d                   t          k    r|d         }t          d	           n#  Y nxY w	 t          |d
         d                   t          k    r|d
         d         }t          d           n#  Y nxY w	 |g k    rt          d           |g}n#  Y nxY wt          dt          |                     g }|D ]}	 |d         rn#  Y nxY w	 |d         }	nK#  	 |d         d         }	n4#  	 |d         d                             dd          }	n	#  d}	Y nxY wY nxY wY nxY w	 |d         }
n	#  d}
Y nxY w	 |d         dz   |d         z   }n&#  	 |d         dz   |d         z   }n	#  d}Y nxY wY nxY w	 |d         d         d         }n	#  d }Y nxY w|                                }d!|v rd"}n|d#k    rd$}nd%|v sd&|v sd'|v rd$}nd(|v rd(}|                                }|
                    d)d          }
t          |	|
||           |
t          |t                     r|                    d*d+          nd+||	|d,g d-}|                    |           t          d.t          |                     t          |          r#|t$          j        |         |         |          d/<   |S d S )0NzSTATION: RMVzID:z*https://www.rmv.de/hapi/departureBoard?id=z%&maxJourneys=50&format=json&accessId=zREQUEST ERROR:zJSON ERROR:zRAW RESPONSE KEYS:	DeparturezUSING: data['Departure']DepartureBoardz*USING: data['DepartureBoard']['Departure']zSINGLE OBJECT MODEzDEPARTURE COUNT:	cancelledr   ProductAtStopr6   r   r[   r   r   rZ   rtDater   rtTimer  timer   Productr   catOutr   r   r:   r   r<   r   r   icerc   zFrankfurt (Main) directionFlagrC   rF   rH   zFINAL RESULT COUNT:r+   )r   r   r   rZ  r   r   r   r   r  keysrv   rO   r   r   rM   r  r  rN   rP   rQ   )r   r   rR   
station_idr   r!   r+   rS   depr6   rZ   r,   moderV   s                 r   rmv_load_departuresrr    s   J	.	%	||856 
 

  	    """						zz$   mQ						 

TYY[[ 1 1222
 J[!""d**k*J,---%&{344<<./<J>??? &'''J	
c*oo...G
  @# @#	;))		#x=DD	##?+F3##/7??RHHDD"s	K(II	III	+x=3&X6DD	++6{S(3v;6+*
	y>!$X.DD	DDDzz||tGTTS[[$$T\\TT\\Ud]]7DDd]]5Dzz||%%&92>>	dItT*** %?I#t?T?T]cggos;;;Z]"&  	
 	

 	z""""	
W...
7|| @GGX&w/= s   -A 
A7A2,A72A7;B 
B< B71B<7B<15D' 'D+/AE1 1E59F F>GGGH!G+*H!+H."HHH	HH!%H..H48II0I%$I0%I+)I04J		J)r#   r$   )r#   rX   )r   r#   )rX   r#   )r#   r7  )rK  r#   )ra  r#   )rP   r   r  r   r   r   r   r"   rW   rj   r}   r   r   r   rL   r   r   r
  r  r  r'  r/  r2  r=  rH  rJ  rO  rZ  r`  rr  r5  r   r   <module>rs     s      Q	+
,       ,0 0 0 0jN N N Nd  *  I I I Iz  "] ] ] ]~W W W W|   j j j jX! ! !! ! !  :  *, , ,
% % %P% % % %@  *p p p pj 5  DB B B B B Br   