Live-TV-Sender gefunden, Film-Schriftzüge ergänzt
Senderliste
Plex liefert die Sender verschachtelt in der Antwort auf /livetv/dvrs
mit — jeder Empfänger bringt seine eigenen unter `Device` → `Channel`.
Mein getrennter Endpunkt /livetv/dvrs/{id}/channels war eine Vermutung
und lieferte nichts. Bei einem Server mit über dreißig eingerichteten
Sendern stand deshalb „Keine Sender".
Die verschachtelte Liste hat jetzt Vorrang, der Endpunkt bleibt als
Rückfalllinie. `ChannelMapping` wird als ältere Schreibweise ebenfalls
gelesen, und der Empfänger-Schlüssel kommt je nach Serverfassung als
Zahl oder als Zeichenkette.
Bleibt die Liste leer, sagt die Ansicht jetzt welcher Weg was ergeben
hat. In einem Bereich ohne offizielle Beschreibung ist das die Angabe,
mit der sich der nächste Fehler finden lässt.
Schriftzüge
Plex liefert bei vielen Filmen ein `clearLogo` — den Schriftzug in
seiner eigenen Type, freigestellt. Der tritt jetzt im Aufmacher an die
Stelle des gesetzten Titels.
Dabei ein Fallstrick: /photo/:/transcode liefert JPEG, und JPEG kennt
keine Transparenz. Über den Bild-Transcoder geladen wäre aus dem
freigestellten Logo ein schwarzer Kasten geworden. Es wird deshalb
unverändert geladen. Fehlt der Schriftzug oder scheitert das Laden,
bleibt es beim Titel.
161 Tests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -69,6 +69,8 @@ public struct PlexItem: Sendable, Equatable, Decodable, Identifiable {
|
||||
/// Die Besetzung, mit Porträt und Rollennamen.
|
||||
public let roles: [PlexTag]
|
||||
public let markers: [PlexMarker]
|
||||
/// Plakat, Hintergrund und — wenn vorhanden — der Schriftzug des Films.
|
||||
public let images: [PlexImage]
|
||||
|
||||
private enum CodingKeys: String, CodingKey {
|
||||
case ratingKey, key, guid, type, title, titleSort, summary, year, duration
|
||||
@@ -84,6 +86,7 @@ public struct PlexItem: Sendable, Equatable, Decodable, Identifiable {
|
||||
case writers = "Writer"
|
||||
case roles = "Role"
|
||||
case markers = "Marker"
|
||||
case images = "Image"
|
||||
}
|
||||
|
||||
/// Von Hand geschrieben statt erzeugt, weil der erzeugte Decoder einen
|
||||
@@ -134,6 +137,7 @@ public struct PlexItem: Sendable, Equatable, Decodable, Identifiable {
|
||||
self.writers = try values.decodeIfPresent([PlexTag].self, forKey: .writers) ?? []
|
||||
self.roles = try values.decodeIfPresent([PlexTag].self, forKey: .roles) ?? []
|
||||
self.markers = try values.decodeIfPresent([PlexMarker].self, forKey: .markers) ?? []
|
||||
self.images = try values.decodeIfPresent([PlexImage].self, forKey: .images) ?? []
|
||||
}
|
||||
|
||||
/// `ratingKey` ist serverweit eindeutig und eignet sich deshalb direkt
|
||||
@@ -162,6 +166,15 @@ public struct PlexItem: Sendable, Equatable, Decodable, Identifiable {
|
||||
|
||||
/// Ob die Detailseite eine Versionsauswahl anbieten muss.
|
||||
public var hasMultipleVersions: Bool { media.count > 1 }
|
||||
|
||||
/// Der Schriftzug des Titels, falls der Server einen hat.
|
||||
///
|
||||
/// Nicht jeder Film hat einen — dann bleibt es beim gesetzten Titel. Bei
|
||||
/// Folgen liefert Plex in der Regel den Schriftzug der Serie mit, weil
|
||||
/// eine einzelne Folge keinen eigenen hat.
|
||||
public var clearLogoPath: String? {
|
||||
images.first(where: \.isClearLogo)?.url
|
||||
}
|
||||
}
|
||||
|
||||
/// Die Hülle, in die Plex jede Antwort packt.
|
||||
|
||||
Reference in New Issue
Block a user