Fragen statt starten — die Probe überfuhr den Server

Beim letzten Lauf scheiterte auch die Anfrage, die vorher funktioniert
hatte. Kein neuer Befund, sondern mein Messfehler: die Probe warf sechs
Transcode-Sitzungen in Folge an, und danach lehnt Plex alles mit nackten
400ern ab — auch das, was vorher ging.

Jede Anfrage an `start.m3u8` startet einen Transcoder. Für eine
Parameterreihe ist das das falsche Werkzeug. Der **Entscheider** sagt,
was der Server täte, ohne etwas zu tun: Auflösung, Bitrate, und ob
umgerechnet oder umgepackt wird. Die Reihe läuft jetzt darüber.

Die zwei verbleibenden echten Sitzungen bekommen Abstand voneinander.

Der Wert wird aus der Antwort gesucht statt geparst — Plex antwortet je
nach Kopfzeile als XML oder JSON, und es geht um eine Anzeige, nicht um
Daten, mit denen weitergerechnet wird.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-27 18:15:05 +02:00
co-authored by Claude Opus 5
parent b861ca0599
commit d2237c29cd
2 changed files with 60 additions and 8 deletions
@@ -119,6 +119,27 @@ extension PlexServer {
)
}
/// Die Entscheidung im Wortlaut — **ohne** etwas zu starten.
///
/// Der Entscheider sagt, was der Server *täte*: welche Auflösung, welche
/// Bitrate, ob umgerechnet oder umgepackt wird. Das ist das richtige
/// Werkzeug, um Parameter auszuprobieren.
///
/// Der Weg über `start.m3u8` ist es **nicht**: jede Anfrage dort wirft
/// einen Transcoder an, und ein halbes Dutzend davon in Folge bringt den
/// Server dazu, alles Weitere mit nackten 400ern abzulehnen — auch das,
/// was vorher ging. Genau so ist eine Messung schon einmal gekippt.
public func decisionText(for request: TranscodeRequest) async -> String {
let daten = try? await client.send(
PlexRequest(
path: "/video/:/transcode/universal/decision",
query: request.queryItems + clientProfileItems
)
)
guard let daten else { return "nicht erreichbar" }
return String(decoding: daten.prefix(4_000), as: UTF8.self)
}
/// Hält den Transcoder an.
///
/// Muss beim Verlassen des Players laufen. Ohne dieses Signal rechnet der