Live-TV: die Sender waren da, zwei eigene Fehler haben sie verschluckt
Der Abzug vom Server zeigt beides schwarz auf weiß. Erstens: /media/grabbers/devices/1/channels antwortet mit 278 Sendern — unter dem Sammelnamen `DeviceChannel`. Die Hülle kannte nur `Channel` und hat die vollständige Liste als leer verworfen. Zweitens: das Programmraster antwortet, aber nicht auf `type=1`. Die 1 steht bei Plex für Film, und im Programm laufen auch Folgen, Sport und Nachrichten — der Filter hat das Raster geleert. Ohne ihn kommen die Sendungen samt Sendername, Nummer, Logo und Kennung. Das Raster hat jetzt Vorrang vor der Tunerliste, auch wenn beide antworten: nur dort gehören Sender und Programm zusammen, es enthält ohnehin nur die eingeschalteten Sender, und die Tunerliste führt alle 278. Einschalten läuft über die Adresse der laufenden Sendung beim Programmanbieter — Plex behandelt eine laufende Sendung wie einen Film. Die Adresse wird einmal entpackt, bevor sie in die Anfrage geht: sonst kodiert URLComponents ein zweites Mal, und aus %3A wird %253A. Die Tests stehen jetzt auf den echten Antworten aus dem Abzug, nicht auf erfundenen: DeviceChannel mit `name` und `key`, Rastereinträge mit channelVcn, channelID und einer Folge neben einem Film. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
7e36f37506
commit
2362865ba9
@@ -25,6 +25,12 @@ public struct TranscodeRequest: Sendable, Equatable {
|
||||
/// Welche Untertitelspur eingebrannt werden soll.
|
||||
public let subtitleStreamID: Int?
|
||||
public let audioStreamID: Int?
|
||||
/// Eine andere Adresse als die der Mediathek.
|
||||
///
|
||||
/// Live-TV liegt nicht unter `/library/metadata`, sondern beim
|
||||
/// Programmanbieter. Der Transcoder nimmt beides — aber nur, wenn man
|
||||
/// ihm die richtige Adresse nennt.
|
||||
public let pathOverride: String?
|
||||
|
||||
public init(
|
||||
ratingKey: String,
|
||||
@@ -35,7 +41,8 @@ public struct TranscodeRequest: Sendable, Equatable {
|
||||
isLocal: Bool,
|
||||
sessionIdentifier: String = UUID().uuidString,
|
||||
subtitleStreamID: Int? = nil,
|
||||
audioStreamID: Int? = nil
|
||||
audioStreamID: Int? = nil,
|
||||
pathOverride: String? = nil
|
||||
) {
|
||||
self.ratingKey = ratingKey
|
||||
self.mediaIndex = mediaIndex
|
||||
@@ -46,11 +53,19 @@ public struct TranscodeRequest: Sendable, Equatable {
|
||||
self.sessionIdentifier = sessionIdentifier
|
||||
self.subtitleStreamID = subtitleStreamID
|
||||
self.audioStreamID = audioStreamID
|
||||
self.pathOverride = pathOverride
|
||||
}
|
||||
|
||||
var queryItems: [URLQueryItem] {
|
||||
var items = [
|
||||
URLQueryItem(name: "path", value: "/library/metadata/\(ratingKey)"),
|
||||
// Einmal entpackt, weil die Adresse beim Programmanbieter schon
|
||||
// kodiert ankommt und `URLComponents` sonst ein zweites Mal
|
||||
// kodiert — aus %3A wird %253A, und der Server findet nichts.
|
||||
URLQueryItem(
|
||||
name: "path",
|
||||
value: pathOverride.map { $0.removingPercentEncoding ?? $0 }
|
||||
?? "/library/metadata/\(ratingKey)"
|
||||
),
|
||||
URLQueryItem(name: "mediaIndex", value: String(mediaIndex)),
|
||||
URLQueryItem(name: "partIndex", value: String(partIndex)),
|
||||
URLQueryItem(name: "protocol", value: "hls"),
|
||||
|
||||
Reference in New Issue
Block a user