Probe: die Gegenprobe war womöglich selbst falsch

Der Server sagt transcoderVideo=1 — er kann umrechnen. Damit ist auch
diese Ausrede weg, und es liegt an meiner Anfrage.

Zwei Stellen, an denen ich es mir zu leicht gemacht habe. Der Titel für
die Gegenprobe kam aus den Startseiten-Reihen, und dort stehen auch
Einträge von plex.tv, deren Kennung kein Schlüssel dieses Servers ist.
Mit so einem Eintrag prüft die Gegenprobe gar nichts — sie kommt jetzt
aus einer echten Mediathek, und vorher wird nachgesehen, ob der Eintrag
überhaupt existiert.

Und die Antwort der Live-Sitzung war bei 700 Zeichen abgeschnitten,
ausgerechnet dort, wo `Part` anfängt — an der einzigen Stelle, die zählt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-12 16:04:12 +02:00
co-authored by Claude Opus 5
parent ab3e1c975e
commit 008f6b7fd7
2 changed files with 20 additions and 4 deletions
@@ -88,8 +88,17 @@ if !requested.isEmpty {
// mitgeschleppt habe, und sie gehört als Erstes geprüft: läuft eine
// gewöhnliche Datei durch, liegt es an Live-TV. Läuft sie nicht durch, habe
// ich tagelang am falschen Ende gesucht.
if let hubs = try? await server.homeHubs(),
let movie = hubs.flatMap(\.items).first(where: { $0.kind == .movie }) {
// Aus einer echten Mediathek, nicht aus den Startseiten-Reihen: dort stehen
// auch Einträge von plex.tv, deren Kennung kein Schlüssel dieses Servers ist.
// Mit so einem Eintrag prüft die Gegenprobe nichts.
let libraries = (try? await server.libraries()) ?? []
let movieLibrary = libraries.first { $0.kind == .movie } ?? libraries.first
let firstMovie = await { () async -> PlexItem? in
guard let movieLibrary else { return nil }
return try? await server.items(inLibrary: movieLibrary, limit: 1).items.first
}()
if let movie = firstMovie {
let request = TranscodeRequest(
ratingKey: movie.ratingKey,
maximumBitrate: 4_000,
@@ -717,9 +717,11 @@ extension PlexServer {
// Und wie die Sitzung danach aussieht — dorthin zeigt der Pfad, den
// der Transcoder bekommt.
if let sessionKey = Self.firstSessionKey(in: data) {
// Großzügig: bisher war genau dort abgeschnitten, wo `Part`
// anfängt — also an der einzigen Stelle, die zählt.
probes.append(ChannelProbe(
path: sessionKey,
result: await rawResponse(forPath: sessionKey, limit: 700)
result: await rawResponse(forPath: sessionKey, limit: 2_500)
))
}
@@ -1504,6 +1506,12 @@ extension PlexServer {
public func transcoderBisect(ratingKey: String) async -> [String] {
let session = UUID().uuidString
let path = "/library/metadata/\(ratingKey)"
// Erst prüfen, ob es diesen Eintrag überhaupt gibt. Der Titel für die
// Gegenprobe kam aus den Startseiten-Reihen, und dort stehen auch
// Einträge von plex.tv, deren Kennung kein Mediathek-Schlüssel ist.
// Dann wäre die ganze Gegenprobe wertlos gewesen.
var lines = [" Eintrag \(ratingKey): \(await rawResponse(forPath: path, limit: 150))"]
let encoded = path.addingPercentEncoding(withAllowedCharacters: .plexParameterAllowed) ?? path
let variants: [(String, [URLQueryItem])] = [
@@ -1552,7 +1560,6 @@ extension PlexServer {
]),
]
var lines: [String] = []
for (name, items) in variants {
lines.append(" \(name): \(await probe(items: items, endpoint: "start.m3u8"))")
}