Live-TV: die Kennung der Sendung muss zweimal kodiert werden

Der Bericht nennt zwei Zeilen, die alles erklären:

    Media.protocol = livetv
    ratingKey = plex%3A%2F%2Fepisode%2F6a9a1255715fa1c9375df709

Plex führt die Kennung selbst schon kodiert — auch im JSON, wo es dafür
keinen Grund gäbe. Als Abfragewert geschickt dekodiert der Server sie
einmal, bevor er sie als Pfad liest, und bekommt `plex://episode/…`. Das
ist kein gültiger Schlüssel, und die Antwort darauf war die nackte
„400 Bad Request"-Seite.

Für eine Datei in der Mediathek ist das kein Thema: `/library/metadata/123`
enthält nichts zu kodieren. Deshalb ist beides nötig, und welche Form
gilt, hängt daran, woher die Adresse stammt.

Ich habe in diesem Punkt inzwischen jede Variante einmal für die richtige
gehalten — entpackt, einfach, doppelt. Ein Test hält jetzt alle drei
Formen fest, damit die Frage nicht ein viertes Mal aufkommt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-12 14:58:47 +02:00
co-authored by Claude Opus 5
parent 162247e8dc
commit 024f396641
3 changed files with 67 additions and 14 deletions
@@ -170,6 +170,29 @@ struct LiveTVGuideTests {
#expect(!text.contains("plex://"))
}
@Test("Für eine Sendung wird die Kennung zweimal kodiert")
func doubleEncodesForLive() async throws {
// Der Server dekodiert den Abfragewert einmal, bevor er ihn als Pfad
// liest. Genau einmal kodiert kommt bei ihm `plex://episode/…` an —
// kein gültiger Schlüssel, und die Antwort ist eine nackte 400.
let server = server(routes: [:])
let request = TranscodeRequest(
ratingKey: "5",
isLocal: true,
pathOverride: "/tv.plex.providers.epg.cloud:2/metadata/plex%3A%2F%2Fepisode%2Fabc"
)
let once = try #require(await server.transcodeURL(for: request)).absoluteString
let twice = try #require(
await server.transcodeURL(for: request, keepPathEncoding: false)
).absoluteString
#expect(once.contains("plex%3A%2F%2Fepisode%2Fabc"))
#expect(twice.contains("plex%253A%252F%252Fepisode%252Fabc"))
// Und niemals im Klartext: daran verschluckt sich der Server.
#expect(!twice.contains("plex://"))
}
@Test("Nur was tatsächlich mit 200 antwortet, geht an den Player")
func rejectsStreamsTheServerRefuses() async throws {
// Vorher galt schon eine gebaute Adresse als Erfolg. Der Fehler