Live-TV: die Abspielliste ist fertig — sie gehört abgerufen, nicht umgerechnet
Das Belegen des Tuners klappt, und heraus kommt:
/livetv/sessions/1b5bb998…/DBACCA6D…/index.m3u8?offset=-1.000000
Eine fertige HLS-Abspielliste. Ich habe sie an den Transcoder gegeben —
also darum gebeten, etwas umzurechnen, das schon fertig ist. Daher die
nackte 400. Sie wird jetzt unmittelbar abgerufen, mit Token und
Gerätekennung in der Adresse, weil der Systemplayer keine Kopfzeilen
mitschickt. Die eigene Abfrage der Sitzung bleibt dabei erhalten.
Dazu das Gegenstück, ebenfalls aus dem Quelltext des Plex-Clients:
`DELETE /media/subscriptions/{id}` gibt den Tuner wieder frei. Er ist ein
Stück Hardware — vier Stück gibt es, und ein nicht freigegebener fehlt
beim nächsten Einschalten. Das passiert jetzt beim Schließen des Players
und auch dann, wenn das Belegen zwar klappt, aber nichts Abspielbares
dabei herauskommt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
562fd758d5
commit
a9563be1e1
@@ -306,22 +306,32 @@ struct LiveTVGuideTests {
|
||||
{"MediaContainer":{"size":1,"MediaSubscription":[{"key":"77",
|
||||
"MetadataItem":{"ratingKey":"live-77","key":"/livetv/sessions/abc","type":"clip",
|
||||
"title":"blue ZOOM HD",
|
||||
"Media":[{"id":9,"Part":[{"id":9,"key":"/livetv/sessions/abc/parts/9"}]}]}}]}}
|
||||
"Media":[{"id":9,"Part":[{"id":9,
|
||||
"key":"/livetv/sessions/abc/SITZUNG/index.m3u8?offset=-1.000000"}]}]}}]}}
|
||||
"""
|
||||
let server = server(routes: [
|
||||
"/channels/6228f7f2-5fc705fa/tune": tuned,
|
||||
"/start.m3u8": "#EXTM3U",
|
||||
"/index.m3u8": "#EXTM3U",
|
||||
])
|
||||
let channel = PlexChannel(id: "6228f7f2-5fc705fa", title: "blue ZOOM HD", key: "1")
|
||||
let dvr = PlexDVR(key: "2")
|
||||
|
||||
let result = await server.tune(channel: channel, dvr: dvr, 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/abc/parts/9")
|
||||
// Unmittelbar abgerufen, nicht umgerechnet: was beim Belegen
|
||||
// herauskommt, ist bereits eine fertige HLS-Abspielliste.
|
||||
#expect(url.path() == "/livetv/sessions/abc/SITZUNG/index.m3u8")
|
||||
#expect(!url.absoluteString.contains("/transcode/"))
|
||||
// Die eigene Abfrage der Sitzung darf nicht verlorengehen.
|
||||
let items = try #require(URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems)
|
||||
#expect(items.contains { $0.name == "offset" && $0.value == "-1.000000" })
|
||||
// Und der Systemplayer schickt keine Kopfzeilen mit.
|
||||
#expect(items.contains { $0.name == "X-Plex-Token" })
|
||||
#expect(items.contains { $0.name == "X-Plex-Client-Identifier" })
|
||||
#expect(result.trace.contains { $0.path.hasPrefix("POST ") })
|
||||
// Womit der Tuner hinterher wieder freigegeben wird.
|
||||
#expect(result.subscriptionKey == "77")
|
||||
}
|
||||
|
||||
@Test("Die Teil-Adresse wird gefunden, egal wie tief sie liegt")
|
||||
|
||||
Reference in New Issue
Block a user