AppIcon.icon liegt jetzt im App-Target und wird über ASSETCATALOG_COMPILER_APPICON_NAME verwendet. Der frühere leere AppIcon.appiconset im Asset-Katalog ist raus — zwei Dinge namens AppIcon, und Xcode nimmt das falsche. Das Bündel ist technisch ein Ordner. Ohne den Ausschluss in den Quellen läuft XcodeGen hinein und trägt icon.json und play.svg einzeln ein; das Icon fehlt dann, ohne dass irgendwo ein Fehler auftaucht. Deshalb der Ausschluss plus ein ausdrücklicher Eintrag mit type: file. Geprüft am fertigen Bundle: AppIcon60x60@2x.png und die iPad-Variante werden erzeugt, CFBundleIconName steht in der Info.plist, und auf dem Homescreen ist es zu sehen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
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.
| 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.
xcodegen generate
open Flixy.xcodeproj
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:
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
- Komprimierte Downloads. Sie laufen über den Universal-Transcoder mit
protocol=httpstatt über die umständliche Sync-API. Offen: ob Plex eineContent-Lengthmitschickt (ohne sie gibt es keinen Fortschrittsbalken und kein Fortsetzen) und ob die Datei durchsuchbar ist. Original bleibt solange Voreinstellung. SiehetranscodedDownloadURLinPlexServer+Playback.swift. - 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.
- App-Größe. Die iOS-Slice von VLCKit ist unstripped 239 MB. Was davon im fertigen Archiv übrig bleibt, ist noch nicht gemessen.
- 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)