diff --git a/api/app.py b/api/app.py index 271e647..3021642 100644 --- a/api/app.py +++ b/api/app.py @@ -211,16 +211,25 @@ def parse_entry(entry): ), } +def parse_valid_entries(feed_entries): + # Die Quelle liefert für neueste Zeitpunkte teils Platzhalter ohne Messwerte. + entries = [parse_entry(entry) for entry in feed_entries] + return [ + e for e in entries + if e["water_level_cm"] is not None or e["flow_m3s"] is not None + ] + def _get_latest_for_station(station_id: str): cache_hit = _latest_cache.get(station_id) if cache_hit and _is_cache_fresh(cache_hit.get("fetched_at"), LATEST_CACHE_TTL_SECONDS): return cache_hit.get("latest") feed = feedparser.parse(BASE.format(station_id)) - if not feed.entries: + entries = parse_valid_entries(feed.entries) + if not entries: raise ValueError("Keine Daten gefunden") - latest = parse_entry(feed.entries[0]) + latest = entries[0] _latest_cache[station_id] = { "latest": latest, "fetched_at": _now_utc(), @@ -298,15 +307,17 @@ def list_pegel(limit: int | None = None): summary="Messwerte eines Pegels abrufen", description=( "Liefert alle im RSS-Feed verfügbaren Einträge einer Station. " - "`latest` ist der neueste Eintrag und entspricht `entries[0]`; " + "Einträge ohne Wasserstand und ohne Durchfluss (Platzhalter der Quelle " + "für noch nicht verfügbare Messwerte) werden herausgefiltert. " + "`latest` ist der neueste verbleibende Eintrag und entspricht `entries[0]`; " "die Reihenfolge von `entries` folgt dem Feed (neueste zuerst). " - "Pegel-IDs bestehen aus mindestens sechs Ziffern. Nicht vorhandene " + "Pegel-IDs bestehen aus mindestens sechs Ziffern. Einzelne fehlende " "Messwerte werden als `null` ausgegeben." ), response_description="Stationsmetadaten, neuester Messwert und Feed-Historie.", responses={ 400: {"description": "Die Pegel-ID besteht nicht aus mindestens sechs Ziffern."}, - 404: {"description": "Für diese Pegel-ID enthält der RSS-Feed keine Einträge."}, + 404: {"description": "Für diese Pegel-ID enthält der RSS-Feed keine Einträge mit Messwerten."}, }, ) def get_pegel(pegel_id: str): @@ -316,10 +327,10 @@ def get_pegel(pegel_id: str): url = BASE.format(pegel_id) feed = feedparser.parse(url) - if not feed.entries: - raise HTTPException(404, "Keine Daten gefunden") + entries = parse_valid_entries(feed.entries) - entries = [parse_entry(entry) for entry in feed.entries] + if not entries: + raise HTTPException(404, "Keine Daten gefunden") feed_obj = getattr(feed, "feed", None) feed_title = feed_obj.get("title") if isinstance(feed_obj, dict) else None