diff --git a/README.md b/README.md index 7965200..ce3c157 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ Der Name ist ein Platzhalter. Siehe [`Flixy/Branding.swift`](Flixy/Branding.swif ## Stand -Phase 0 (Fundament) steht. Die App startet, die Navigation ist begehbar, die -Inhalte folgen in Phase 1. +Alle sechs Phasen sind gebaut. Anmeldung, Blättern und Wiedergabe laufen am +echten Server; der Rest ist unterschiedlich weit geprüft. Der Fahrplan steht in [`docs/superpowers/specs/2026-09-11-flixy-design.md`](docs/superpowers/specs/2026-09-11-flixy-design.md). @@ -16,15 +16,29 @@ Der Fahrplan steht in | Phase | Inhalt | Stand | |---|---|---| | 0 | Projektgerüst, Design-Tokens, Navigation | ✅ | -| 1 | Anmeldung, Bibliothek, DirectPlay | ✅ Anmeldung am Server geprüft, der Rest nicht | -| 2 | Transcoding, adaptive Bitrate, Spuren, Sync | ✅ gebaut, ungeprüft | -| 3 | Download-Engine und Offline-Wiedergabe | ✅ gebaut, ungeprüft | -| 4 | Download-Intelligenz | ✅ gebaut; komprimierte Downloads ungeprüft | -| 5 | Feinschliff und Personalisierung | ✅ gebaut, ungeprüft | -| 6 | Live-TV mit EPG | ✅ gebaut, an keinem DVR geprüft | +| 1 | Anmeldung, Bibliothek, DirectPlay | ✅ am Server geprüft, iPhone und iPad | +| 2 | Transcoding, adaptive Bitrate, Spuren, Sync | ✅ Wiedergabe geprüft; Transcoding selbst noch nicht erzwungen | +| 3 | Download-Engine und Offline-Wiedergabe | ⚠️ Downloads starten, Offline-Wiedergabe noch nicht bestätigt | +| 4 | Download-Intelligenz | ⚠️ komprimierte Downloads ungeprüft | +| 5 | Feinschliff und Personalisierung | ✅ gebaut, teilweise geprüft | +| 6 | Live-TV mit EPG | ⚠️ Empfänger werden gefunden, Sender noch nicht bestätigt | -„Ungeprüft" heißt: die Logik ist von Tests abgedeckt, die Oberfläche wurde aber -noch nie mit einem echten Bestand gesehen. +„Ungeprüft" heißt: die Logik ist von Tests abgedeckt, an einem echten Bestand +aber noch nicht gesehen. + +### Was der Praxistest gelehrt hat + +Drei Fehler, die kein Test gefunden hätte, weil sie in Annahmen über fremde +Bibliotheken steckten — sie stehen als Warnung im jeweiligen Quelltext: + +- **VLCKit ruft seinen Delegaten vom eigenen Thread**, nicht über die + Hauptwarteschlange. `MainActor.assumeIsolated` brach die App beim Drücken + auf Play hart ab. +- **`app.plex.tv/auth` verknüpft den Code nicht**, wenn man im Browser schon + bei Plex angemeldet ist — es springt auf watch.plex.tv weiter. `plex.tv/link` + tut es zuverlässig. +- **`URLSessionDownloadTask` gilt auch bei 404 als erfolgreich** und legt die + Fehlerseite als Datei ab. ## Aufbau @@ -96,10 +110,13 @@ Die Oberfläche wird von Hand im Simulator geprüft. `Content-Length` mitschickt (ohne sie gibt es keinen Fortschrittsbalken und kein Fortsetzen) und ob die Datei durchsuchbar ist. Original bleibt solange Voreinstellung. Siehe `transcodedDownloadURL` in `PlexServer+Playback.swift`. -2. **Live-TV.** Der am schlechtesten dokumentierte Teil der Plex-API — es gibt - keine offizielle Beschreibung. Die Modelle sind durchgehend nachsichtig - gebaut, und ohne eingerichteten Empfänger erklärt die App das, statt einen - Fehler zu zeigen. + Ein Fehlschlag erscheint immerhin als solcher — die Plausibilitätsprüfung in + `DownloadCoordinator.implausibility` verwirft Fehlerseiten und abgebrochene + Übertragungen, statt sie als fertig zu verbuchen. +2. **Live-TV: die Senderliste.** Dass die Empfänger unter `Dvr` gefunden + werden, ist geprüft. Ob `/livetv/dvrs/{id}/channels` die Sender liefert, + nicht. Die Ansicht unterscheidet beide Fälle: „Kein Empfänger eingerichtet" + gegen „Keine Sender" — daran ist ablesbar, wo es hakt. 3. **App-Größe.** Die iOS-Slice von VLCKit ist unstripped 239 MB. Was davon im fertigen Archiv übrig bleibt, ist noch nicht gemessen. 4. **Große Dateien im Hintergrund.** Das Verhalten mit einem 40-GB-Remux — vor