Phase 6: Live-TV, plus Live Activity für Downloads

Live-TV
- An keinem echten Server geprüft: die DVR- und EPG-Endpunkte sind der am
  schlechtesten dokumentierte Teil der Plex-API. Die Modelle sind deshalb
  durchgehend nachsichtig — fehlende Felder ergeben leere Listen, nicht
  Fehler, und die Senderkennung wird als Zahl, Zeichenkette oder uuid
  akzeptiert.
- Ohne eingerichteten Empfänger erklärt die App das, statt einen Fehler
  zu zeigen. Das ist der häufigste Fall.
- Senderliste mit laufender Sendung, Fortschrittsbalken und „danach".
  Der Programmführer wird getrennt geholt: fällt er aus, bleibt das
  Umschalten möglich.
- Die Anbieterkennung wird aus /media/providers gelesen statt fest
  verdrahtet — sie wechselt je nach Server.

Live Activity
- Eigene Widget-Erweiterung; iOS zeichnet den Sperrbildschirm in einem
  getrennten Prozess, während die App meist gar nicht läuft.
- Der Presenter drosselt auf 1,5 Sekunden. ActivityKit verwirft zu
  häufige Aktualisierungen kommentarlos, und der Fortschritt kommt
  mehrmals je Sekunde — ungebremst bliebe die Anzeige stehen.
- @preconcurrency import: Activity und ActivityContent tragen keine
  Sendable-Zusage.

Zwei Stolpersteine unterwegs: canImport(ActivityKit) ist auf macOS wahr,
die Typen darin aber nicht verfügbar — es muss os(iOS) sein. Und eine
von Hand geschriebene Info.plist ohne CFBundleIdentifier führt zu einer
Erweiterung ganz ohne Kennung; der Fehler lautet dann „not prefixed with
the parent app's bundle identifier" und zeigt auf die falsche Stelle.

126 Tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-09-11 17:54:17 +02:00
co-authored by Claude Opus 5
parent b7fc18823a
commit 5c0c1d651d
14 changed files with 924 additions and 7 deletions
+97
View File
@@ -3010,6 +3010,103 @@
}
}
}
},
"liveTV.notConfigured.title": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Kein Empfänger eingerichtet"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "No tuner set up"
}
}
}
},
"liveTV.notConfigured.description": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Live-TV braucht eine Fernsehkarte oder einen Netzwerk-Tuner am Plex-Server. Richte ihn in den Servereinstellungen ein, dann erscheinen die Sender hier."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Live TV needs a tuner card or network tuner on your Plex server. Set one up in the server settings and channels will appear here."
}
}
}
},
"liveTV.noChannels.title": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Keine Sender"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "No channels"
}
}
}
},
"liveTV.noChannels.description": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Der Empfänger ist eingerichtet, liefert aber keine Sender."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "The tuner is set up but isn't providing any channels."
}
}
}
},
"liveTV.noProgram": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Kein Programm verfügbar"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "No guide data"
}
}
}
},
"liveTV.next %@ %@": {
"comment": "Platzhalter: Uhrzeit, Sendungstitel",
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Danach %@ · %@"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Next %@ · %@"
}
}
}
}
},
"version": "1.1"