Live-TV: den Entscheider zur Sitzung fragen und die Antwort ansehen

Auch streng kodiert und auf das Nötigste zusammengestrichen bleibt es bei
400. Damit sind Kodierung und überzählige Angaben ausgeschlossen — und
mir gehen die Vermutungen aus, was richtig ist.

Also zwei Stellen, die noch etwas sagen können. Der Entscheider bekommt
dieselben Angaben wie der Transcoder, antwortet aber in Plex' eigenem
Format statt mit HTML; seine Antwort steht jetzt im Wortlaut im Bericht.

Und die Antwort auf das Belegen selbst. Die habe ich mehrfach durchsucht
und dabei übersehen, was sonst darin steht — Behälter, Teil-Kennungen,
vielleicht eine bereits laufende Transcode-Sitzung. Sie steht jetzt
vollständig da, statt nur das, wonach ich gesucht habe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-12 15:40:55 +02:00
co-authored by Claude Opus 5
parent 44dd794e86
commit af60b02691
@@ -690,7 +690,17 @@ extension PlexServer {
)]) )])
} }
var probes = [ChannelProbe(path: "POST \(path)", result: "Tuner belegt: \(part)")] // Die ganze Antwort, nicht nur das, wonach ich gesucht habe. Ich
// habe sie mehrfach durchsucht und dabei übersehen, was sonst noch
// darin steht — Behälter, Teil-Kennungen, vielleicht eine fertige
// Transcode-Sitzung.
var probes = [
ChannelProbe(path: "POST \(path)", result: "Tuner belegt: \(part)"),
ChannelProbe(
path: "Antwort auf das Belegen",
result: redacted(String(decoding: data.prefix(900), as: UTF8.self))
),
]
// Der Weg des Plex-Clients: die **Sitzung**, die der Server gerade // Der Weg des Plex-Clients: die **Sitzung**, die der Server gerade
// angelegt hat, wird umgerechnet — nicht die Abspielliste darin und // angelegt hat, wird umgerechnet — nicht die Abspielliste darin und
@@ -713,6 +723,24 @@ extension PlexServer {
probes.append(outcome.probe) probes.append(outcome.probe)
if let url = outcome.url { return (url, subscription, probes) } if let url = outcome.url { return (url, subscription, probes) }
} }
// Dieselben Angaben an den Entscheider. Der Transcoder antwortet
// mit HTML und schweigt sich aus; der Entscheider antwortet in
// Plex' eigenem Format und nennt den Grund.
let request = TranscodeRequest(
ratingKey: channel.id,
maximumBitrate: maximumBitrate,
isLocal: connection.local,
sessionIdentifier: session,
pathOverride: sessionKey
)
if let url = transcodeURL(for: request),
let items = URLComponents(url: url, resolvingAgainstBaseURL: false)?.percentEncodedQueryItems {
probes.append(ChannelProbe(
path: "Entscheider zur Sitzung",
result: await rawDecision(percentEncodedItems: items)
))
}
} }
// Und die Abspielliste unmittelbar. Sie antwortete mit 404 statt 400: // Und die Abspielliste unmittelbar. Sie antwortete mit 404 statt 400:
@@ -743,6 +771,33 @@ extension PlexServer {
return (outcome.url, subscription, probes) return (outcome.url, subscription, probes)
} }
/// Die Antwort des Entscheiders im Wortlaut.
private func rawDecision(percentEncodedItems items: [URLQueryItem]) async -> String {
guard let baseURL = connection.url,
var components = URLComponents(
url: baseURL.appending(path: "/video/:/transcode/universal/decision"),
resolvingAgainstBaseURL: false
)
else { return "Adresse nicht baubar" }
components.percentEncodedQueryItems = items
guard let url = components.url else { return "Adresse nicht baubar" }
var request = URLRequest(url: url)
request.timeoutInterval = 20
for (field, value) in identity.headers { request.setValue(value, forHTTPHeaderField: field) }
request.setValue(token, forHTTPHeaderField: "X-Plex-Token")
do {
let (data, response) = try await transport.data(for: request)
let status = (response as? HTTPURLResponse)?.statusCode ?? 0
let body = String(decoding: data.prefix(700), as: UTF8.self)
.trimmingCharacters(in: .whitespacesAndNewlines)
return "HTTP \(status): \(redacted(body))"
} catch {
return Self.shortDescription(of: error)
}
}
/// Der Schlüssel der Live-Sitzung, die der Server angelegt hat. /// Der Schlüssel der Live-Sitzung, die der Server angelegt hat.
/// ///
/// `/livetv/sessions/1268be73-…` — die Sitzung des **Servers**, nicht die /// `/livetv/sessions/1268be73-…` — die Sitzung des **Servers**, nicht die