diff --git a/Packages/FlixyKit/Sources/PlexKit/Endpoints/PlexServer+LiveTV.swift b/Packages/FlixyKit/Sources/PlexKit/Endpoints/PlexServer+LiveTV.swift index 3adbd43..7152490 100644 --- a/Packages/FlixyKit/Sources/PlexKit/Endpoints/PlexServer+LiveTV.swift +++ b/Packages/FlixyKit/Sources/PlexKit/Endpoints/PlexServer+LiveTV.swift @@ -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(