o
    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d@ddZdd  Zd@d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. ZdAd0d1Zd2d3 ZdBd5d6Zd7Zd8d9 ZdCd;d<ZdS )D    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 t| t|}i }|D ]}|| d dd }|| d }|||< q$|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   VC:\Users\computer\Desktop\notes\tskylt4.0\server\20260128 - new GTFS loader\germany.py	be_lookup   s   

r   c              
   C   s   t dj}t|}t| i }z)|D ]#}t| |d }|d }z|dddd}W n   Y |||< qW |S  tyQ } zt| W Y d }~|S d }~ww )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 t|}t| g }|d D ]}|d s5q.d	|d
 d v rX|d
 d dd dd dd dd }n|d
 d dd dd dd dd }d|v r}|dd}n|dd}|dkrd}|d d }|d d d }|d d }	|	dkrd}	n"|	dkrd}	n|	dkrd}	n|	d krd}	n|	d!krd!}	n|	d"krd#}	|	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|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+UZ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   sR    

64

rQ   dbc                 C   s  t d tjd|  d dddj}t|}t | g }|d D ]%}|d s(q |d	 }z|d
d }|dd }W n   Y z|d d dddd}W n
   |d d }Y |dd}d|v rgq d|v rlq zd|v sud|v rt | |dd  d | }|d d }W n   Y |sz|d d }W n   Y q |d d d }z|d d }	W n' ty }
 zt |
 |d d }	z|d	 }W n   Y W Y d }
~
nd }
~
ww d|	v rd}	|	dkrd}	nD|	dkrd }	n=|	d!krd }	n6|	d"krd }	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(}	n|	d)kr(d}	|d*d+d,|d d |d-d.|		 d/g d0}|
| q t 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 (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bfr=   r>   r?   r@   rB   )r   r   r	   r
   r   r   r   r   r   rG   rH   rI   rJ   rK   )r   rL   r   r   rM   r&   r   r1   rN   rO   r   rP   r   r   r   _db_load_departuresn   sv   

"





r^   c           	      C   s   t d| j}t|}i }t|d d D ]Z\}}dtt|v rV|d d }|D ])}t|| d  z|| d d }|| d 	d
d	}|||< W q+   Y q+q|d d }|d 	d
d	}|||< |d
krq |S q|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   	enumeraterb   typer   encodedecode	r   r   r   r   xzir   r   r   r   r   
vrr_lookup   s*   


rp   c                 C   sr   t d| j}t|}i }t|d d D ]\}}|d d }|d dd}|||< |d	kr6 |S q|S )
Nr_   r`   ra   rc   rd   r   re   rf   rg   )r   r	   r
   r   r   rh   rj   rk   )r   r   r   r   rm   r   r   r   r   r   _old_vrr_lookup   s   

rq   vrrc                    s  t d t |  ztd|  d j}W n ty* } z
t | W Y d }~nd }~ww t|}g }|d D ]) z d d dd}W n   d	}Y z d d
 dd}W n
   t d d}Y z|d d d d d dd}|	|d d}W n   t d Y d}	z d d d
 }	|	dkrd}	|	dkrd}	W n ty } z
t | W Y d }~nd }~ww  d d 
dd }
 fdd}g }z
|d }t d! W n   z|d"}t d#| d$}W n   d%}Y Y d}zt d d& }t d'| W n   Y |r>ztj|d(}|tj|d)7 }|d(}t d*| W n ty= } zt d+| W Y d }~nd }~ww z|	d,d-}|
dd }|
d.d }W n   t d/ Y  d d 	dd	d0d}
|

dd }
z|
dkr~ d d1 }
W n ty } z
t | W Y d }~nd }~ww 	 zt d2 d3 d4   d5 }W n   Y zd6|
 v sd6| v rd6}W n   Y | }d7| v sd8| v rd9}|d:krd;}n|d<krd9}n|d=krd9}n|d>krd9}n|d?krd9}n|d@krd9}n|dAkrd9}n|dBkrdB}n|dCkrdD}n|dEkr'd6}n|d8kr/d9}n|dFkr7d;}n|dGkr?d9}n|dHkrGd6}n|dIkrOdB}nwd6|v rWd6}nodJ|v r_d9}ngdK|v rgd9}n_d6|v rod6}nWd9|v rwd9}nOdL|v rdB}nGdM|v rdB}n?dN|v rdB}n7dO|v rd9}n/dP|v rd9}n'dQ|v rd6}ndR|v rdB}ndS|v rd6}ndT|v rd6}nt dU| d	}zZdV d d dW v r|	dXd }|	dYd }t | dZ d d dW v r|	d[d }d\ d d dW v r|	d]d }d\ d d dW v r|	d^d }W n   Y |	d_d`}|	dad}|dbkr8dc}|	ddd}|}||	|d de |
	dfdg| dh|di}||v r[q6|| q6t djt| t|rz|tj| | |  dk< |S d S )lN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   re   rf   UNKNOWNrS   FAIL?dmra   pointrc   placerT   r   $Could not remove 'place' from 'name'r=   liErgRiProjR1H2numberr   r   c                       d}d}t  |  D ]/\}}|dkrd}|dkrd}|dkr#|d7 }q
 d | }t|d	kr3d
| }||| 7 }q
|ddd }|S Nr   r   r>      r   weekdayTdateTimer,   r=   zT:z:00rh   rI   r   rN   r'   seprm   ro   zzr&   r   r   get_time	     z%vrr_load_departures.<locals>.get_time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!rU   symbol	PRODUCT: r1   r3   r)   rW   	stadtbahns-bahnr7   r4   r5   r6   rX   rY   rZ   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network	Dortmund z
Dortmund, vbbr(   Zvrsu   KÃ¶ln zBergisch Gladbach r\   r]   r+   r0   r/     r2   r>   r?   r@   rB   LEN: r&   )r   r   r	   r
   r   r   r   rj   rk   r   r   intdatetimestrptime	timedeltastrftimelowerlstriprG   rH   rI   rJ   rK   )r   r   rL   r   r   rM   rO   r   
place_namerS   r1   r   rE   r'   r   dtrN   rP   r   r   r   vrr_load_departures   s&  " 
$" 

$ 
 


r   c                 C   s
   t | |S )N)	rp   r   r	   r
   r   r   r   r   r   r   r   r   r   r     s   
r   c                       t | dddS )NrR   r   r   rL   )
r   	xmltodictr   r   r   extendrI   rJ   colorrK   r   r   rL   r   rM   add_departuresort_by_timer   r   r   r   rF        rF   c                 C   r   )Nrr   r   r   )r   r   r   r	   r
   r   r   r   r   r   r   rb   rG   rH   rI   rJ   rK   )r   r   rL   r   rM   r&   r   r   r1   Z	scheduledrN   rO   rP   r   r   r   ___db_load_departures0  r   r   c              
   C   s   t d| d j}t|}i }z%|D ]}|d }|d }z|dddd}W n   Y |||< qW |S  tyM } zt| W Y d }~|S d }~ww )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   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|rLt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~z|d d }W n   d}Y z|d }z|d d }W n
   |d d }Y W n   ttjd d tjd   Y q~z|d d }W n   ttjd d tjd   Y q~|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  }z|d }W n   Y ||d)}|d*}d+}|d,d-}ttjd. | |||| ttjd  ||||d/d0| d1g d2}|| q~|S )3Nr   )r   r   r,   hoursz%Y%m%dr   %Hzd=zt=z1https://iris.noncd.db.de/iris-tts/timetable/plan/r-   zIhttps://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/plan/r   headersF)indentensure_asciiZ	timetablesz--------------dpyellowzNot departing!whitetlz@fr=   z@lz@fbzCould not determine linez@ppthzCould not determine NAMENr   Sr   FDz@pt|
%y%m%d%H%Mr   TRAINrT   r   redr>   r?   r@   rB   )r   r   nowr   r   API_IDAPI_KEYr   r	   r
   parsedumpsr   rJ   r   r   r   r   rG   rH   )r   plushourr   r   r   dturlr   r   Zjson_outputrM   ro   rS   r1   r   r'   r   rO   rP   r   r   r   r     s   




z1_db_trains_load_departures.<locals>.add_departureT)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 )NrD   r   )r	   )r   r   r   r   <lambda>  s    zB_db_trains_load_departures.<locals>.sort_by_time.<locals>.<lambda>key)
isinstancedictr	   listsort)r   r&   r   r   r   r     s   


z0_db_trains_load_departures.<locals>.sort_by_timegreenSuccessr   r&   )F)	r   r   r   r   rI   r   rJ   r   rK   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r#t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 ]P}|d}|d}|du rq|d}d}|dur1|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 ]F}|d}|| vrq|d}|du rq|dr+|d| | d d< |dr;|d| | d d	< |d
rK|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_changes;  s   




r  c                 C   s   t j | d}|dS )Nr   r   )r   r   r   )tsr   r   r   r   iris_to_isoP  s   
r  c                 C   s"  t d g }t|  dd dD ]c}|d }|d d|}|d d|d	 }|d d
d}|dkr9t d q|dd}t|dkrQ|d dkrQd|d  }|dd}	t ||	| |	dt||ddddg d}
||
 q|rt 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   )rm   r   r   r   r   Z  s    zprint_board.<locals>.<lambda>r   r  r  r  r  r  r  r   r   z  CANCELLEDr1   u   â€”   r   r   r   r  r=   r>   r?   r   r@   rB   r   r   r   r   	db_trainsr&   )r   sortedvaluesr	   rI   r  r   rH   rJ   r   rK   )r&   r   rM   r7   Zplannedactualplatformr  r1   r   rP   r   r   r   print_boardU  s2   $r  r  c                 C   s   t j  }|d}|d}|t jdd }|d}|d}t| ||}	t| ||}
t| }i }|	d ur>|t|	 |
d urI|t|
 |d urRt||}t	||  d S )Nz%y%m%dr   r,   r   )
r   r   r   r   r   r   updater  r  r  )r   rL   r   r   Zdate1Zhour1Z	next_timeZdate2Zhour2Z
plan_xml_1Z
plan_xml_2Zchanges_xmlr&   r   r   r   db_trains_load_departures}  s"   





r  c           	      C   s   t d| j}t|}i }t|d d D ]N\}}dtt|v rP|d d }|D ]#}t|| d  z|| d d }|| d }|||< W q+   Y q+q|d d }|d }|||< |dkre |S q|S )	Nzhttps://projekte.kvv-efa.de/sl3-alone/XML_STOPFINDER_REQUEST?anyObjFilter_sf=2&coordOutputFormat=EPSG%3A4326&outputFormat=json&type_sf=any&name_sf=r`   ra   rb   rc   rd   r   rg   )	r   r	   r
   r   r   rh   rb   ri   r   rl   r   r   r   
kvv_lookup  s*   


r  kvvc                    s  t d t |  ztd|  d j}W n ty* } z
t | W Y d }~nd }~ww t|}g }|d D ] z d d }W n   d}Y z d d }W n
   t d	 d
}Y z|d d d d d }||d d}W n   t d Y d}	z d d d }	|	dkrd}	|	dkrd}	W n ty } z
t | W Y d }~nd }~ww  d d dd }
 fdd}g }z
|d}t d W n   z|d }t d! d"}W n   d#}Y Y z|dd }|d$d }W n   t d% Y  d d ddd&d}
|
dd }
z|
dkr d d' }
W n ty0 } z
t | W Y d }~nd }~ww 	 zt d( d) d*   d+ }W n   Y zd,|
	 v sUd,|	 v rWd,}W n   Y |	 }d-|	 v sod.|	 v rqd/}|d0kryd1}n|d2krd/}n|d3krd/}n|d4krd/}n|d5krd/}n|d6krd/}n|d7krd/}n|d8krd8}n|d9krd:}n|d;krd,}n|d.krd/}n|d<krd1}n|d=krd/}n|d>krd,}n|d?krd8}nwd,|v rd,}nod@|v rd/}ngdA|v rd/}n_d,|v r	d,}nWd/|v rd/}nOdB|v rd8}nGdC|v r!d8}n?dD|v r)d8}n7dE|v r1d/}n/dF|v r9d/}n'dG|v rAd,}ndH|v rId8}ndI|v rQd,}ndJ|v rYd,}nt dK| d}z(dL d d dM v rt|dNd
 }dO d d dM v r|dPd
 }W n   Y |dQdR}|dSd}|dTkrdU}|dVd}|}||	|d dW |
dXdY| dZ|d[}||v rq6|| q6t d\t| t|r|tj| | |  d]< |S d S )^Nrs   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=rt   ru   rv   r   rw   rS   rx   ry   rz   ra   r{   rc   r|   rT   r   r}   r=   r~   r   r   r   r   r   r   r   c                    r   r   r   r   r   r   r   r     r   z%kvv_load_departures.<locals>.get_timer   r   r   	SCHEDULEDr   r   r*   r   rU   r   r   r1   r3   r)   rW   r   r   r7   r4   r5   r6   rX   rY   rZ   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(   r\   r]   r+   r0   r/   r   r2   r>   r?   r@   rB   r   r&   )r   r   r	   r
   r   r   r   r   r   r   r   rG   rH   rI   rJ   rK   )r   r   rL   r   r   rM   rO   r   r   rS   r1   r   rE   r'   rN   rP   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 ]#}|d}|s&q|d}	|d}
|	r4|
s5q||
}|r?|||	< q|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_idj  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_lookupi  s(   


r/  rmvc                 C   s@  | }t d t d| ztd| d t j}W n ty2 } zt d| g W  Y d }~S d }~ww zt|}W n tyS } zt d| g W  Y d }~S d }~ww t dt|	  g }zt
|d tkrp|d }t d	 W n   Y zt
|d
 d tkr|d
 d }t d W n   Y z|g krt d |g}W n   Y t dt| g }|D ]}z|d rW qW n   Y z|d }	W n$   z|d d }	W n   z|d d dd}	W n   d}	Y Y Y z|d }
W n   d}
Y z|d d |d  }W n   z|d d |d  }W n   d}Y Y z
|d d d }W n   d }Y | }d!|v r6d"}n!|d#kr>d$}nd%|v sMd&|v sMd'|v rPd$}nd(|v rWd(}| }|
d)d}
t |	|
|| |
t|tru|d*d+nd+||	|d,g d-}|| qt 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']ZDepartureBoardz*USING: data['DepartureBoard']['Departure']zSINGLE OBJECT MODEzDEPARTURE COUNT:	cancelledr   ProductAtStopr1   r   rT   r   ry   rS   ZrtDater   rtTimer   timer   ZProductr   ZcatOutrw   r   r5   r   r7   r   r   ZicerW   zFrankfurt (Main) ZdirectionFlagr=   r@   rB   zFINAL RESULT COUNT:r&   )r   r   r	   r*  r
   r   r   r   r   keysri   rI   r   r   rG   r   r   rH   rJ   rK   )r   r   rL   Z
station_idr   r   r&   rM   Zdepr1   rS   r'   moderP   r   r   r   rmv_load_departures  s   


$
r8  )r   r    )r   rR   )rr   r   )rR   r   )r   r  )r   r   )r0  r   )rJ   r   r   r   r   r   r   r   rQ   r^   rp   rq   r   r   rF   r   r   r   r   r   r  r  r  r  r  r  r"  r*  r/  r8  r   r   r   r   <module>   sF    

5R
 ^

_^
l


( 
 6"