Live-TV: das Programm kam nie an, und die Einschalt-Adresse wurde weggeworfen
Drei Fehler, alle im eigenen Code. Die Sendezeiten stehen beim Programmanbieter im Medien-Block, nicht am Eintrag darüber. Ich habe sie oben gesucht, nicht gefunden und jede Sendung verworfen — übrig blieb „Kein Programm verfügbar" auf jedem Sender, und ohne Sendungen fiel auch die Senderliste auf die Tunerliste zurück. Die Senderspalte im Raster fehlte ganz. Die Zeitachse ist mehrere tausend Punkte breit, und der HStack hat den Nachbarn dafür auf null gedrückt. Jetzt hat die Spalte Vorrang, und die Achse liegt als Auflage über einer durchsichtigen Fläche — eine Auflage zählt bei der Größenrechnung nicht mit. Der Abstand der Achsenbeschriftung gehört in die Spaltenbreite hinein statt daneben, sonst steht die ganze Achse acht Punkte neben dem Programm darunter. Und das Einschalten: die Adresse wurde berechnet und verworfen, dann bekam der Player eine Senderkennung, zu der er einen Film in der Mediathek suchte. Den gibt es nicht. Jetzt reicht die Anfrage die fertige Adresse durch, der Player spielt sie ohne Umweg, und meldet weder Fortschritt noch sucht er Metadaten. Scheitert es doch, steht ab jetzt eine Meldung da statt gar nichts. Geprüft wurde das Raster diesmal mit den Augen: ein Gerüst im Simulator zeichnet es mit erfundenen Sendern. Dafür bekommt es die Bildadresse als Abschluss übergeben, statt sie aus der Sitzung zu lesen. Dazu: Downloads zeigen jetzt an, wenn sie auf WLAN warten. Die Hintergrund-Sitzung wartet in dem Fall von sich aus — kein Fehler, nur Stillstand, und das sah bisher aus wie ein hängender Download. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2362865ba9
commit
bbe47b83be
@@ -50,6 +50,8 @@ final class PlayerModel {
|
||||
/// Ob aus dem Download-Ordner gespielt wird. Dann gibt es keinen
|
||||
/// Fortschritt zu melden und keine nächste Folge nachzuschlagen.
|
||||
private(set) var isOffline = false
|
||||
/// Ob ein laufender Sender abgespielt wird.
|
||||
private(set) var isLive = false
|
||||
/// Die im Player gewählte Stufe. `automatic` folgt den Einstellungen.
|
||||
private(set) var quality: PlayerQuality = .automatic
|
||||
/// Ob gerade auf eine andere Stufe umgestellt wird.
|
||||
@@ -110,6 +112,11 @@ final class PlayerModel {
|
||||
return
|
||||
}
|
||||
|
||||
if let stream = request.streamURL {
|
||||
await startLiveStream(url: stream)
|
||||
return
|
||||
}
|
||||
|
||||
guard let server else {
|
||||
phase = .failed(message: String(localized: "error.serverUnreachable"))
|
||||
return
|
||||
@@ -202,6 +209,23 @@ final class PlayerModel {
|
||||
/// Ohne Server und ohne Transcoding: die Datei liegt so vor, wie sie auf
|
||||
/// dem Server lag. Welcher Motor sie öffnen kann, steht im Abzug, der beim
|
||||
/// Herunterladen mitgesichert wurde — offline lässt sich nichts nachfragen.
|
||||
/// Live-TV: die Adresse steht schon fest.
|
||||
///
|
||||
/// Ohne Metadatenabruf, weil es nichts abzurufen gibt — ein laufender
|
||||
/// Sender steht in keiner Mediathek. Und ohne Fortschrittsmeldung: es
|
||||
/// gibt keine Stelle, an der man ihn später fortsetzen könnte.
|
||||
private func startLiveStream(url: URL) async {
|
||||
diagnostics.note("Live-Strom öffnen")
|
||||
isLive = true
|
||||
title = request.title
|
||||
|
||||
// Live kommt immer umgerechnet: der Tuner liefert einen
|
||||
// Transportstrom, den kein iPhone direkt abspielt.
|
||||
let decision = PlaybackDecision(method: .transcode(maximumBitrate: nil), rationale: [])
|
||||
self.decision = decision
|
||||
await load(PlaybackSource(url: url, origin: .remote), decision: decision)
|
||||
}
|
||||
|
||||
private func startLocal(url: URL) async {
|
||||
let offline = downloads.offlineMedia(forRatingKey: request.ratingKey)
|
||||
|
||||
@@ -258,7 +282,8 @@ final class PlayerModel {
|
||||
engine.play()
|
||||
phase = .playing
|
||||
diagnostics.note("Motor gestartet")
|
||||
if !isOffline { startReporting() }
|
||||
// Weder offline noch live gibt es einen Fortschritt zu melden.
|
||||
if !isOffline, !isLive { startReporting() }
|
||||
} catch {
|
||||
diagnostics.finish(outcome: "Öffnen fehlgeschlagen: \(error)")
|
||||
phase = .failed(message: String(localized: "player.loadFailed"))
|
||||
|
||||
Reference in New Issue
Block a user