Ein frischer JSONDecoder, drei Zeilen neben der Warnung davor

Im Web stand am Abspann „Nächste Folge", in der App nur „Abspann
überspringen". Der Server war es nicht: beide fragen denselben Endpunkt,
und der ordnet nach Staffel und dann nach Nummer — er findet also auch
die erste Folge der nächsten Staffel.

Es war `nachbar`. Die Stelle baute sich einen frischen `JSONDecoder()`,
und der kennt das Datumsformat des Servers nicht. Solange die
Nachbarfolge weder `publishAt` noch `lastPlayedAt` mitbrachte, ging es
gut — mit eingeschalteter Prüfung bringt sie ein `publishAt`. Das `try?`
schluckte den Fehler, und von aussen sah es aus, als gäbe es keine
nächste Folge: kein Knopf, kein Hinweis, nichts.

In `FlaroClient` steht seit je ein eingerichteter Dekoder, ausdrücklich
nicht privat, „damit die Prüfungen denselben Dekoder benutzen" — und
direkt darunter die Warnung, dass ein frischer an genau diesem Format
scheitert. Diese eine Stelle las sie nicht.

Vier Prüfungen dazu, darunter die mit Datumsangaben: mit dem alten
Dekoder ist sie rot, mit dem neuen grün. Gegengeprüft, nicht behauptet.

Die übrigen frischen Dekoder im Quelltext lesen nur, was dieselbe App
vorher selbst geschrieben hat — Zwischenspeicher, Abzüge, Offline-
Angaben. Die laufen rund und bleiben.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-14 08:39:31 +02:00
co-authored by Claude Opus 5
parent ce4da992ea
commit 93f4dfd8e9
2 changed files with 108 additions and 1 deletions
@@ -254,7 +254,14 @@ public actor FlaroBackend: MediaBackend {
guard item.kind == .episode else { return nil }
let daten = try await client.send(FlaroRequest(path: "/api/v1/episodes/\(item.id)/\(weg)"))
guard !daten.isEmpty else { return nil }
guard let folge = try? JSONDecoder().decode(Wire.Episode.self, from: daten) else { return nil }
// **Der eingerichtete Dekoder, nicht ein frischer.** Ein frischer
// kennt das Datumsformat des Servers nicht; sobald die Nachbarfolge
// ein `publishAt` oder ein `lastPlayedAt` mitbringt — und mit
// eingeschalteter Prüfung bringt sie es —, scheiterte das Lesen.
// Das `try?` schluckte den Fehler, und von aussen sah es aus, als
// gäbe es keine nächste Folge: der Knopf blieb weg.
guard let folge = try? FlaroClient.decoder.decode(
Wire.Episode.self, from: daten) else { return nil }
return folge.neutral()
}