first draft

This commit is contained in:
2025-08-22 23:49:53 +02:00
parent 8bad97c713
commit 4c2b5faf9a
5 changed files with 380 additions and 0 deletions

1
.python-version Normal file
View File

@@ -0,0 +1 @@
3.13

148
main.py Normal file
View File

@@ -0,0 +1,148 @@
import requests
from datetime import datetime, timedelta
import xmltodict
from cachetools import cached, TTLCache
eva = 8002377
base_url = "https://iris.noncd.db.de/iris-tts/timetable"
@cached(cache=TTLCache(maxsize=128, ttl=60))
def _get_changes(eva):
url = f"{base_url}/fchg/{eva}"
x = requests.get(url)
changes = xmltodict.parse(x.text)['timetable']['s']
return changes
class Departure:
def __init__(self, event, station=None, eva=None):
dp = event['dp']
self.id = event['@id']
try:
self.line = f"{event['tl']['@c']}{dp['@l']}"
except KeyError:
self.line = '??'
self.time = datetime.strptime(dp['@pt'], "%y%m%d%H%M")
self.old_time = self.time
self.delayed = None
self.platform = dp['@pp']
path = dp['@ppth']
self.target = path.split('|')[-1]
self.path = path.split('|')
self.station = station
self.eva = eva
def fetch_actual(self, eva):
changes = _get_changes(eva)
for event in changes:
if event['@id'] == self.id:
self.time = datetime.strptime(event['dp']['@ct'], "%y%m%d%H%M")
self.delayed = self.time - self.old_time
self.delayed = int(self.delayed.total_seconds()/60)
if self.delayed == 0:
self.delayed = None
pass
def __repr__(self):
return f"{self.line} to {self.target}: {self.time.strftime("%Y-%m-%d %H:%M")}{f" ({self.delayed:+d})" if self.delayed is not None else ""} @ platform {self.platform}"
def main():
# current_timestamp = datetime(year=2025, month=8, day=22, hour=22, minute=51, second=0)
retrieve_and_print_schedule(eva, number_future_deps=100)
pass
def retrieve_and_print_schedule(eva, target_timestamp = None, future_only = True, number_future_deps=6):
current_timestamp = datetime.now() if target_timestamp is None else target_timestamp
timetable = fetch_timetable(current_timestamp, eva)
departures = extract_departures(timetable, eva)
if current_timestamp.minute < 10 and not future_only:
timetable = fetch_timetable(current_timestamp - timedelta(hours=1), eva)
departures = extract_departures(timetable, eva, departures)
# elif current_timestamp.minute > 50:
# # current_timestamp = timedelta(hours=1)
# timetable = fetch_timetable(current_timestamp + timedelta(hours=1), eva)
# departures = extract_departures(timetable, eva, departures)
if future_only:
split_index = -1
for di, dep in enumerate(departures):
if dep.time < current_timestamp:
split_index = di
departures = departures[split_index+1:]
cnt = 0
while len(departures) < number_future_deps and cnt <= 24:
current_timestamp += timedelta(hours=1)
timetable = fetch_timetable(current_timestamp, eva)
departures = extract_departures(timetable, eva, departures)
cnt += 1
# departures = departures[:number_future_deps]
print(f"{departures[0].station} ({departures[0].station})")
for abf in departures:
# if abf.time >= current_timestamp:
print(abf)
def fetch_timetable(target_datetime: datetime, eva):
"""
timetable:
@station: // station name
s: // stop, contains list of the following
@id // id
tl: // trip label
@f // distance class, F: Fern, N: Nah, S: Stadt
@t // trip type: e, p, z, s, h, n -> normally p
@o // owner: EVU-Number 800725 is S-Bahn München
@c // category: CE, IC, EC, IRE, RE, RB, S, MEX, TGJ, NJ, Bus
@n // train number
ar: // arrival
see dp
dp: // departure
@pt // yyMMddHHmm
@pp // platform number
@l // line. -> tl.@c + dp.@l make up the train line (eg S3)
@ppth // path, stations separated by |. for the last station in dp.@ppth is the destination, the first station in ar.@ppth is the origin
"""
daystamp = target_datetime.strftime(r"%y%m%d")
hourstamp = target_datetime.strftime(r"%H")
url = f"{base_url}/plan/{eva}/{daystamp}/{hourstamp}"
x = requests.get(url)
if x.status_code != 200:
return None
timetable = xmltodict.parse(x.text)['timetable']
return timetable
def extract_departures(timetable, eva, departures=None):
if departures is None:
departures = []
if timetable is None:
return departures
events = timetable['s']
if not isinstance(events, list):
events = [events]
for event in events:
if event['tl']['@f'] != 'S':
# only s-bahnen are supported for now
continue
departure = Departure(event, station=timetable['@station'], eva=eva)
departure.fetch_actual(eva)
departures.append(departure)
departures.sort(key=lambda abf: abf.time)
return departures
if __name__ == "__main__":
main()

58
out Normal file
View File

@@ -0,0 +1,58 @@
{'@id': '5932605220368439014-2508221457-2', 'tl': {'@f': 'N', '@t': 'p', '@o': 'GYRB', '@c': 'RB', '@n': '57148'}, 'ar': {'@pt': '2508221504', '@pp': '10', '@l': '87', '@ppth': 'München Hbf'}, 'dp': {'@pt': '2508221505', '@pp': '10', '@l': '87', '@ppth': 'Mammendorf|Haspelmoor|Althegnenberg|Mering|Mering-St Afra|Kissing|Augsburg-Hochzoll|Augsburg Haunstetterstraße|Augsburg Hbf|Augsburg-Oberhausen|Gersthofen|Gablingen|Langweid(Lech)|Herbertshofen|Meitingen|Westendorf|Nordendorf|Mertingen Bahnhof|Bäumenheim|Donauwörth'}}
{'@id': '-3326933084724823513-2508221514-11', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6479'}, 'ar': {'@pt': '2508221546', '@pp': '5', '@l': '4', '@ppth': 'Geltendorf|Türkenfeld|Grafrath|Schöngeising|Buchenau(Oberbay)|Fürstenfeldbruck|Eichenau(Oberbay)|Puchheim|München-Aubing|München Leienfelsstr.'}, 'dp': {'@pt': '2508221547', '@pp': '5', '@l': '4', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Berg am Laim|München-Trudering|Gronsdorf|Haar|Vaterstetten|Baldham|Zorneding'}}
{'@id': '-7604060497077668430-2508221447-23', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6064'}, 'ar': {'@pt': '2508221543', '@pp': '7', '@l': '5', '@ppth': 'Kreuzstraße|Großhelfendorf|Aying|Höhenkirchen-Siegertsbrunn|Wächterhof|Hohenbrunn|Ottobrunn|Neubiberg|München-Neuperlach Süd|München-Perlach|München-Giesing|München St.Martin-Str.|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221544', '@pp': '7', '@l': '5', '@ppth': 'München-Westkreuz|München-Neuaubing|München-Freiham|Harthaus|Germering-Unterpfaffenhofen'}}
{'@id': '3037974253817957283-2508221444-12', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6675'}, 'ar': {'@pt': '2508221516', '@pp': '5', '@l': '6', '@ppth': 'Tutzing|Feldafing|Possenhofen|Starnberg|Starnberg Nord|Gauting|Stockdorf|Planegg|Gräfelfing|Lochham|München-Westkreuz'}, 'dp': {'@pt': '2508221516', '@pp': '5', '@l': '6', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Berg am Laim|München-Trudering|Gronsdorf|Haar|Vaterstetten|Baldham|Zorneding'}}
{'@id': '338570023396133584-2508221422-25', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6042'}, 'ar': {'@pt': '2508221523', '@pp': '7', '@l': '5', '@ppth': 'Kreuzstraße|Großhelfendorf|Peiß|Aying|Dürrnhaar|Höhenkirchen-Siegertsbrunn|Wächterhof|Hohenbrunn|Ottobrunn|Neubiberg|München-Neuperlach Süd|München-Perlach|München-Giesing|München St.Martin-Str.|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221524', '@pp': '7', '@l': '5', '@ppth': 'München-Westkreuz|München-Neuaubing|München-Freiham|Harthaus|Germering-Unterpfaffenhofen'}}
{'@id': '-7874394656251764745-2508221552-2', 'tl': {'@f': 'N', '@t': 'p', '@o': 'GYRE', '@c': 'RE', '@n': '78947'}, 'ar': {'@pt': '2508221558', '@pp': '4', '@l': '96', '@ppth': 'München Hbf'}, 'dp': {'@pt': '2508221559', '@pp': '4', '@l': '96', '@ppth': 'Geltendorf|Buchloe|Türkheim(Bay)Bf|Mindelheim|Memmingen|Tannheim(Württ)|Marstetten-Aitrach|Aichstetten|Leutkirch|Kißlegg|Wangen(Allgäu)|Hergatz|Lindau-Insel|Lindau-Reutin'}}
{'@id': '3038442834308961734-2508221457-2', 'tl': {'@f': 'N', '@t': 'p', '@o': 'GYRB', '@c': 'RB', '@n': '57048'}, 'ar': {'@pt': '2508221504', '@pp': '10', '@l': '86', '@wings': '5932605220368439014-2508221457', '@ppth': 'München Hbf'}, 'dp': {'@pt': '2508221505', '@pp': '10', '@l': '86', '@wings': '5932605220368439014-2508221457', '@ppth': 'Mammendorf|Haspelmoor|Althegnenberg|Mering|Mering-St Afra|Kissing|Augsburg-Hochzoll|Augsburg Haunstetterstraße|Augsburg Hbf|Augsburg-Oberhausen|Neusäß|Westheim(Schwab)|Diedorf(Schwab)|Gessertshausen|Kutzenhausen|Dinkelscherben'}}
{'@id': '-5040855886902453859-2508221527-2', 'tl': {'@f': 'F', '@t': 'p', '@o': '80', '@c': 'ICE', '@n': '514'}, 'ar': {'@pt': '2508221535', '@pp': '10', '@hi': '1', '@ppth': 'München Hbf'}, 'dp': {'@pt': '2508221536', '@pp': '10', '@ppth': 'Augsburg Hbf|Ulm Hbf|Stuttgart Hbf|Mannheim Hbf|Frankfurt(M) Flughafen Fernbf|Köln Hbf|Solingen Hbf|Wuppertal Hbf|Hagen Hbf|Dortmund Hbf|Münster(Westf)Hbf|Osnabrück Hbf|Bremen Hbf|Hamburg-Harburg|Hamburg Hbf|Hamburg Dammtor|Hamburg-Altona'}}
{'@id': '-6683795694564720956-2508221454-22', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6674'}, 'ar': {'@pt': '2508221539', '@pp': '7', '@l': '6', '@ppth': 'Grafing Bahnhof|Kirchseeon|Eglharting|Zorneding|Baldham|Vaterstetten|Haar|Gronsdorf|München-Trudering|München-Berg am Laim|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221541', '@pp': '7', '@l': '6', '@ppth': 'München-Westkreuz|Lochham|Gräfelfing|Planegg|Stockdorf|Gauting|Starnberg Nord|Starnberg|Possenhofen|Feldafing|Tutzing'}}
{'@id': '-6869650552962585885-2508221502-2', 'tl': {'@f': 'F', '@t': 'p', '@o': '80', '@c': 'ICE', '@n': '562'}, 'ar': {'@pt': '2508221510', '@pp': '10', '@ppth': 'München Hbf'}, 'dp': {'@pt': '2508221511', '@pp': '10', '@ppth': 'Augsburg Hbf|Ulm Hbf|Esslingen(Neckar)|Vaihingen(Enz)|Mannheim Hbf|Neustadt(Weinstr)Hbf|Kaiserslautern Hbf|Homburg(Saar)Hbf|Saarbrücken Hbf'}}
{'@id': '-3914859027009179899-2508221524-12', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6679'}, 'ar': {'@pt': '2508221556', '@pp': '6', '@l': '6', '@ppth': 'Tutzing|Feldafing|Possenhofen|Starnberg|Starnberg Nord|Gauting|Stockdorf|Planegg|Gräfelfing|Lochham|München-Westkreuz'}, 'dp': {'@pt': '2508221556', '@pp': '6', '@l': '6', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Berg am Laim|München-Trudering|Gronsdorf|Haar|Vaterstetten|Baldham|Zorneding|Eglharting|Kirchseeon|Grafing Bahnhof|Grafing Stadt|Ebersberg(Oberbay)'}}
{'@id': '-4844159513161874748-2508221504-10', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6377'}, 'ar': {'@pt': '2508221529', '@pp': '5', '@l': '3', '@ppth': 'Mammendorf|Malching(Oberbay)|Maisach|Gernlinden|Esting|Olching|Gröbenzell|München-Lochhausen|München-Langwied'}, 'dp': {'@pt': '2508221529', '@pp': '5', '@l': '3', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München St.Martin-Str.|München-Giesing|München-Fasangarten|Fasanenpark|Unterhaching|Taufkirchen|Furth(b Deisenhofen)|Deisenhofen|Sauerlach|Otterfing|Holzkirchen'}}
{'@id': '-2760382551807092237-2508221415-21', 'tl': {'@f': 'N', '@t': 'p', '@o': 'GYRB', '@c': 'RB', '@n': '57059'}, 'ar': {'@pt': '2508221549', '@pp': '9', '@l': '87', '@wings': '-6170088429724475661-2508221433', '@ppth': 'Donauwörth|Bäumenheim|Mertingen Bahnhof|Nordendorf|Westendorf|Meitingen|Herbertshofen|Langweid(Lech)|Gablingen|Gersthofen|Augsburg-Oberhausen|Augsburg Hbf|Augsburg Haunstetterstraße|Augsburg-Hochzoll|Kissing|Mering-St Afra|Mering|Althegnenberg|Haspelmoor|Mammendorf'}, 'dp': {'@pt': '2508221550', '@pp': '9', '@l': '87', '@wings': '-6170088429724475661-2508221433', '@ppth': 'München Hbf'}}
{'@id': '-6170088429724475661-2508221433-17', 'tl': {'@f': 'N', '@t': 'p', '@o': 'GYRB', '@c': 'RB', '@n': '57159'}, 'ar': {'@pt': '2508221549', '@pp': '9', '@l': '86', '@ppth': 'Dinkelscherben|Kutzenhausen|Gessertshausen|Diedorf(Schwab)|Westheim(Schwab)|Neusäß|Augsburg-Oberhausen|Augsburg Hbf|Augsburg Haunstetterstraße|Augsburg-Hochzoll|Kissing|Mering-St Afra|Mering|Althegnenberg|Haspelmoor|Mammendorf'}, 'dp': {'@pt': '2508221550', '@pp': '9', '@l': '86', '@ppth': 'München Hbf'}}
{'@id': '4519570286968412900-2508221414-22', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6670'}, 'ar': {'@pt': '2508221459', '@pp': '7', '@l': '6', '@ppth': 'Grafing Bahnhof|Kirchseeon|Eglharting|Zorneding|Baldham|Vaterstetten|Haar|Gronsdorf|München-Trudering|München-Berg am Laim|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221501', '@pp': '7', '@l': '6', '@ppth': 'München-Westkreuz|Lochham|Gräfelfing|Planegg|Stockdorf|Gauting|Starnberg Nord|Starnberg|Possenhofen|Feldafing|Tutzing'}}
{'@id': '-2012686948782912427-2508221513-2', 'tl': {'@f': 'F', '@t': 'p', '@o': '80', '@c': 'ICE', '@n': '704'}, 'ar': {'@pt': '2508221521', '@pp': '10', '@hi': '1', '@ppth': 'München Hbf'}, 'dp': {'@pt': '2508221522', '@pp': '10', '@ppth': 'Augsburg Hbf|Donauwörth|Nürnberg Hbf|Bamberg|Erfurt Hbf|Halle(Saale)Hbf|Bitterfeld|Berlin Südkreuz|Berlin Hbf|Berlin-Spandau|Stendal Hbf|Salzwedel|Lüneburg|Hamburg Hbf|Hamburg-Altona'}}
{'@id': '-2221597426497896240-2508220726-13', 'tl': {'@f': 'F', '@t': 'p', '@o': '80', '@c': 'ICE', '@n': '595'}, 'ar': {'@pt': '2508221504', '@pp': '9', '@ppth': 'Berlin Hbf|Berlin Südkreuz|Lutherstadt Wittenberg Hbf|Leipzig Hbf|Erfurt Hbf|Eisenach Hbf|Fulda|Frankfurt(Main)Hbf|Mannheim Hbf|Stuttgart Hbf|Ulm Hbf|Augsburg Hbf'}, 'dp': {'@pt': '2508221506', '@pp': '9', '@hi': '1', '@ppth': 'München Hbf'}}
{'@id': '9169077739414774865-2508221415-22', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6370'}, 'ar': {'@pt': '2508221507', '@pp': '8', '@l': '3', '@ppth': 'Holzkirchen|Otterfing|Sauerlach|Deisenhofen|Furth(b Deisenhofen)|Taufkirchen|Unterhaching|Fasanenpark|München-Fasangarten|München-Giesing|München St.Martin-Str.|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221507', '@pp': '8', '@l': '3', '@ppth': 'München-Langwied|München-Lochhausen|Gröbenzell|Olching|Esting|Gernlinden|Maisach|Malching(Oberbay)|Mammendorf'}}
{'@id': '-2956685821628783060-2508221502-24', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6676'}, 'ar': {'@pt': '2508221559', '@pp': '7', '@l': '6', '@ppth': 'Ebersberg(Oberbay)|Grafing Stadt|Grafing Bahnhof|Kirchseeon|Eglharting|Zorneding|Baldham|Vaterstetten|Haar|Gronsdorf|München-Trudering|München-Berg am Laim|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221601', '@pp': '7', '@l': '6', '@ppth': 'München-Westkreuz|Lochham|Gräfelfing|Planegg|Stockdorf|Gauting|Starnberg Nord|Starnberg|Possenhofen|Feldafing|Tutzing'}}
{'@id': '208775187102140085-2508221424-20', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6870'}, 'ar': {'@pt': '2508221513', '@pp': '8', '@l': '8', '@ppth': 'München Flughafen Terminal|München Flughafen Besucherpark|Hallbergmoos|Ismaning|Unterföhring|München-Johanneskirchen|München-Englschalking|München-Daglfing|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221515', '@pp': '8', '@l': '8', '@ppth': 'München-Westkreuz|München-Neuaubing|München-Freiham|Harthaus|Germering-Unterpfaffenhofen|Geisenbrunn|Gilching-Argelsried|Neugilching|Weßling(Oberbay)|Steinebach|Seefeld-Hechendorf|Herrsching'}}
{'@id': '3339188053375239505-2508221515-4', 'tl': {'@f': 'N', '@t': 'p', '@o': '800790', '@c': 'RB', '@n': '59522'}, 'ar': {'@pt': '2508221551', '@pp': '3', '@l': '65', '@wings': '266527286084119102-2508221447', '@ppth': 'Weilheim(Oberbay)|Tutzing|Starnberg'}, 'dp': {'@pt': '2508221551', '@pp': '3', '@l': '65', '@wings': '266527286084119102-2508221447', '@ppth': 'München Hbf Gl.27-36'}}
{'@id': '6024049495099900062-2508221530-2', 'tl': {'@f': 'N', '@t': 'p', '@o': '800790', '@c': 'RB', '@n': '5526'}, 'ar': {'@pt': '2508221536', '@pp': '4', '@l': '60', '@ppth': 'München Hbf Gl.27-36'}, 'dp': {'@pt': '2508221537', '@pp': '4', '@l': '60', '@pde': 'Pfronten-Steinach', '@ppth': 'Tutzing|Weilheim(Oberbay)|Huglfing|Uffing a Staffelsee|Murnau|Ohlstadt|Eschenlohe|Oberau|Farchant|Garmisch-Partenkirchen|Garmisch-Partenkirchen Hausberg|Untergrainau|Ehrwald Zugspitzbahn'}}
{'@id': '-8100162520049281387-2508221236-14', 'tl': {'@f': 'N', '@t': 'p', '@o': '800790', '@c': 'RB', '@n': '5517'}, 'ar': {'@pt': '2508221519', '@pp': '3', '@l': '60', '@pde': 'Pfronten-Steinach', '@ppth': 'Ehrwald Zugspitzbahn|Untergrainau|Garmisch-Partenkirchen Hausberg|Garmisch-Partenkirchen|Farchant|Oberau|Eschenlohe|Ohlstadt|Murnau|Uffing a Staffelsee|Huglfing|Weilheim(Oberbay)|Tutzing'}, 'dp': {'@pt': '2508221519', '@pp': '3', '@l': '60', '@ppth': 'München Hbf Gl.27-36'}}
{'@id': '-6682446121392910428-2508221459-2', 'tl': {'@f': 'N', '@t': 'p', '@o': '800790', '@c': 'RB', '@n': '59623'}, 'ar': {'@pt': '2508221504', '@pp': '4', '@l': '66', '@wings': '1228474616665765113-2508221459', '@ppth': 'München Hbf Gl.27-36'}, 'dp': {'@pt': '2508221505', '@pp': '4', '@l': '66', '@wings': '1228474616665765113-2508221459', '@ppth': 'Starnberg|Tutzing|Bernried|Seeshaupt|Iffeldorf|Penzberg|Bichl|Benediktbeuern|Kochel'}}
{'@id': '6103878588797646097-2508221504-12', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6677'}, 'ar': {'@pt': '2508221536', '@pp': '5', '@l': '6', '@ppth': 'Tutzing|Feldafing|Possenhofen|Starnberg|Starnberg Nord|Gauting|Stockdorf|Planegg|Gräfelfing|Lochham|München-Westkreuz'}, 'dp': {'@pt': '2508221536', '@pp': '5', '@l': '6', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Berg am Laim|München-Trudering|Gronsdorf|Haar|Vaterstetten|Baldham|Zorneding|Eglharting|Kirchseeon|Grafing Bahnhof|Grafing Stadt|Ebersberg(Oberbay)'}}
{'@id': '266527286084119102-2508221447-10', 'tl': {'@f': 'N', '@t': 'p', '@o': '800790', '@c': 'RB', '@n': '59622'}, 'ar': {'@pt': '2508221551', '@pp': '3', '@l': '66', '@ppth': 'Kochel|Benediktbeuern|Bichl|Penzberg|Iffeldorf|Seeshaupt|Bernried|Tutzing|Starnberg'}, 'dp': {'@pt': '2508221551', '@pp': '3', '@l': '66', '@ppth': 'München Hbf Gl.27-36'}}
{'@id': '7772427930572833707-2508221541-6', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6039'}, 'ar': {'@pt': '2508221551', '@pp': '5', '@l': '5', '@ppth': 'Germering-Unterpfaffenhofen|Harthaus|München-Freiham|München-Neuaubing|München-Westkreuz'}, 'dp': {'@pt': '2508221553', '@pp': '5', '@l': '5', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München St.Martin-Str.|München-Giesing|München-Perlach|München-Neuperlach Süd|Neubiberg|Ottobrunn|Hohenbrunn|Wächterhof|Höhenkirchen-Siegertsbrunn|Dürrnhaar|Aying'}}
{'@id': '-2724305338568615002-2508221520-2', 'tl': {'@f': 'N', '@t': 'p', '@o': '8007D5', '@c': 'RE', '@n': '7888'}, 'ar': {'@pt': '2508221526', '@pp': '4', '@l': '76', '@ppth': 'München Hbf Gl.27-36'}, 'dp': {'@pt': '2508221527', '@pp': '4', '@l': '76', '@ppth': 'Kaufering|Buchloe|Kaufbeuren|Kempten(Allgäu)Hbf|Immenstadt|Blaichach(Allgäu)|Sonthofen|Fischen|Oberstdorf'}}
{'@id': '3245224878810359565-2508221322-15', 'tl': {'@f': 'N', '@t': 'p', '@o': 'GYRE', '@c': 'RE', '@n': '78934'}, 'ar': {'@pt': '2508221558', '@pp': '3', '@l': '96', '@ppth': 'Lindau-Reutin|Lindau-Insel|Hergatz|Wangen(Allgäu)|Kißlegg|Leutkirch|Aichstetten|Marstetten-Aitrach|Tannheim(Württ)|Memmingen|Mindelheim|Türkheim(Bay)Bf|Buchloe|Geltendorf'}, 'dp': {'@pt': '2508221559', '@pp': '3', '@l': '96', '@ppth': 'München Hbf'}}
{'@id': '8594438991994552503-2508221536-2', 'tl': {'@f': 'N', '@t': 'p', '@o': 'GYRE', '@c': 'RE', '@n': '57050'}, 'ar': {'@pt': '2508221543', '@pp': '10', '@l': '80', '@wings': '-2807439854913003066-2508221536', '@ppth': 'München Hbf'}, 'dp': {'@pt': '2508221544', '@pp': '10', '@l': '80', '@wings': '-2807439854913003066-2508221536', '@ppth': 'Mering|Mering-St Afra|Kissing|Augsburg-Hochzoll|Augsburg Haunstetterstraße|Augsburg Hbf|Augsburg-Oberhausen|Meitingen|Nordendorf|Mertingen Bahnhof|Donauwörth|Otting-Weilheim|Treuchtlingen|Gunzenhausen|Muhr am See|Triesdorf|Ansbach|Oberdachstetten|Burgbernheim-Wildbad|Steinach(bei Rothenburg ob der Tauber)|Uffenheim|Marktbreit|Ochsenfurt|Goßmannsdorf|Winterhausen|Würzburg-Heidingsfeld Ost|Würzburg Süd|Würzburg Hbf'}}
{'@id': '-7017231625406463503-2508221511-19', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '9644'}, 'ar': {'@pt': '2508221549', '@pp': '8', '@l': '3', '@ppth': 'Zorneding|Baldham|Vaterstetten|Haar|Gronsdorf|München-Trudering|München-Berg am Laim|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221557', '@pp': '8', '@l': '3', '@ppth': 'München-Langwied|München-Lochhausen|Gröbenzell|Olching|Esting|Gernlinden|Maisach'}}
{'@id': '-5748510138816724812-2508221507-1', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6475'}, 'dp': {'@pt': '2508221507', '@pp': '6', '@l': '4', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Berg am Laim|München-Trudering|Gronsdorf|Haar|Vaterstetten|Baldham|Zorneding|Eglharting|Kirchseeon|Grafing Bahnhof'}}
{'@id': '1309043137254389712-2508221541-1', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '8369'}, 'dp': {'@pt': '2508221541', '@pp': '5', '@l': '3', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost'}}
{'@id': '2939847274666812254-2508221501-6', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6035'}, 'ar': {'@pt': '2508221511', '@pp': '5', '@l': '5', '@ppth': 'Germering-Unterpfaffenhofen|Harthaus|München-Freiham|München-Neuaubing|München-Westkreuz'}, 'dp': {'@pt': '2508221513', '@pp': '5', '@l': '5', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München St.Martin-Str.|München-Giesing|München-Perlach|München-Neuperlach Süd|Neubiberg|Ottobrunn|Hohenbrunn|Wächterhof|Höhenkirchen-Siegertsbrunn|Aying|Großhelfendorf|Kreuzstraße'}}
{'@id': '-4376796942515647789-2508221530-2', 'tl': {'@f': 'N', '@t': 'p', '@o': '800790', '@c': 'RB', '@n': '5429'}, 'ar': {'@pt': '2508221536', '@pp': '4', '@l': '6', '@wings': '5423042475604358027-2508221530|6024049495099900062-2508221530', '@ppth': 'München Hbf Gl.27-36'}, 'dp': {'@pt': '2508221537', '@pp': '4', '@l': '6', '@wings': '5423042475604358027-2508221530|6024049495099900062-2508221530', '@ppth': 'Tutzing|Weilheim(Oberbay)|Huglfing|Uffing a Staffelsee|Murnau|Ohlstadt|Eschenlohe|Oberau|Farchant|Garmisch-Partenkirchen|Klais|Mittenwald'}}
{'@id': '6577456293968972819-2508221527-1', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6477'}, 'dp': {'@pt': '2508221527', '@pp': '6', '@l': '4', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Berg am Laim|München-Trudering|Gronsdorf|Haar|Vaterstetten|Baldham|Zorneding|Eglharting|Kirchseeon|Grafing Bahnhof'}}
{'@id': '-5904187059301460606-2508221411-22', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6040'}, 'ar': {'@pt': '2508221503', '@pp': '7', '@l': '5', '@ppth': 'Aying|Dürrnhaar|Höhenkirchen-Siegertsbrunn|Wächterhof|Hohenbrunn|Ottobrunn|Neubiberg|München-Neuperlach Süd|München-Perlach|München-Giesing|München St.Martin-Str.|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221504', '@pp': '7', '@l': '5', '@ppth': 'München-Westkreuz|München-Neuaubing|München-Freiham|Harthaus|Germering-Unterpfaffenhofen'}}
{'@id': '-4785315022724349961-2508221431-19', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6070'}, 'ar': {'@pt': '2508221509', '@pp': '8', '@l': '4', '@ppth': 'Zorneding|Baldham|Vaterstetten|Haar|Gronsdorf|München-Trudering|München-Berg am Laim|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221511', '@pp': '8', '@l': '4', '@ppth': 'München Leienfelsstr.|München-Aubing|Puchheim|Eichenau(Oberbay)|Fürstenfeldbruck|Buchenau(Oberbay)|Schöngeising|Grafrath|Türkenfeld|Geltendorf'}}
{'@id': '3039410843321569878-2508221520-2', 'tl': {'@f': 'N', '@t': 'p', '@o': '8007D5', '@c': 'RE', '@n': '3888'}, 'ar': {'@pt': '2508221526', '@pp': '4', '@l': '70', '@wings': '-2724305338568615002-2508221520', '@ppth': 'München Hbf Gl.27-36'}, 'dp': {'@pt': '2508221527', '@pp': '4', '@l': '70', '@wings': '-2724305338568615002-2508221520', '@ppth': 'Kaufering|Buchloe|Kaufbeuren|Kempten(Allgäu)Hbf|Immenstadt|Oberstaufen|Röthenbach(Allgäu)|Heimenkirch|Hergatz|Lindau-Reutin'}}
{'@id': '1020570103366396504-2508221459-16', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '9632'}, 'ar': {'@pt': '2508221529', '@pp': '8', '@l': '3', '@ppth': 'Haar|Gronsdorf|München-Trudering|München-Berg am Laim|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221537', '@pp': '8', '@l': '3', '@ppth': 'München-Langwied|München-Lochhausen|Gröbenzell|Olching|Esting|Gernlinden|Maisach'}}
{'@id': '-2807439854913003066-2508221536-2', 'tl': {'@f': 'N', '@t': 'p', '@o': 'GYRE', '@c': 'RE', '@n': '57150'}, 'ar': {'@pt': '2508221543', '@pp': '10', '@l': '89', '@ppth': 'München Hbf'}, 'dp': {'@pt': '2508221544', '@pp': '10', '@l': '89', '@ppth': 'Mering|Mering-St Afra|Kissing|Augsburg-Hochzoll|Augsburg Haunstetterstraße|Augsburg Hbf|Augsburg-Oberhausen|Meitingen|Nordendorf|Mertingen Bahnhof|Donauwörth|Wörnitzstein|Ebermergen|Harburg(Schwab)|Hoppingen|Möttingen|Nördlingen|Pflaumloch|Trochtelfingen(b Bopfingen)|Bopfingen|Aufhausen(Württ)|Lauchheim|Westhausen|Goldshöfe|Wasseralfingen|Aalen Hbf'}}
{'@id': '-4587435825773351888-2508221319-24', 'tl': {'@f': 'N', '@t': 'p', '@o': 'GYRE', '@c': 'RE', '@n': '57057'}, 'ar': {'@pt': '2508221513', '@pp': '9', '@l': '9', '@ppth': 'Ulm Hbf|Neu-Ulm|Nersingen|Leipheim|Günzburg|Offingen|Mindelaltheim|Burgau(Schwab)|Jettingen|Freihalden|Dinkelscherben|Kutzenhausen|Gessertshausen|Diedorf(Schwab)|Westheim(Schwab)|Neusäß|Augsburg-Oberhausen|Augsburg Hbf|Augsburg Haunstetterstraße|Augsburg-Hochzoll|Kissing|Mering-St Afra|Mering'}, 'dp': {'@pt': '2508221514', '@pp': '9', '@l': '9', '@ppth': 'München Hbf'}}
{'@id': '6956723430775212178-2508221524-10', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6379'}, 'ar': {'@pt': '2508221549', '@pp': '6', '@l': '3', '@ppth': 'Mammendorf|Malching(Oberbay)|Maisach|Gernlinden|Esting|Olching|Gröbenzell|München-Lochhausen|München-Langwied'}, 'dp': {'@pt': '2508221549', '@pp': '6', '@l': '3', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München St.Martin-Str.|München-Giesing|München-Fasangarten|Fasanenpark|Unterhaching|Taufkirchen|Furth(b Deisenhofen)|Deisenhofen|Sauerlach|Otterfing|Holzkirchen'}}
{'@id': '2247686186173080943-2508221540-8', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '9681'}, 'ar': {'@pt': '2508221559', '@pp': '5', '@l': '4', '@ppth': 'Maisach|Gernlinden|Esting|Olching|Gröbenzell|München-Lochhausen|München-Langwied'}, 'dp': {'@pt': '2508221607', '@pp': '5', '@l': '4', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Berg am Laim|München-Trudering|Gronsdorf|Haar|Vaterstetten|Baldham|Zorneding|Eglharting|Kirchseeon|Grafing Bahnhof'}}
{'@id': '8567378137737406120-2508221504-20', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6874'}, 'ar': {'@pt': '2508221553', '@pp': '7', '@l': '8', '@ppth': 'München Flughafen Terminal|München Flughafen Besucherpark|Hallbergmoos|Ismaning|Unterföhring|München-Johanneskirchen|München-Englschalking|München-Daglfing|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221555', '@pp': '7', '@l': '8', '@ppth': 'München-Westkreuz|München-Neuaubing|München-Freiham|Harthaus|Germering-Unterpfaffenhofen|Geisenbrunn|Gilching-Argelsried|Neugilching|Weßling(Oberbay)|Steinebach|Seefeld-Hechendorf|Herrsching'}}
{'@id': '-1852644447246304178-2508221444-20', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6872'}, 'ar': {'@pt': '2508221533', '@pp': '7', '@l': '8', '@ppth': 'München Flughafen Terminal|München Flughafen Besucherpark|Hallbergmoos|Ismaning|Unterföhring|München-Johanneskirchen|München-Englschalking|München-Daglfing|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221535', '@pp': '7', '@l': '8', '@ppth': 'München-Westkreuz|München-Neuaubing|München-Freiham|Harthaus|Germering-Unterpfaffenhofen|Geisenbrunn|Gilching-Argelsried|Neugilching|Weßling(Oberbay)|Steinebach|Seefeld-Hechendorf|Herrsching'}}
{'@id': '-2049893442857390984-2508221425-13', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6875'}, 'ar': {'@pt': '2508221501', '@pp': '5', '@l': '8', '@ppth': 'Herrsching|Seefeld-Hechendorf|Steinebach|Weßling(Oberbay)|Neugilching|Gilching-Argelsried|Geisenbrunn|Germering-Unterpfaffenhofen|Harthaus|München-Freiham|München-Neuaubing|München-Westkreuz'}, 'dp': {'@pt': '2508221503', '@pp': '5', '@l': '8', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Daglfing|München-Englschalking|München-Johanneskirchen|Unterföhring|Ismaning|Hallbergmoos|München Flughafen Besucherpark|München Flughafen Terminal'}}
{'@id': '2179943929350807329-2508221455-22', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6374'}, 'ar': {'@pt': '2508221547', '@pp': '8', '@l': '3', '@ppth': 'Holzkirchen|Otterfing|Sauerlach|Deisenhofen|Furth(b Deisenhofen)|Taufkirchen|Unterhaching|Fasanenpark|München-Fasangarten|München-Giesing|München St.Martin-Str.|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221547', '@pp': '8', '@l': '3', '@ppth': 'München-Langwied|München-Lochhausen|Gröbenzell|Olching|Esting|Gernlinden|Maisach|Malching(Oberbay)|Mammendorf'}}
{'@id': '8967817402499523596-2508221336-13', 'tl': {'@f': 'N', '@t': 'p', '@o': '800790', '@c': 'RB', '@n': '5416'}, 'ar': {'@pt': '2508221519', '@pp': '3', '@l': '6', '@wings': '-8100162520049281387-2508221236', '@ppth': 'Mittenwald|Klais|Garmisch-Partenkirchen|Farchant|Oberau|Eschenlohe|Ohlstadt|Murnau|Uffing a Staffelsee|Huglfing|Weilheim(Oberbay)|Tutzing'}, 'dp': {'@pt': '2508221519', '@pp': '3', '@l': '6', '@wings': '-8100162520049281387-2508221236', '@ppth': 'München Hbf Gl.27-36'}}
{'@id': '-6114621370144526434-2508221444-10', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6375'}, 'ar': {'@pt': '2508221509', '@pp': '5', '@l': '3', '@ppth': 'Mammendorf|Malching(Oberbay)|Maisach|Gernlinden|Esting|Olching|Gröbenzell|München-Lochhausen|München-Langwied'}, 'dp': {'@pt': '2508221509', '@pp': '5', '@l': '3', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München St.Martin-Str.|München-Giesing|München-Fasangarten|Fasanenpark|Unterhaching|Taufkirchen|Furth(b Deisenhofen)|Deisenhofen|Sauerlach|Otterfing|Holzkirchen'}}
{'@id': '-5883962921561989599-2508221435-22', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6372'}, 'ar': {'@pt': '2508221527', '@pp': '8', '@l': '3', '@ppth': 'Holzkirchen|Otterfing|Sauerlach|Deisenhofen|Furth(b Deisenhofen)|Taufkirchen|Unterhaching|Fasanenpark|München-Fasangarten|München-Giesing|München St.Martin-Str.|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221527', '@pp': '8', '@l': '3', '@ppth': 'München-Langwied|München-Lochhausen|Gröbenzell|Olching|Esting|Gernlinden|Maisach|Malching(Oberbay)|Mammendorf'}}
{'@id': '7497390669623052421-2508221445-13', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6877'}, 'ar': {'@pt': '2508221521', '@pp': '5', '@l': '8', '@ppth': 'Herrsching|Seefeld-Hechendorf|Steinebach|Weßling(Oberbay)|Neugilching|Gilching-Argelsried|Geisenbrunn|Germering-Unterpfaffenhofen|Harthaus|München-Freiham|München-Neuaubing|München-Westkreuz'}, 'dp': {'@pt': '2508221523', '@pp': '5', '@l': '8', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Daglfing|München-Englschalking|München-Johanneskirchen|Unterföhring|Ismaning|Hallbergmoos|München Flughafen Besucherpark|München Flughafen Terminal'}}
{'@id': '3469506571835051126-2508221422-24', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6672'}, 'ar': {'@pt': '2508221519', '@pp': '7', '@l': '6', '@ppth': 'Ebersberg(Oberbay)|Grafing Stadt|Grafing Bahnhof|Kirchseeon|Eglharting|Zorneding|Baldham|Vaterstetten|Haar|Gronsdorf|München-Trudering|München-Berg am Laim|München Leuchtenbergring|München Ost|München Rosenheimer Platz|München Isartor|München Marienplatz|München Karlsplatz|München Hbf (tief)|München Hackerbrücke|München Donnersbergerbrücke|München Hirschgarten|München-Laim'}, 'dp': {'@pt': '2508221521', '@pp': '7', '@l': '6', '@ppth': 'München-Westkreuz|Lochham|Gräfelfing|Planegg|Stockdorf|Gauting|Starnberg Nord|Starnberg|Possenhofen|Feldafing|Tutzing'}}
{'@id': '3574185604701088811-2508221505-13', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6879'}, 'ar': {'@pt': '2508221541', '@pp': '6', '@l': '8', '@ppth': 'Herrsching|Seefeld-Hechendorf|Steinebach|Weßling(Oberbay)|Neugilching|Gilching-Argelsried|Geisenbrunn|Germering-Unterpfaffenhofen|Harthaus|München-Freiham|München-Neuaubing|München-Westkreuz'}, 'dp': {'@pt': '2508221543', '@pp': '6', '@l': '8', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München Leuchtenbergring|München-Daglfing|München-Englschalking|München-Johanneskirchen|Unterföhring|Ismaning|Hallbergmoos|München Flughafen Besucherpark|München Flughafen Terminal'}}
{'@id': '3209073207107291267-2508221521-6', 'tl': {'@f': 'S', '@t': 'p', '@o': '800725', '@c': 'S', '@n': '6037'}, 'ar': {'@pt': '2508221531', '@pp': '5', '@l': '5', '@ppth': 'Germering-Unterpfaffenhofen|Harthaus|München-Freiham|München-Neuaubing|München-Westkreuz'}, 'dp': {'@pt': '2508221533', '@pp': '5', '@l': '5', '@ppth': 'München-Laim|München Hirschgarten|München Donnersbergerbrücke|München Hackerbrücke|München Hbf (tief)|München Karlsplatz|München Marienplatz|München Isartor|München Rosenheimer Platz|München Ost|München St.Martin-Str.|München-Giesing|München-Perlach|München-Neuperlach Süd|Neubiberg|Ottobrunn|Hohenbrunn|Wächterhof|Höhenkirchen-Siegertsbrunn|Dürrnhaar|Aying|Peiß|Großhelfendorf|Kreuzstraße'}}
{'@id': '1228474616665765113-2508221459-2', 'tl': {'@f': 'N', '@t': 'p', '@o': '800790', '@c': 'RB', '@n': '59523'}, 'ar': {'@pt': '2508221504', '@pp': '4', '@l': '65', '@ppth': 'München Hbf Gl.27-36'}, 'dp': {'@pt': '2508221505', '@pp': '4', '@l': '65', '@ppth': 'Starnberg|Tutzing|Weilheim(Oberbay)'}}
{'@id': '5423042475604358027-2508221530-2', 'tl': {'@f': 'N', '@t': 'p', '@o': '800790', '@c': 'RB', '@n': '59649'}, 'ar': {'@pt': '2508221536', '@pp': '4', '@l': '66', '@ppth': 'München Hbf Gl.27-36'}, 'dp': {'@pt': '2508221537', '@pp': '4', '@l': '66', '@ppth': 'Tutzing|Bernried|Seeshaupt|Penzberg'}}
{'@id': '-4066772685972753212-2508220744-10', 'tl': {'@f': 'F', '@t': 'p', '@o': '84', '@c': 'ICE', '@n': '255'}, 'ar': {'@pt': '2508221518', '@pp': '9', '@ppth': 'Amsterdam Centraal|Utrecht Centraal|Köln Hbf|Siegburg/Bonn|Frankfurt(M) Flughafen Fernbf|Mannheim Hbf|Esslingen(Neckar)|Ulm Hbf|Augsburg Hbf'}, 'dp': {'@pt': '2508221520', '@pp': '9', '@hi': '1', '@ppth': 'München Hbf'}}

12
pyproject.toml Normal file
View File

@@ -0,0 +1,12 @@
[project]
name = "bahnhofstafel-puller"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"cachetools>=6.1.0",
"datetime>=5.5",
"requests>=2.32.5",
"xmltodict>=0.14.2",
]

161
uv.lock generated Normal file
View File

@@ -0,0 +1,161 @@
version = 1
revision = 2
requires-python = ">=3.13"
[[package]]
name = "bahnhofstafel-puller"
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "cachetools" },
{ name = "datetime" },
{ name = "requests" },
{ name = "xmltodict" },
]
[package.metadata]
requires-dist = [
{ name = "cachetools", specifier = ">=6.1.0" },
{ name = "datetime", specifier = ">=5.5" },
{ name = "requests", specifier = ">=2.32.5" },
{ name = "xmltodict", specifier = ">=0.14.2" },
]
[[package]]
name = "cachetools"
version = "6.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/8a/89/817ad5d0411f136c484d535952aef74af9b25e0d99e90cdffbe121e6d628/cachetools-6.1.0.tar.gz", hash = "sha256:b4c4f404392848db3ce7aac34950d17be4d864da4b8b66911008e430bc544587", size = 30714, upload-time = "2025-06-16T18:51:03.07Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/00/f0/2ef431fe4141f5e334759d73e81120492b23b2824336883a91ac04ba710b/cachetools-6.1.0-py3-none-any.whl", hash = "sha256:1c7bb3cf9193deaf3508b7c5f2a79986c13ea38965c5adcff1f84519cf39163e", size = 11189, upload-time = "2025-06-16T18:51:01.514Z" },
]
[[package]]
name = "certifi"
version = "2025.8.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" },
]
[[package]]
name = "charset-normalizer"
version = "3.4.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" },
{ url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" },
{ url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" },
{ url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" },
{ url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" },
{ url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" },
{ url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" },
{ url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" },
{ url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" },
{ url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" },
{ url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" },
{ url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" },
{ url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" },
{ url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" },
{ url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" },
{ url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" },
{ url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" },
{ url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" },
{ url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" },
{ url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" },
{ url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" },
{ url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" },
{ url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" },
]
[[package]]
name = "datetime"
version = "5.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pytz" },
{ name = "zope-interface" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2f/66/e284b9978fede35185e5d18fb3ae855b8f573d8c90a56de5f6d03e8ef99e/DateTime-5.5.tar.gz", hash = "sha256:21ec6331f87a7fcb57bd7c59e8a68bfffe6fcbf5acdbbc7b356d6a9a020191d3", size = 63671, upload-time = "2024-03-21T07:26:50.211Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f3/78/8e382b8cb4346119e2e04270b6eb4a01c5ee70b47a8a0244ecdb157204f7/DateTime-5.5-py3-none-any.whl", hash = "sha256:0abf6c51cb4ba7cee775ca46ccc727f3afdde463be28dbbe8803631fefd4a120", size = 52649, upload-time = "2024-03-21T07:26:47.849Z" },
]
[[package]]
name = "idna"
version = "3.10"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
]
[[package]]
name = "pytz"
version = "2025.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" },
]
[[package]]
name = "requests"
version = "2.32.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "charset-normalizer" },
{ name = "idna" },
{ name = "urllib3" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
]
[[package]]
name = "setuptools"
version = "80.9.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" },
]
[[package]]
name = "urllib3"
version = "1.26.20"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/e4/e8/6ff5e6bc22095cfc59b6ea711b687e2b7ed4bdb373f7eeec370a97d7392f/urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32", size = 307380, upload-time = "2024-08-29T15:43:11.37Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/33/cf/8435d5a7159e2a9c83a95896ed596f68cf798005fe107cc655b5c5c14704/urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", size = 144225, upload-time = "2024-08-29T15:43:08.921Z" },
]
[[package]]
name = "xmltodict"
version = "0.14.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/50/05/51dcca9a9bf5e1bce52582683ce50980bcadbc4fa5143b9f2b19ab99958f/xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553", size = 51942, upload-time = "2024-10-16T06:10:29.683Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d6/45/fc303eb433e8a2a271739c98e953728422fa61a3c1f36077a49e395c972e/xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac", size = 9981, upload-time = "2024-10-16T06:10:27.649Z" },
]
[[package]]
name = "zope-interface"
version = "7.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "setuptools" },
]
sdist = { url = "https://files.pythonhosted.org/packages/30/93/9210e7606be57a2dfc6277ac97dcc864fd8d39f142ca194fdc186d596fda/zope.interface-7.2.tar.gz", hash = "sha256:8b49f1a3d1ee4cdaf5b32d2e738362c7f5e40ac8b46dd7d1a65e82a4872728fe", size = 252960, upload-time = "2024-11-28T08:45:39.224Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c6/3b/e309d731712c1a1866d61b5356a069dd44e5b01e394b6cb49848fa2efbff/zope.interface-7.2-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:3e0350b51e88658d5ad126c6a57502b19d5f559f6cb0a628e3dc90442b53dd98", size = 208961, upload-time = "2024-11-28T08:48:29.865Z" },
{ url = "https://files.pythonhosted.org/packages/49/65/78e7cebca6be07c8fc4032bfbb123e500d60efdf7b86727bb8a071992108/zope.interface-7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15398c000c094b8855d7d74f4fdc9e73aa02d4d0d5c775acdef98cdb1119768d", size = 209356, upload-time = "2024-11-28T08:48:33.297Z" },
{ url = "https://files.pythonhosted.org/packages/11/b1/627384b745310d082d29e3695db5f5a9188186676912c14b61a78bbc6afe/zope.interface-7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:802176a9f99bd8cc276dcd3b8512808716492f6f557c11196d42e26c01a69a4c", size = 264196, upload-time = "2024-11-28T09:18:17.584Z" },
{ url = "https://files.pythonhosted.org/packages/b8/f6/54548df6dc73e30ac6c8a7ff1da73ac9007ba38f866397091d5a82237bd3/zope.interface-7.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb23f58a446a7f09db85eda09521a498e109f137b85fb278edb2e34841055398", size = 259237, upload-time = "2024-11-28T08:48:31.71Z" },
{ url = "https://files.pythonhosted.org/packages/b6/66/ac05b741c2129fdf668b85631d2268421c5cd1a9ff99be1674371139d665/zope.interface-7.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71a5b541078d0ebe373a81a3b7e71432c61d12e660f1d67896ca62d9628045b", size = 264696, upload-time = "2024-11-28T08:48:41.161Z" },
{ url = "https://files.pythonhosted.org/packages/0a/2f/1bccc6f4cc882662162a1158cda1a7f616add2ffe322b28c99cb031b4ffc/zope.interface-7.2-cp313-cp313-win_amd64.whl", hash = "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd", size = 212472, upload-time = "2024-11-28T08:49:56.587Z" },
]