Probe: den Server nach seinen eigenen Fähigkeiten fragen

Der Befund wird deutlicher: ping und stop antworten mit 404, start.m3u8
und decision mit 400. Die einen Routen gibt es nicht, die anderen lehnen
ab. Und die Mediathek antwortet normal — an der Verbindung liegt es
nicht.

In jeder Antwort der Wurzel stehen Felder, deren Werte ich nie angesehen
habe: transcoderVideo, transcoderActiveVideoSessions,
transcoderVideoBitrates. Steht dort `transcoderVideo: false`, kann dieser
Server kein Video umrechnen — und dann suche ich seit Tagen nach einer
Fähigkeit, die es auf diesem Gerät nicht gibt.

Das ist dieselbe Art Annahme wie „der Transcoder tut es schon": etwas
Vorausgesetztes, das nie jemand nachgesehen hat. Nachsehen kostet eine
Zeile.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-12 16:01:25 +02:00
co-authored by Claude Opus 5
parent 2a19db2757
commit ab3e1c975e
@@ -1569,11 +1569,33 @@ extension PlexServer {
// Und zur Gegenkontrolle etwas, von dem wir wissen, dass es geht:
// die Bilder kommen über denselben `/:/`-Aufbau.
lines.append(" Bild-Transcoder: \(await rawResponse(forPath: "/photo/:/transcode", limit: 120))")
lines.append(" Mediathek: \(await rawResponse(forPath: "/library/sections", limit: 120))")
lines.append(" Mediathek: \(await rawResponse(forPath: "/library/sections", limit: 90))")
lines.append(" Server sagt über sich: \(await capabilities())")
return lines
}
/// Was der Server über seine eigenen Fähigkeiten sagt.
///
/// Die Felder stehen in jeder Antwort der Wurzel, und ihre Werte habe ich
/// nie angesehen. Steht dort `transcoderVideo: false`, kann dieser Server
/// kein Video umrechnen — und dann war die ganze Suche der letzten Tage
/// die Suche nach einer Fähigkeit, die es nicht gibt.
public func capabilities() async -> String {
guard let data = try? await client.send(PlexRequest(path: "/", timeout: .seconds(15))),
let root = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
let container = root["MediaContainer"] as? [String: Any]
else { return "keine Antwort" }
let interesting = [
"transcoderVideo", "transcoderAudio", "transcoderSubtitles",
"transcoderActiveVideoSessions", "transcoderVideoBitrates",
"offlineTranscode", "allowSync", "version", "platform",
]
return interesting
.compactMap { key in container[key].map { "\(key)=\($0)" } }
.joined(separator: ", ")
}
private func probe(items: [URLQueryItem], endpoint: String) async -> String {
guard let baseURL = connection.url,
var components = URLComponents(