Live-TV: die Sendung nachschlagen, statt ihre Adresse blind weiterzureichen

Die gebaute Adresse ist sauber — nachgerechnet und ausgedruckt. Also
lehnt Plex selbst ab, und zwar mit Recht: eine Sendung beim
Cloud-Programmführer hat keine Datei, die sich umrechnen ließe. Die
nackte 400 war die Antwort auf eine unsinnige Bitte.

Deshalb wird die Sendung jetzt zuerst nachgeschlagen. Das Raster nennt
keine abspielbare Adresse; die Einzelabfrage beim Anbieter nennt
womöglich eine. Was dabei zurückkam, steht in jedem Fall in der Spur —
auch wenn nichts Abspielbares dabei war.

Dafür musste die Anfrage einen bereits kodierten Pfad durchreichen
können: `appending(path:)` kodiert das Prozent ein zweites Mal, und aus
`plex%3A%2F%2F` wird `plex%253A%252F%252F`.

Und der angebotene Endpunkt-Zettel des Programmanbieters ist eindeutig:
content, metadata, grid, timeline — nichts zum Einschalten. Der Empfänger
muss es also tun, und den kannte `tune` bisher gar nicht. Seine Adressen
stehen jetzt mit im Suchraum.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-12 14:39:35 +02:00
co-authored by Claude Opus 5
parent 1803dd670f
commit 62a913f2cd
4 changed files with 153 additions and 10 deletions
@@ -31,18 +31,23 @@ public struct PlexRequest: Sendable, Equatable {
/// summiert es sich über mehrere Adressen.
public var timeout: Duration
/// Ob `path` bereits kodiert ist und unverändert übernommen werden soll.
public let isPathEncoded: Bool
public init(
method: Method = .get,
path: String,
query: [URLQueryItem] = [],
additionalHeaders: [String: String] = [:],
timeout: Duration = .seconds(20)
timeout: Duration = .seconds(20),
isPathEncoded: Bool = false
) {
self.method = method
self.path = path
self.query = query
self.additionalHeaders = additionalHeaders
self.timeout = timeout
self.isPathEncoded = isPathEncoded
}
/// Setzt die Anfrage gegen einen Host zusammen.
@@ -52,11 +57,17 @@ public struct PlexRequest: Sendable, Equatable {
token: String?
) throws(PlexError) -> URLRequest {
guard var components = URLComponents(
url: baseURL.appending(path: path),
url: baseURL.appending(path: isPathEncoded ? "/" : path),
resolvingAgainstBaseURL: false
) else {
throw .transport(description: "Ungültige Basisadresse: \(baseURL)")
}
// Adressen beim Programmanbieter enthalten bereits kodierte Zeichen
// (`plex%3A%2F%2Fmovie%2F…`). `appending(path:)` kodiert das Prozent
// ein zweites Mal, und der Server findet nichts mehr.
if isPathEncoded {
components.percentEncodedPath = path
}
components.queryItems = query.isEmpty ? nil : query
guard let url = components.url else {