Spanien (Renfe + Cercanías), Polen, Norwegen, Dänemark, Österreich (ÖBB + Wiener Linien), Schweden (Key)

- mehrere Quellen je Land (country), Grenzen aus Natural Earth, OSM und Kachelausschnitt erweitert
- Fahrpläne glätten: Unterordner im Zip, aufgefüllte Felder, fehlende parent_station, level_id
- Gattung aus der Zugnummer (ÖBB 'RJ 658'), Fernverkehr auch über Routentyp 101/102/105
- Echtzeit: Verspätung vor Uhrzeit (Renfe), Fahrten ohne Datum, Key in der Adresse (Trafiklab)
- httpx-Logs aus (würden Keys zeigen)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X48pE4bzjHej8w9HyZXCjb
This commit is contained in:
Claude
2026-10-23 09:53:56 +02:00
parent 650f8dca8c
commit ef67df6e00
12 changed files with 247 additions and 57 deletions
+59 -2
View File
@@ -44,8 +44,59 @@ SOURCES = {
"needs_key": False,
"rt_interval": 60,
},
# Spanien: Renfe hat Fern-/Regionalverkehr und Cercanías (S-Bahn) als getrennte Fahrpläne
"es": { # Renfe AVE, Alvia, Media Distancia …; Echtzeit ohne Datum, Trip-IDs enthalten den Tag
"gtfs_url": "https://ssl.renfe.com/gtransit/Fichero_AV_LD/google_transit.zip",
"rt_url": "https://gtfsrt.renfe.com/trip_updates_LD.pb",
"rt_key": "", "needs_key": False, "rt_interval": 60,
},
"es_cer": { # Renfe Cercanías/Rodalies (alles S-Bahn)
"country": "es", "all_sbahn": True,
"gtfs_url": "https://ssl.renfe.com/ftransit/Fichero_CER_FOMENTO/fomento_transit.zip",
"rt_url": "https://gtfsrt.renfe.com/trip_updates.pb",
"rt_key": "", "needs_key": False, "rt_interval": 60,
},
"pl": { # alle Bahnbetreiber, aufbereitet von Mikołaj Kuranowski (mkuran.pl); Echtzeit CC BY 4.0
"gtfs_url": "https://mkuran.pl/gtfs/polish_trains.zip",
"rt_url": "https://mkuran.pl/gtfs/polish_trains/updates.pb",
"rt_key": "", "needs_key": False,
"rt_interval": 120, # ~5 MB pro Abruf
},
"no": { # Entur (NLOD); Gesamt-Echtzeit wäre 15 MB, darum nur die Betreiber von Bahn, Tram, T-bane
"gtfs_url": "https://storage.googleapis.com/marduk-production/outbound/gtfs/rb_norway-aggregated-gtfs.zip",
"rt_url": " ".join(f"https://api.entur.io/realtime/v1/gtfs-rt/trip-updates?datasource={ds}" for ds in ("VYG", "FLT", "GOA", "RUT", "ATB", "SKY")),
"rt_key": "", "needs_key": False, "rt_interval": 60,
},
"dk": { # Rejseplanen (alle Verkehrsmittel); keine offene Echtzeit
"gtfs_url": "https://www.rejseplanen.info/labs/GTFS.zip",
"rt_url": "", "rt_key": "", "needs_key": False, "rt_interval": 60,
},
"at": { # ÖBB (CC BY 4.0), einmal pro Fahrplanjahr ({year}); keine offene Echtzeit
"gtfs_url": "https://static.web.oebb.at/open-data/soll-fahrplan-gtfs/GTFS_Fahrplan_{year}.zip",
"rt_url": "", "rt_key": "", "needs_key": False, "rt_interval": 60,
},
"at_wl": { # Wiener Linien (Tram, U-Bahn, Badner Bahn), CC BY 4.0
"country": "at",
"gtfs_url": "http://www.wienerlinien.at/ogd_realtime/doku/ogd/gtfs/gtfs.zip",
"rt_url": "", "rt_key": "", "needs_key": False, "rt_interval": 60,
},
"se": { # Trafiklab GTFS Sweden 3 (alle Züge); kostenloser Key nötig, auch für den Fahrplan
"gtfs_url": "https://opendata.samtrafiken.se/gtfs-sweden/sweden.zip?key={key}",
# Echtzeit nur für einige Regionen (Stockholm, Skåne); Züge landesweit noch nicht
"rt_url": " ".join("https://opendata.samtrafiken.se/gtfs-rt-sweden/{op}/TripUpdatesSweden.pb?key={key}".replace("{op}", op) for op in ("sl", "skane")),
"rt_key": os.environ.get("TRAINPULSE_SE_KEY", ""),
"needs_key": True, "static_needs_key": True,
# Bronze-Key: 30 000 Echtzeit- und 50 Fahrplan-Abrufe im Monat
"rt_interval": int(os.environ.get("TRAINPULSE_SE_RT_INTERVAL") or 300),
"check_hours": 48,
},
}
ENABLED = [s for s in os.environ.get("TRAINPULSE_SOURCES", "ch,de,fr,nl,be").split(",") if s in SOURCES]
ENABLED = [s for s in (os.environ.get("TRAINPULSE_SOURCES") or ",".join(SOURCES)).split(",") if s in SOURCES]
def country(source: str) -> str:
"""Land einer Quelle (Spanien und Österreich haben je zwei)."""
return SOURCES[source].get("country", source)
# OpenStreetMap: daraus werden das Schienennetz (für pfaedle) gefiltert
OSM_URLS = os.environ.get("TRAINPULSE_OSM_URLS", " ".join([
@@ -54,10 +105,16 @@ OSM_URLS = os.environ.get("TRAINPULSE_OSM_URLS", " ".join([
"https://download.geofabrik.de/europe/france-latest.osm.pbf",
"https://download.geofabrik.de/europe/netherlands-latest.osm.pbf",
"https://download.geofabrik.de/europe/belgium-latest.osm.pbf",
"https://download.geofabrik.de/europe/austria-latest.osm.pbf",
"https://download.geofabrik.de/europe/denmark-latest.osm.pbf",
"https://download.geofabrik.de/europe/spain-latest.osm.pbf",
"https://download.geofabrik.de/europe/norway-latest.osm.pbf",
"https://download.geofabrik.de/europe/poland-latest.osm.pbf",
"https://download.geofabrik.de/europe/sweden-latest.osm.pbf",
])).split()
PFAEDLE = os.environ.get("TRAINPULSE_PFAEDLE", "pfaedle")
OSMIUM = os.environ.get("TRAINPULSE_OSMIUM", "osmium")
PMTILES = os.environ.get("TRAINPULSE_PMTILES", "pmtiles")
TILES_BBOX = "-5.3,41.3,15.3,55.2" # CH, DE, FR, NL, BE mit etwas Rand
TILES_BBOX = "-9.6,35.8,31.3,71.3" # von Galicien bis Nordkap, Andalusien bis Finnmark
TILES_MAXZOOM = 14 # die Karte vergrössert Vektorkacheln darüber hinaus selbst; spart viel Platz
USER_AGENT = "trainpulse/0.1 (+https://scarriffle.com)"