Die Oberfläche weiß nicht mehr, dass es Plex gibt

Keine Datei unter Views/LiveTV importiert noch PlexKit. Sender, Programm
und Einschalten laufen über den neutralen Vertrag, und supportsLiveTV
fragt endlich die Fähigkeit ab statt "server != nil" — womit die Zusage
in JellyfinBackend.capabilities zum ersten Mal stimmt.

Der Player holt die laufende Sendung jetzt für genau einen Sender nach.
Vorher ging dafür das Raster über alle Sender hinaus, weil der Plex-Weg
keinen schmaleren kannte; im neutralen Vertrag ist die Senderliste ein
Parameter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-14 06:20:30 +02:00
co-authored by Claude Opus 5
parent 24765a5afc
commit eebe9280cb
8 changed files with 3930 additions and 3897 deletions
+15 -13
View File
@@ -122,8 +122,10 @@ final class PlayerModel {
/// Programmführer und Tuner sind das Einzige, was hier noch unmittelbar
/// mit Plex spricht. Ein Tuner ist ein Stück Hardware, und die fünfhundert
/// Zeilen, die es gekostet hat, ihn zu bändigen, gehören in keinen
/// gemeinsamen Vertrag. Bei Jellyfin ist er `nil`.
private let liveTV: PlexServer?
/// gemeinsamen Vertrag — wohl aber in einen **eigenen**. Seit es den
/// gibt, steht hier kein Plex-Server mehr, sondern wer auch immer
/// Live-TV kann.
private let liveTV: (any LiveTVBackend)?
private let downloads: DownloadCoordinator
private let diagnostics: PlaybackDiagnostics
private let policy: PlaybackPolicy
@@ -173,7 +175,7 @@ final class PlayerModel {
init(
request: PlaybackRequest,
backend: (any MediaBackend)?,
liveTV: PlexServer?,
liveTV: (any LiveTVBackend)?,
downloads: DownloadCoordinator,
diagnostics: PlaybackDiagnostics,
policy: PlaybackPolicy,
@@ -498,27 +500,27 @@ final class PlayerModel {
/// wirklich abgelaufen ist — das Raster über alle Sender zu holen ist
/// nichts, was man bei jedem Antippen tun will.
func refreshLiveProgrammeIfNeeded() async {
guard isLive, let server = liveTV else { return }
guard isLive, let liveTV else { return }
if let programmeEndsAt, programmeEndsAt > .now { return }
guard let provider = await server.electronicProgramGuideIdentifier() else { return }
let now = Date()
let entries = (try? await server.guide(
providerIdentifier: provider,
// Nur dieser eine Sender. Vorher ging hier das Raster über **alle**
// Sender hinaus, weil der Plex-Weg keinen schmaleren kannte — beim
// neutralen Vertrag ist die Senderliste ein Parameter.
let programs = (try? await liveTV.livePrograms(
channelIDs: [request.ratingKey],
from: now,
to: now.addingTimeInterval(2 * 3_600)
)) ?? []
)) ?? [:]
guard let match = entries.first(where: {
$0.channel?.id == request.ratingKey && $0.program.isRunning()
}) else {
guard let match = programs[request.ratingKey]?.first(where: { $0.isRunning() }) else {
// Lieber gar nichts als etwas Falsches.
subtitle = nil
return
}
subtitle = match.program.title
programmeEndsAt = match.program.endsAt
subtitle = match.title
programmeEndsAt = match.endsAt
}
func togglePlayPause() {