From d87828992978ca0ce445d8b6def79f1000f238a9 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sun, 27 Sep 2026 15:43:55 +0200 Subject: [PATCH] =?UTF-8?q?Der=20Server=20sagt=20jetzt=20selbst,=20ob=20er?= =?UTF-8?q?=20uns=20f=C3=BCr=20lokal=20h=C3=A4lt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Probe endete bisher mit einem Konjunktiv: „Kam dieser Aufruf von zuhause, ist Punkt 1 die Erklärung." Das ist eine Vermutung an genau der Stelle, an der die ganze Messung hängt. `GET /System/Endpoint` beantwortet `IsInNetwork` mit **demselben** Aufruf, mit dem auch die ABR-Sperre entscheidet: `_networkManager.IsInLocalNetwork(HttpContext.GetNormalizedRemoteIP())`. Damit steht als Erstes im Bericht, ob eine Leiter überhaupt möglich wäre — und ob das Folgende eine Aussage über unterwegs enthält oder keine. Co-Authored-By: Claude Opus 5 --- .../FlixyKit/Sources/FlixyProbe/Leiter.swift | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Packages/FlixyKit/Sources/FlixyProbe/Leiter.swift b/Packages/FlixyKit/Sources/FlixyProbe/Leiter.swift index 487710c..b3aeaff 100644 --- a/Packages/FlixyKit/Sources/FlixyProbe/Leiter.swift +++ b/Packages/FlixyKit/Sources/FlixyProbe/Leiter.swift @@ -16,6 +16,19 @@ import MediaKit // im Schlüsselbund; gedruckt werden Stufen und Zahlen, nie eine vollständige // Adresse. +/// Wie der Server die Herkunft dieser Anfrage einordnet. +/// +/// `isInNetwork` ist genau die Größe, an der Jellyfins ABR-Sperre hängt. +struct Endpunktlage: Decodable { + let isLocal: Bool + let isInNetwork: Bool + + private enum CodingKeys: String, CodingKey { + case isLocal = "IsLocal" + case isInNetwork = "IsInNetwork" + } +} + /// Was in einer Playlist steht. struct Leiter { var stufen: [(bandbreite: Int, auflösung: String?)] = [] @@ -149,6 +162,30 @@ func jellyfinLeiter(host: String) async { let backend = JellyfinBackend(client: client, account: konto, serverName: "Probe") + // **Die Frage, die alles andere erklärt, direkt an den Server.** + // + // `/System/Endpoint` beantwortet `IsInNetwork` mit demselben Aufruf, + // mit dem auch die ABR-Sperre entscheidet: + // `_networkManager.IsInLocalNetwork(HttpContext.GetNormalizedRemoteIP())`. + // Damit muss niemand mehr raten, ob „von zuhause" der Grund ist. + let lage = try? await client.send( + JellyfinRequest(path: "/System/Endpoint"), + as: Endpunktlage.self + ) + if let lage { + if lage.isInNetwork { + print("Der Server hält diese Verbindung für LOKAL.") + print(" → Eine Leiter wird er hier grundsätzlich nicht liefern,") + print(" ganz gleich was wir anfragen. Das Folgende sagt damit") + print(" nichts darüber, was von unterwegs käme.") + } else { + print("Der Server hält diese Verbindung für AUSSERHALB.") + print(" → Hier ist eine Leiter möglich. Kommt trotzdem nur eine") + print(" Stufe, liegt es an etwas anderem.") + } + print("") + } + // Irgendeinen Film. Es geht um die Form der Antwort, nicht um den Inhalt. guard let mediathek = (try? await backend.libraries())?.first(where: { $0.kind == .movie }), let kachel = try? await backend.items(