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(