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:
co-authored by
Claude Opus 5
parent
1803dd670f
commit
62a913f2cd
@@ -239,6 +239,39 @@ struct LiveTVGuideTests {
|
||||
#expect(keys.contains("5"))
|
||||
}
|
||||
|
||||
@Test("Die nachgeschlagene Sendung liefert die abspielbare Adresse")
|
||||
func usesPartFromLookup() async throws {
|
||||
// Das Raster nennt keine Teil-Adresse, die Einzelabfrage schon. Sie
|
||||
// blind an den Transcoder zu geben, ergab dreimal eine nackte 400:
|
||||
// eine Sendung beim Cloud-Programmführer hat keine Datei.
|
||||
let metadata = """
|
||||
{"MediaContainer":{"size":1,"Metadata":[
|
||||
{"ratingKey":"epg-1","key":"/tv.plex.providers.epg.cloud:2/metadata/x","type":"movie",
|
||||
"title":"Tagesschau",
|
||||
"Media":[{"id":1,"Part":[{"id":1,"key":"/livetv/sessions/xyz/stream"}]}]}
|
||||
]}}
|
||||
"""
|
||||
let server = server(routes: [
|
||||
"/metadata/plex%3A%2F%2Fmovie%2Fabc": metadata,
|
||||
"/start.m3u8": "#EXTM3U",
|
||||
])
|
||||
let channel = PlexChannel(id: "5", title: "SRF 1 HD", key: "5")
|
||||
let program = PlexProgram(
|
||||
id: "p1",
|
||||
title: "Tagesschau",
|
||||
startsAt: .now,
|
||||
endsAt: .now.addingTimeInterval(1800),
|
||||
metadataKey: "/tv.plex.providers.epg.cloud:2/metadata/plex%3A%2F%2Fmovie%2Fabc"
|
||||
)
|
||||
|
||||
let result = await server.tune(channel: channel, program: program, maximumBitrate: nil)
|
||||
let url = try #require(result.url)
|
||||
let path = try #require(URLComponents(url: url, resolvingAgainstBaseURL: false)?
|
||||
.queryItems?.first { $0.name == "path" }?.value)
|
||||
|
||||
#expect(path == "/livetv/sessions/xyz/stream")
|
||||
}
|
||||
|
||||
@Test("Die Sender des Tuners stehen unter DeviceChannel")
|
||||
func readsDeviceChannelKey() async throws {
|
||||
// Der Server lieferte 278 Sender, die Hülle verwarf sie: sie kannte
|
||||
|
||||
Reference in New Issue
Block a user