Files
Flaro/README.md
T
GuidoandClaude Opus 5 d9ae4b8a1f README: Xcode vor dem Generieren beenden
Ein geöffnetes Xcode liest die neu erzeugte project.pbxproj nicht nach
und überschreibt sie beim nächsten Sichern. Neue Dateien fehlen dann im
Build, ohne dass irgendwo ein Fehler auftaucht — das hat mehrere Runden
gekostet, in denen Korrekturen gar nicht auf dem Gerät ankamen.

Gehört an die Stelle, an der die Einrichtung beschrieben wird, nicht in
eine Erinnerung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 21:00:39 +02:00

113 lines
4.5 KiB
Markdown

# Flixy
> Ein nativer Plex-Client für iPhone und iPad — dunkel, mit ausfahrbarer
> Seitenleiste und Offline-Downloads.
Der Name ist ein Platzhalter. Siehe [`Flixy/Branding.swift`](Flixy/Branding.swift).
## Stand
Phase 0 (Fundament) steht. Die App startet, die Navigation ist begehbar, die
Inhalte folgen in Phase 1.
Der Fahrplan steht in
[`docs/superpowers/specs/2026-09-11-flixy-design.md`](docs/superpowers/specs/2026-09-11-flixy-design.md).
| 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 |
„Ungeprüft" heißt: die Logik ist von Tests abgedeckt, die Oberfläche wurde aber
noch nie mit einem echten Bestand gesehen.
## Aufbau
Die Xcode-Projektdatei wird aus `project.yml` erzeugt und ist **nicht**
eingecheckt — das erspart Konflikte in der `pbxproj`.
```bash
xcodegen generate
open Flixy.xcodeproj
```
> **Wichtig: Xcode vorher beenden.**
>
> `xcodegen generate` schreibt `project.pbxproj` neu. Ein geöffnetes Xcode
> liest das nicht nach — es hält seinen eigenen Stand im Speicher und
> überschreibt die frisch erzeugte Datei beim nächsten Sichern wieder. Neue
> Dateien fehlen dann im Build, ohne dass irgendwo ein Fehler auftaucht.
>
> Das ist der Preis dafür, die Projektdatei aus Git herauszuhalten. Immer wenn
> Dateien dazukommen oder `project.yml` sich ändert: Xcode mit ⌘Q beenden,
> `xcodegen generate`, neu öffnen.
>
> Ob der Build aktuell ist, steht in der App unter **Einstellungen →
> Diagnose** als Build-Datum.
Der Code liegt zum größten Teil in lokalen Packages unter `Packages/FlixyKit`.
Das App-Target enthält nur Oberfläche und Navigation.
| Modul | Aufgabe | Hängt ab von |
|---|---|---|
| `PlexKit` | Anmeldung, Endpunkte, Modelle. Kein SwiftUI. | — |
| `FlixyDesign` | Farben, Typografie, wiederkehrende Bausteine. | — |
| `FlixyPlayback` | Wiedergabe-Abstraktion und die Entscheidung DirectPlay/Transcode. | `PlexKit` |
| `FlixyDownloads` | Warteschlange, Hintergrundübertragung, Offline-Bestand. | `PlexKit` |
### Warum zwei Player
iOS spielt weder Matroska-Dateien noch DTS- oder TrueHD-Ton — und genau das
liegt in typischen Plex-Beständen. `PlaybackDecider` prüft deshalb pro Datei,
ob AVPlayer sie nativ öffnen kann (dann gibt es Bild-in-Bild und AirPlay
gratis), und schickt sie sonst an VLCKit.
Ab Phase 2 kommt der dritte Weg dazu: Server-Transcoding. Dafür ist genau eine
Funktion zu erweitern — `PlaybackDecider.decide(media:part:policy:)`. Die
Oberfläche bleibt unberührt.
## Tests
Die Logik-Tests laufen ohne Simulator, deshalb in Sekunden:
```bash
cd Packages/FlixyKit && swift test
```
Die wichtigste Testdatei ist `PlaybackDeciderTests` — sie hält fest, welche
Datei auf welchem Weg landet, und schlägt an, sobald jemand
`DeviceCapabilities` anfasst.
Die Antwort-Vorlagen unter `Tests/PlexKitTests/Fixtures` sind von Hand
geschrieben und gehören durch echte Mitschnitte ersetzt, sobald ein Server
erreichbar ist — siehe das README dort.
Die Oberfläche wird von Hand im Simulator geprüft.
## Was noch am echten Server zu prüfen ist
1. **Komprimierte Downloads.** Sie laufen über den Universal-Transcoder mit
`protocol=http` statt über die umständliche Sync-API. Offen: ob Plex eine
`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.
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
allem Pausieren und Fortsetzen — ist nur gegen Testdaten geprüft.
## Voraussetzungen
- Xcode 26 oder neuer
- iOS 26.0 auf dem Zielgerät
- XcodeGen (`brew install xcodegen`)