a
    ‚i¼  ã                   @   s   d dl Z d dl T d dlZdZdZdZeedœZdd„ Zd	d
„ Zd=dd„Zd>dd„Z	dd„ Z
dd„ Zd?dd„Zdd„ Zd@dd„ZdAdd„Zdd „ ZdBd!d"„Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ ZdCd0d1„Zd2d3„ ZdDd5d6„Zd7Zd8d9„ ZdEd;d<„ZdS )Fé    N)Ú*zChttps://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1Z 344fe116f7a98031feeeeb9bee2cd80cZ e5f8780ae69a85b9398e9d2cabad1583©zDB-Client-Idz
DB-Api-Keyc                 C   s~   zt  d| d ¡j}W n   t| |ƒ Y S 0 t|ƒ t |¡}i }|D ].}|| d  d¡d }|| d }|||< qJ|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   © r   ú/var/www/html/germany.pyÚ	be_lookup   s    

r   c              
   C   s¨   t  d¡j}t |¡}t|ƒ i }zT|D ]J}t|ƒ |d }|d }z| dd¡ dd¡}W n   Y n0 |||< q(W n, ty¢ } zt|ƒ W Y d }~n
d }~0 0 |S )Nz   r   r   ú(Ú ú))r   r	   r
   r   r   r   ÚreplaceÚ	Exception©r   r   r   r   r   r   Úer   r   r   Ú
_db_lookup#   s    
,r   ÚdeÚbec                 C   s|  zt jd|  d dddj}W n    tdƒ t| ||ƒ Y S 0 t |¡}t|ƒ g }|d D ]ò}|d snq^d	|d
 d v r´|d
 d  d¡d  d¡d  d¡d  d¡d }n4|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rRd}	nN|	dkrbd}	n>|	dkrrd}	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œ}
| 
|
¡ q^t|ƒrx|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ÚshipúS+U úS ú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Úexpectedr1   Ú
deviations)r   r	   r
   r   Údb_load_departuresr   r   r   r   ÚupperÚappendÚlenÚvÚ	operators)r   Úcountryr   r   Úresultsr&   r   r1   Ú_timeÚ__typeÚ
new_recordr   r   r   Úbe_load_departures9   sP     

64
ü
rU   Údbc                 C   sê  t dƒ tjd|  d dddj}t |¡}t |ƒ g }|d D ]p}|d sPq@|d	 }z | d
¡d }| d¡d }W n   Y n0 z |d d  dd¡ dd¡}W n   |d d }Y n0 | dd¡}d|v rÖq@d|v ràq@z>d|v sôd|v rt |ƒ |dd … d | }|d d… }W n   Y n0 |sTz|d d }W n   Y q@Y n0 |d d d… }z|d d }	W nT tyÈ }
 z:t |
ƒ |d d }	z|d	 }W n   Y n0 W Y d }
~
n
d }
~
0 0 d|	v rØd}	|	dkrèd}	nŽ|	dkrød }	n~|	d!krd }	nn|	d"krd }	n^|	d#kr(d }	nN|	d$kr8d }	n>|	d%krHd }	n.|	d&krXd&}	n|	d'krhd(}	n|	d)krvd}	| d*d+¡d,|d d… | d-d.¡|	 	¡ d/œg d0œ}| 
|¡ q@t t|ƒ|ƒ t|ƒræ|tj| | |  d< |S d S )2NzDEUTSCHE BAHNz#https://v6.db.transport.rest/stops/r!   r"   Fr#   r&   r'   Ú	directionz ,r   ú (r1   r   ú r   ÚBusZfahrtNrZSTRÚASTZALFZRBZREr   r2   r3   r   Úbusr4   r5   r6   r7   ÚnationalÚnationalExpressÚregionalExpressr8   r9   r:   r;   r<   ÚtaxiÚauptbahnhofÚbfrA   rB   rC   rD   rF   ÚSuccess)r   r   r	   r
   r   r   r   r   r   rK   rL   rM   rN   rO   )r   rP   r   r   rQ   r&   r   r1   rR   rS   r   rT   r   r   r   Ú_db_load_departuresn   sp    

"

"

ü
rd   c           	      C   sê   t  d| ¡j}t |¡}i }t|d d ƒD ]¶\}}dtt|ƒƒv r°|d d }|D ]V}t|| d ƒ z4|| d d }|| d  	d¡ 
d	¡}|||< W qV   Y qV0 qVq.|d d }|d  	d¡ 
d	¡}|||< |d
kr. qæq.|S )Nú†https://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   Ú	enumeraterh   Útyper   ÚencodeÚdecode©	r   r   r   r   ÚxÚzÚir   r   r   r   r   Ú
vrr_lookupÀ   s$    
rv   c                 C   sp   t  d| ¡j}t |¡}i }t|d d ƒD ]<\}}|d d }|d  d¡ d¡}|||< |d	kr. qlq.|S )
Nre   rf   rg   ri   rj   r   rk   rl   rm   )r   r	   r
   r   r   rn   rp   rq   )r   r   r   r   rs   r   r   r   r   r   Ú_old_vrr_lookupÕ   s    
rw   Úvrrc                    s4  t dƒ t | ƒ zt d|  d ¡j}W n, tyT } zt |ƒ W Y d }~n
d }~0 0 t |¡}g }|d D ]Ž‰ zˆ d d  d¡ d¡}W n   d	}Y n0 zˆ d d
  d¡ d¡}W n   t dƒ d}Y n0 z8|d d d d d  d¡ d¡}| 	|d d¡}W n   t dƒ Y n0 d}	z0ˆ d d d
 }	|	dkrHd}	|	dkrVd}	W n. ty† } zt |ƒ W Y d }~n
d }~0 0 ˆ d d  
d¡d }
‡ fdd„}g }z|d ƒ}t d!ƒ W n6   z|d"ƒ}t d#ƒ d$}W n   d%}Y n0 Y n0 d}ztˆ d d& ƒ}t d'|ƒ W n   Y n0 |r˜z6tj |d(¡}|tj|d)7 }| d(¡}t d*|ƒ W n0 ty– } zt d+|ƒ W Y d }~n
d }~0 0 z,| 	d,d-¡}| 
d¡d }| 
d.¡d }W n   t d/ƒ Y n0 ˆ d d  	dd¡ 	d0d¡}
|
 
d¡d }
z|
dkrˆ d d1 }
W n. tyL } zt |ƒ W Y d }~n
d }~0 0 zt d2ˆ d3 d4 ƒ ˆ d5 }W n   Y n0 z$d6|
 ¡ v s˜d6| ¡ v rœd6}W n   Y n0 | ¡ }d7| ¡ v sÐd8| ¡ v rÔd9}|d:kræd;}næ|d<krød9}nÔ|d=kr
d9}nÂ|d>krd9}n°|d?kr.d9}nž|d@kr@d9}nŒ|dAkrRd9}nz|dBkrddB}nh|dCkrvdD}nV|dEkrˆd6}nD|d8kršd9}n2|dFkr¬d;}n |dGkr¾d9}n|dHkrÎd6}nþ|dIkrÞdB}nîd6|v rîd6}nÞdJ|v rþd9}nÎdK|v rd9}n¾d6|v rd6}n®d9|v r.d9}nždL|v r>dB}nŽdM|v rNdB}n~dN|v r^dB}nndO|v rnd9}n^dP|v r~d9}nNdQ|v rŽd6}n>dR|v rždB}n.dS|v r®d6}ndT|v r¾d6}nt dU|ƒ d	}z¬dVˆ d d dW v r| 	dXd¡ ¡ }| 	dYd¡ ¡ }dZˆ d d dW v r*| 	d[d¡ ¡ }d\ˆ d d dW v rP| 	d]d¡ ¡ }d\ˆ d d dW v rv| 	d^d¡ ¡ }W n   Y n0 | 	d_d`¡}| 	dad¡}|dbkr¬dc}| 	ddd¡}|}||	|d de… |
 	dfdg¡| ¡ dhœ|diœ}||v ròql| |¡ qlt djt|ƒƒ t|ƒr0|tj| | |  dk< |S d S )lNúSTATION: VRRz§https://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   rk   rl   ÚUNKNOWNrW   ÚFAILú?Údmrg   Úpointri   ÚplacerY   r   ú$Could not remove 'place' from 'name'rA   ÚliErgRiProjÚRÚ1ÚHÚ2Únumberr   r   c                    sˆ   d}d}t ˆ |  ƒD ]^\}}|dkr(d}|dkr4d}|dkrF|d7 }qˆ d | }t|ƒd	krfd
| }||| 7 }q| dd¡d }|S ©Nr   r   rB   é   r   ÚweekdayÚTÚdateTimer,   rA   zT:z:00©rn   rM   r   ©rR   r'   Úseprs   ru   Úzz©r&   r   r   Úget_time	  s    z%vrr_load_departures.<locals>.get_timeÚrealDateTimeÚRTrŽ   Ú	SCHEDULEDú#ú20250101T00:00:00ÚdelayzDELAY:ú%Y-%m-%dT%H:%M:%S)ÚminuteszRT (corrected):zDelay apply error:z(+)ú+r*   ú
Name fail!rZ   Úsymbolú	PRODUCT: r1   r3   r)   r\   Ú	stadtbahnús-bahnr7   r4   r5   r6   r]   r^   r_   r8   r9   r:   r;   r<   r`   úu-bahnÚregionalzugÚneÚsbÚreÚrbÚstrabÚstraÚniederflurstrabÚzugúr-bahnÚsevÚschwebebahnÚersatzverkehrÚeinsatzúFailed to find __type: ÚdswÚnetworkz
Dortmund, ú	Dortmund Úvbbr(   Zvrsu   KÃƒÂ¶ln zBergisch Gladbach ra   rb   r+   r0   r/   ú  r2   rB   rC   rD   rF   úLEN: r&   )r   r   r	   r
   r   r   r   rp   rq   r   r   ÚintÚdatetimeÚstrptimeÚ	timedeltaÚstrftimeÚlowerÚlstriprK   rL   rM   rN   rO   )r   r   rP   r   r   rQ   rS   r   Ú
place_namerW   r1   r”   rI   r'   rš   ÚdtrR   rT   r   r“   r   Úvrr_load_departuresã   s   ,

$.
 .
 

ü
rÂ   c                 C   sˆ   t | |ƒS zL|D ]B}|d }|d }z| dd¡ dd¡}W n   Y n0 |||< qW n, ty‚ } zt|ƒ W Y d }~n
d }~0 0 |S ©NzBhttps://int.bahn.de/web/api/reiseloesung/orte?typ=ALL&suchbegriff=z&limit=5ÚextIdr   r   r   r   )	rv   r   r	   r
   r   r   r   r   r   r   r   r   r   r   ½  s    
   ,r   c                    s   t | dddS |S )NrV   r   ©r   rP   r   ©rº   Fc                    sb  ddl m }m} | ¡ }|r*||dd }| d¡dd … }| d¡}td|› ƒ td	|› ƒ t|| ƒ d
|  d | d | }t|ƒ t |¡j}ˆ |¡}ˆ j	|ddd}	ˆ  
|	¡}g }
|d d D ]Œ}tƒ  t|gƒ tdƒ z|d d }W n   d}Y n0 z6|d }z|d d }W n   |d d }Y n0 W n   Y qÎY n0 z|d d }W n   Y qÎY n0 |dkrˆd}n4|dkr˜d}n$|dkr¨d}n|dkr¸d}nd}|d d }| d¡d d … }|d }| d!d"¡}| |d#¡}| d$¡}d%}ttjd& | ||||ƒ ttjd' ƒ |||| d(d)¡| ¡ d*œg d+œ}|
 |¡ qÎ|
S ),Nr   ©rº   r¼   r,   ©Úhoursú%Y%m%dr   ú%Húd=út=ú1https://iris.noncd.db.de/iris-tts/timetable/plan/r-   F©ÚindentÚensure_asciiÚ	timetableÚsú--------------Útlú@frA   Údpú@lú@fbú@ppthÚNr†   ÚSrˆ   ÚFÚDú@ptú|éÿÿÿÿrY   r   ú
%y%m%d%H%Mr›   ÚTRAINÚredÚwhiterB   rC   rD   rF   )rº   r¼   Únowr½   r   r   r	   r
   ÚparseÚdumpsr   r   r   r»   rN   ÚcolorrK   rL   )r   Úplushourrº   r¼   ræ   ÚdÚtÚurlr   Újson_outputrQ   ru   rW   r1   r   r'   rÁ   rS   rT   ©r   Ú	xmltodictr   r   Úadd_departureÔ  sf    




üz)db_load_departures.<locals>.add_departurezRESULTS:T©rê   c                 S   s:   t | tƒs| S |  d¡}t |tƒs&| S |jdd„ d | S )Nr&   c                 S   s   |   dd¡S ©NrH   r   ©r	   ©rë   r   r   r   Ú<lambda>"  ó    z:db_load_departures.<locals>.sort_by_time.<locals>.<lambda>©Úkey©Ú
isinstanceÚdictr	   ÚlistÚsort©r   r&   r   r   r   Úsort_by_time  s    


z(db_load_departures.<locals>.sort_by_timeÚgreenrc   rå   r&   )
rÂ   rð   r   rº   r   ÚextendrM   rN   ré   rO   ©r   r   rP   rº   rQ   rñ   r   r   rï   r   rJ   Î  s          A         rJ   c                 C   sä  t | dddS ]¢}z|d }W np ty } zXz|d d	  d
d¡ }}W n. tyz } ztd|ƒ W Y d }~n
d }~0 0 W Y d }~n
d }~0 0 |dk räz:| 	d¡d }| 	d¡d }| dd¡}| 	d¡d }W n   Y n0 z|d d }W n   d
}Y n0 d}	z|d }
W n   |d }
|
}	Y qY n0 |d d  
¡ }|dkrRd}|dkr`d}|dkrpd}nÄ|dkrˆd}d | }n¬|d!kr˜d"}nœ|d#kr¨d"}nŒ|d$kr¸d"}n||d%kræd"}d&|vrÜd&t|ƒ }t|ƒ nN|d'kröd"}n>|d(krd"}n.|d)krd"}n|d*kr&d*}n|d+kr4d}|d"ksH|dkrd| d,d¡ d-d¡ d.d¡}| d/d0¡}|d1kr~d2}|d3|
d d4… | d5d6¡| ¡ d7œg d8œ}| |¡ qt|ƒrà|tjd | |  d9< td:ƒ |S d S )<Nrx   r   rÅ   zFalling back to Deutsche Bahnz<https://www.bahn.de/web/api/reiseloesung/abfahrten?ortExtId=ÚentriesZterminusZverkehrmittelr   rY   r   zTERMINUS ERROR: rV   r+   r   rX   ZBahnhofr@   z -ZlinienNummerFZezZeitZzeitZproduktGattungr°   r\   Zschiffr<   r4   r5   ZubahnÚUr6   r7   r]   r^   ZsbahnrÜ   r_   r8   r9   r:   r;   r=   r>   r?   ra   rb   r0   r/   rA   r2   rB   rC   rD   rF   r&   zWrote to OPERATORSrc   )rÂ   r   r   r	   r
   r   r   r   r   r   r¾   rh   rK   rL   rM   rN   rO   )r   r   rP   r   rQ   r&   r   r   r1   Z	scheduledrR   rS   rT   r   r   r   Ú___db_load_departures-  s|         D

	





ü
r  c              
   C   s    t  d| d ¡j}t |¡}i }zL|D ]B}|d }|d }z| dd¡ dd¡}W n   Y n0 |||< q(W n, tyš } zt|ƒ W Y d }~n
d }~0 0 |S rÃ   )r   r	   r
   r   r   r   r   r   r   r   r   r   Údb_trains_lookup‹  s    
,r  c                    sœ   dd l ‰dd l‰ ddlm} g }d‡ ‡fdd„	}|| ƒ}| || dd¡ dd	„ }||ƒ}t|ƒr˜ttjd
 d tjd  ƒ |tj| | |  d< |S |S )Nr   rÆ   Fc                    s  ddl m }m} | ¡ }|r*||dd }| d¡dd … }| d¡}td|› ƒ td	|› ƒ t|| ƒ d
|  d | d | }d|  d | d | }ttdœ}t|ƒ tj||dj	}	t|	ƒ ˆ 
|	¡}	ˆ j|	ddd}
ˆ  |
¡}	g }|	d d D ]}tƒ  t|gƒ tdƒ z|d  W n,   ttjd d tjd  ƒ Y qüY n0 z|d d }W n   d}Y n0 z6|d }z|d d }W n   |d d }Y n0 W n,   ttjd d tjd  ƒ Y qüY n0 z|d d }W n,   ttjd d tjd  ƒ Y qüY n0 |d kr(d!}n4|d"kr8d#}n$|d$krHd!}n|d%krXd#}nd}|d d& }| d'¡d(d … }z|d }W n   Y n0 | |d)¡}| d*¡}d+}| d,d-¡}ttjd. | ||||ƒ ttjd ƒ |||| d/d0¡| ¡ d1œg d2œ}| |¡ qü|S )3Nr   rÇ   r,   rÈ   rÊ   r   rË   rÌ   rÍ   rÎ   r-   zIhttps://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/plan/r   ©ÚheadersFrÏ   rÒ   rÓ   rÔ   r×   ÚyellowzNot departing!rå   rÕ   rÖ   rA   rØ   rÙ   zCould not determine linerÚ   zCould not determine NAMErÛ   r†   rÜ   rˆ   rÝ   rÞ   rß   rà   rá   râ   r›   rã   rY   r   rä   rB   rC   rD   rF   )rº   r¼   ræ   r½   r   ÚAPI_IDÚAPI_KEYr   r	   r
   rç   rè   r   rN   ré   r   r»   r   rK   rL   )r   rê   rº   r¼   ræ   rë   rì   rí   r	  r   rî   rQ   ru   rW   r1   r   r'   rÁ   rS   rT   rï   r   r   rñ      s‚    
þ






üz1_db_trains_load_departures.<locals>.add_departureTrò   c                 S   s:   t | tƒs| S |  d¡}t |tƒs&| S |jdd„ d | S )Nr&   c                 S   s   |   dd¡S ró   rô   rõ   r   r   r   rö   ü  r÷   zB_db_trains_load_departures.<locals>.sort_by_time.<locals>.<lambda>rø   rú   rÿ   r   r   r   r   ó  s    


z0_db_trains_load_departures.<locals>.sort_by_timer  rc   rå   r&   )F)	rð   r   rº   r  rM   r   rN   ré   rO   r  r   rï   r   Ú_db_trains_load_departures›  s    Or  c                 C   sR   t › d| › d|› d|› }tj|td}|jdkrFtd|j|jƒ dS t |j¡S )z'Fetch planned departures for a station.z/plan/r-   r  éÈ   zError fetching plan:N©	ÚBASE_URLr   r	   r	  Ústatus_coder   r
   ÚETÚ
fromstring)ÚevaÚdateÚhourrí   Úrr   r   r   Ú
fetch_plan  s    
r  c                 C   sF   t › d| › }tj|td}|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  r   r   r   Úfetch_changes  s    
r  c           	   	   C   s´   i }|   d¡D ] }| d¡}| d¡}|du r0q| d¡}d}|durb| dd¡› | dd¡› }| d	d¡}|r€| d
¡d nd}|| d¡| d¡|| d	¡i |dœ||< q|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_plannedr1   r)   ÚchangesÚheadsign)Úfindallr	   Úfindr   )	Úxml_rootr&   rÓ   r  r×   rÕ   r1   r  r#  r   r   r   Ú
parse_plan  s*    


ù	r'  c                 C   sœ   |  d¡D ]Œ}| d¡}|| vr"q
| d¡}|du r6q
| d¡rV| d¡| | d d< | d¡rv| d¡| | d d	< | d
¡r
| d
¡| | d d< q
| 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×   r   r   r   Úapply_changes8  s    




r.  c                 C   s   t j  | d¡}| d¡S )Nrâ   r›   )rº   r»   r½   )ÚtsrÁ   r   r   r   Úiris_to_isoM  s    r0  c                 C   s$  t dƒ g }t|  ¡ dd„ dD ]Æ}|d }|d  d|¡}|d  d|d	 ¡}|d  d
d¡}|dkrrt dƒ q | dd¡}t|ƒdkr¢|d dkr¢d|d  }| dd¡}	t ||	|ƒ |	dt|ƒ| dd¡ddœg dœ}
| |
¡ q |r t tj	d d tj	d  ƒ |tj
d d | d < |S )!Nz#
=== REAL-TIME DEPARTURE BOARD ===
c                 S   s   | d S )Nr   r   )rs   r   r   r   rö   V  r÷   zprint_board.<locals>.<lambda>rø   r   r"  r)  r+  r!  r-  r   r  z  CANCELLEDr1   u   Ã¢â‚¬â€é   r   rÜ   r‹   r#  rA   rB   rC   rã   rD   rF   r  rc   rå   r   Ú	db_trainsr&   )r   ÚsortedÚvaluesr	   rM   r0  r   rL   rN   ré   rO   )r&   r   rQ   r7   ZplannedÚactualÚplatformr-  r1   r   rT   r   r   r   Úprint_boardR  s2    $ûr7  r2  c                 C   s²   t j  ¡ }| d¡}| d¡}|t jdd }| d¡}| d¡}t| ||ƒ}	t| ||ƒ}
t| ƒ}i }|	d ur|| t|	ƒ¡ |
d ur’| t|
ƒ¡ |d ur¤t||ƒ}t	|| ƒ d S )Nz%y%m%drË   r,   rÈ   )
rº   ræ   r½   r¼   r  r  Úupdater'  r.  r7  )r   rP   r   ræ   Zdate1Zhour1Z	next_timeZdate2Zhour2Z
plan_xml_1Z
plan_xml_2Zchanges_xmlr&   r   r   r   Údb_trains_load_departuresv  s"    





r9  c           	      C   sÒ   t  d| ¡j}t |¡}i }t|d d ƒD ]ž\}}dtt|ƒƒv r¤|d d }|D ]J}t|| d ƒ z(|| d d }|| d }|||< W qV   Y qV0 qVq.|d d }|d }|||< |dkr. qÎq.|S )	Nz“https://projekte.kvv-efa.de/sl3-alone/XML_STOPFINDER_REQUEST?anyObjFilter_sf=2&coordOutputFormat=EPSG%3A4326&outputFormat=json&type_sf=any&name_sf=rf   rg   rh   ri   rj   r   rm   )	r   r	   r
   r   r   rn   rh   ro   r   rr   r   r   r   Ú
kvv_lookup–  s$    
r:  Úkvvc                    s
  t dƒ t | ƒ zt d|  d ¡j}W n, tyT } zt |ƒ W Y d }~n
d }~0 0 t |¡}g }|d D ]d‰ zˆ d d }W n   d}Y n0 zˆ d d }W n   t d	ƒ d
}Y n0 z,|d d d d d }| |d d¡}W n   t dƒ Y n0 d}	z0ˆ d d d }	|	dkr$d}	|	dkr2d}	W n. tyb } zt |ƒ W Y d }~n
d }~0 0 ˆ d d  d¡d }
‡ fdd„}g }z|dƒ}t dƒ W n6   z|d ƒ}t d!ƒ d"}W n   d#}Y n0 Y n0 z | d¡d }| d$¡d }W n   t d%ƒ Y n0 ˆ d d  dd¡ d&d¡}
|
 d¡d }
z|
dkrNˆ d d' }
W n. ty~ } zt |ƒ W Y d }~n
d }~0 0 zt d(ˆ d) d* ƒ ˆ d+ }W n   Y n0 z$d,|
 	¡ v sÊd,| 	¡ v rÎd,}W n   Y n0 | 	¡ }d-| 	¡ v sd.| 	¡ v rd/}|d0krd1}næ|d2kr*d/}nÔ|d3kr<d/}nÂ|d4krNd/}n°|d5kr`d/}nž|d6krrd/}nŒ|d7kr„d/}nz|d8kr–d8}nh|d9kr¨d:}nV|d;krºd,}nD|d.krÌd/}n2|d<krÞd1}n |d=krðd/}n|d>kr d,}nþ|d?krd8}nîd,|v r d,}nÞd@|v r0d/}nÎdA|v r@d/}n¾d,|v rPd,}n®d/|v r`d/}nždB|v rpd8}nŽdC|v r€d8}n~dD|v rd8}nndE|v r d/}n^dF|v r°d/}nNdG|v rÀd,}n>dH|v rÐd8}n.dI|v ràd,}ndJ|v rðd,}nt dK|ƒ d}zPdLˆ d d dM v r&| dNd¡ 
¡ }dOˆ d d dM v rL| dPd¡ 
¡ }W n   Y n0 | dQdR¡}| dSd¡}|dTkr‚dU}| dVd¡}|}||	|d dW… |
 dXdY¡| ¡ dZœ|d[œ}||v rÈql| |¡ qlt d\t|ƒƒ t|ƒr|tj| | |  d]< |S d S )^Nry   z´https://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=rz   r{   r|   r   r}   rW   r~   r   r€   rg   r   ri   r‚   rY   r   rƒ   rA   r„   r…   r†   r‡   rˆ   r‰   r   r   c                    sˆ   d}d}t ˆ |  ƒD ]^\}}|dkr(d}|dkr4d}|dkrF|d7 }qˆ d | }t|ƒd	krfd
| }||| 7 }q| dd¡d }|S rŠ   r   r   r“   r   r   r”   Ñ  s    z%kvv_load_departures.<locals>.get_timer•   r–   rŽ   r—   r˜   r™   r*   rž   rZ   rŸ   r    r1   r3   r)   r\   r¡   r¢   r7   r4   r5   r6   r]   r^   r_   r8   r9   r:   r;   r<   r`   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r¯   r°   r±   r²   r³   r´   rµ   r¶   r(   ra   rb   r+   r0   r/   r·   r2   rB   rC   rD   rF   r¸   r&   )r   r   r	   r
   r   r   r   r   r   r¾   r¿   rK   rL   rM   rN   rO   )r   r   rP   r   r   rQ   rS   r   rÀ   rW   r1   r”   rI   r'   rR   rT   r   r“   r   Úkvv_load_departures«  sÞ    ,

..
 

ü
r<  z$2f2f720d-5c27-4d8b-aaba-ffdd7c4a848cc                 C   s„   dd„ }dj |td}t |¡ ¡ }i }| dg ¡}|D ]F}| d¡}|sLq8| d¡}	| d¡}
|	r8|
sjq8||
ƒ}|r8|||	< q8|S )	Nc                 S   s.   |   d¡D ]}| d¡r
|dd…   S q
dS )z:Extracts the numeric stop ID from a HAFAS location string.ú@zL=r   N)r   Ú
startswith)Z	hafas_strÚpartr   r   r   Úextract_hafas_stop_idc  s    
z)rmv_lookup.<locals>.extract_hafas_stop_idzPhttps://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   r@  rí   r   r   ÚitemsÚitemÚstopr   Zraw_idÚstop_idr   r   r   Ú
rmv_lookupb  s(    ÿý



rI  Úrmvc                 C   s  | }t dƒ t d|ƒ zt d| d t ¡j}W n2 tyd } zt d|ƒ g W  Y d }~S d }~0 0 zt |¡}W n2 ty¦ } zt d|ƒ g W  Y d }~S d }~0 0 t dt| 	¡ ƒƒ g }z$t
|d ƒtkrà|d }t d	ƒ W n   Y n0 z.t
|d
 d ƒtkr|d
 d }t dƒ W n   Y n0 z|g krFt dƒ |g}W n   Y n0 t dt|ƒƒ g }|D ]ê}z|d r„W qlW n   Y n0 z|d }	W nT   z|d d }	W n6   z|d d  dd¡}	W n   d}	Y n0 Y n0 Y n0 z|d }
W n   d}
Y n0 z|d d |d  }W n6   z|d d |d  }W n   d}Y n0 Y n0 z|d d d }W n   d }Y n0 | ¡ }d!|v r¢d"}nB|d#kr²d$}n2d%|v sÐd&|v sÐd'|v rÖd$}nd(|v räd(}| ¡ }|
 d)d¡}
|
 d*d¡}
|
 d+d¡}
t |	|
||ƒ |
t|tƒr8| d,d-¡nd-||	|d.œg d/œ}| |¡ qlt d0t|ƒƒ t|ƒrŒ|tj| | |  d1< |S d S )2Nz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']ZDepartureBoardz*USING: data['DepartureBoard']['Departure']zSINGLE OBJECT MODEzDEPARTURE COUNT:Ú	cancelledr‰   ÚProductAtStopr1   r   rY   r   r   rW   ZrtDater   ÚrtTimer  Útimer™   ZProductr   ZcatOutr}   r£   r5   rÓ   r7   r¨   r§   Zicer\   zFrankfurt (Main) zBad Homburg v.d.H.-zBad Homburg v.d.H. ZdirectionFlagrA   rD   rF   zFINAL RESULT COUNT:r&   )r   r   r	   rD  r
   r   r   r   rý   Úkeysro   rM   r   r¾   rK   rû   rü   rL   rN   rO   )r   r   rP   Z
station_idr   r   r&   rQ   Údepr1   rW   r'   ÚmoderT   r   r   r   Úrmv_load_departures„  s¼    
ÿþýÿ







$þø
rS  )r   r    )r   rV   )rx   r   )rV   r   )rV   r   )rV   r   )r   r2  )r;  r   )rJ  r   )rN   rº   r  r  r  r	  r   r   rU   rd   rv   rw   rÂ   r   rJ   r  r  r  r  r  r'  r.  r0  r7  r9  r:  r<  rD  rI  rS  r   r   r   r   Ú<module>   sD   þ
5
R
 [
_
^
l

$
 
 6"