Live-TV: erst den Tuner belegen, dann umrechnen lassen

Der übersprungene Schritt. Ich habe die Sendung direkt an den Transcoder
gegeben — ohne dass jemand den Tuner belegt hätte. Der Server fing an,
merkte, dass er nichts zu senden hat, und brach ab: „die Wiedergabe wurde
unterbrochen", ohne weitere Angabe.

Jetzt zwei Schritte. Erst eine Live-Sitzung eröffnen, dann die Adresse
dieser Sitzung umrechnen lassen — nicht die des Senders und nicht die der
Sendung. mediaIndex und partIndex sind dabei -1: ein laufender Sender hat
keine Fassungen zur Auswahl.

Unter welchem Schlüssel sich die Sitzung eröffnen lässt, unterscheidet
sich je nach Anbieter, deshalb werden die in Frage kommenden der Reihe
nach probiert — der Raster-Schlüssel zuerst, weil er den Sender genauso
bezeichnet wie die Liste, aus der er stammt.

Dazu zwei Stellen, an denen Gründe bisher verschwanden:

Vor dem Abspielen wird der Server gefragt, ob er den Strom überhaupt
zulässt. Er antwortet im Klartext; der Player meldet nur, dass es nicht
ging.

Und wenn der Motor scheitert, steht sein Grund ab jetzt auf dem
Bildschirm statt nur im Protokoll. „Die Wiedergabe wurde unterbrochen"
allein sagt weder, ob der Server ablehnt, noch ob der Motor das Format
nicht mag — und genau diese Unterscheidung hat diese Runde gekostet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-12 13:51:05 +02:00
co-authored by Claude Opus 5
parent bbe47b83be
commit 861ca805a5
6 changed files with 2788 additions and 2629 deletions
@@ -189,6 +189,8 @@ struct PlexGridMedia: Decodable {
let channelVcn: String?
/// Die laufende Nummer des Senders am Server.
let channelID: String?
/// Der Schlüssel des Senders im Raster — ein Kandidat fürs Einschalten.
let gridKey: String?
/// Anfang und Ende der Sendung.
///
/// Sie stehen hier und **nicht** am Eintrag darüber. Genau daran ist das
@@ -200,7 +202,7 @@ struct PlexGridMedia: Decodable {
private enum CodingKeys: String, CodingKey {
case channelIdentifier, channelTitle, channelCallSign, channelThumb, channelVcn, channelID
case beginsAt, endsAt
case gridKey, beginsAt, endsAt
case part = "Part"
}
@@ -225,6 +227,7 @@ struct PlexGridMedia: Decodable {
} else {
self.channelID = nil
}
self.gridKey = try? values.decodeIfPresent(String.self, forKey: .gridKey)
self.beginsAt = try? values.decodeIfPresent(Int.self, forKey: .beginsAt)
self.endsAt = try? values.decodeIfPresent(Int.self, forKey: .endsAt)
self.parts = try values.decodeIfPresent([PlexGridPart].self, forKey: .part) ?? []
@@ -242,7 +245,8 @@ struct PlexGridMedia: Decodable {
title: Self.withoutLeadingNumber(name, number: channelVcn),
channelIdentifier: channelVcn,
thumb: channelThumb,
key: parts.first?.key ?? channelID
key: parts.first?.key ?? channelID,
gridKey: gridKey
)
}
@@ -272,6 +276,8 @@ public struct PlexChannel: Sendable, Equatable, Decodable, Identifiable {
public let thumb: String?
/// Der Schlüssel, über den sich der Sender einschalten lässt.
public let key: String?
/// Der Schlüssel des Senders im Programmraster.
public let gridKey: String?
public let id: String
/// Ob dieser Sender einen Namen trägt.
@@ -284,7 +290,7 @@ public struct PlexChannel: Sendable, Equatable, Decodable, Identifiable {
static let placeholder = "—"
private enum CodingKeys: String, CodingKey {
case channelIdentifier, title, thumb, key
case channelIdentifier, title, thumb, key, gridKey
case identifier = "id"
case uuid, name, callSign, vcn, number, channelTitle, channelCallSign
}
@@ -306,7 +312,8 @@ public struct PlexChannel: Sendable, Equatable, Decodable, Identifiable {
self.channelIdentifier = number
?? keyValue.flatMap { $0.allSatisfy { character in character.isNumber || character == "." } ? $0 : nil }
self.thumb = try values.decodeIfPresent(String.self, forKey: .thumb)
self.key = try values.decodeIfPresent(String.self, forKey: .key)
self.key = Self.text(in: values, forKeys: [.key])
self.gridKey = try? values.decodeIfPresent(String.self, forKey: .gridKey)
// Plex liefert die Kennung mal als Zahl, mal als Zeichenkette, mal als
// `uuid`. Ein einzelner erwarteter Typ hätte hier bei manchen
@@ -358,12 +365,20 @@ public struct PlexChannel: Sendable, Equatable, Decodable, Identifiable {
return nil
}
public init(id: String, title: String, channelIdentifier: String? = nil, thumb: String? = nil, key: String? = nil) {
public init(
id: String,
title: String,
channelIdentifier: String? = nil,
thumb: String? = nil,
key: String? = nil,
gridKey: String? = nil
) {
self.id = id
self.title = title
self.channelIdentifier = channelIdentifier
self.thumb = thumb
self.key = key
self.gridKey = gridKey
}
}