Flixy heißt ab hier Halo

Reine Umbenennung, kein Verhalten geändert — bewusst als eigener Commit,
damit „umbenannt" und „umgebaut" im Nachhinein auseinanderzuhalten sind.

712 mal `Flixy`, 778 mal `flixy`, 7 mal `FLIXY` in 169 Dateien, dazu 25
Pfade. Ziele: `Halo`, `HaloTV`, `HaloTopShelf`, `HaloUITests`, `HaloKit` mit
`HaloDesign`, `HaloDownloads`, `HaloPlayback` und `HaloProbe`. `MediaKit`,
`JellyfinKit` und `DownloadWidget` tragen den Namen nicht und bleiben.

`docs/superpowers/specs/` ist ausgenommen. Datierte Entwurfsdokumente sind
ein Protokoll getroffener Entscheidungen; sie nachträglich umzuschreiben
hiesse, die Vergangenheit zu glätten.

**Die Bundle-ID wandert mit** — ausdrücklich so gewollt, mit bekanntem Preis:
`com.scarriffleservices.halo` ist für iOS eine *andere* App. Die installierte
Fassung bleibt daneben stehen, mit Downloads und Anmeldung in ihrem Container;
Halo startet leer. Einmal neu anmelden, heruntergeladene Folgen einmal neu
laden. Dasselbe gilt für die App-Gruppe, die sich TV-App und Top Shelf teilen.

**Eine Folge davon, die beim Entscheiden noch nicht auf dem Tisch lag:** der
Aufräumschritt aus dem vorigen Commit kommt an die alten Plex-Token nicht mehr
heran. Der Schlüsselbund grenzt nach Team und Bundle-Kennung ab — was unter
`…flixy` liegt, ist für `…halo` unerreichbar. Erledigt wird es trotzdem, nur
anders: **die alte App löschen.** iOS räumt deren Schlüsselbund-Einträge beim
Deinstallieren mit ab. Der Code bleibt stehen, weil er für jeden Stand vor
dieser Umbenennung richtig ist und im Jahr einen Startvergleich kostet.

Die Projektdatei ist aus `project.yml` neu erzeugt, der alte Ordner gelöscht
statt umbenannt — sie steht ohnehin nicht im Repo.

Das Verzeichnis des Repos selbst heißt weiter `Flixy`; das umzubenennen ist
ein Handgriff ausserhalb des Projekts.

368 Tests grün. iOS und tvOS bauen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-03 11:12:32 +02:00
co-authored by Claude Opus 5
parent 2fcf6821c8
commit 4b9a1e7b67
280 changed files with 1456 additions and 1456 deletions
+68 -68
View File
@@ -1,4 +1,4 @@
name: Flixy
name: Halo
options:
bundleIdPrefix: com.scarriffleservices
@@ -19,11 +19,11 @@ settings:
SWIFT_STRICT_CONCURRENCY: complete
packages:
FlixyKit:
path: Packages/FlixyKit
HaloKit:
path: Packages/HaloKit
targets:
Flixy:
Halo:
type: application
platform: iOS
# Ausdrücklich aufgeschrieben, statt Xcode raten zu lassen.
@@ -34,39 +34,39 @@ targets:
# auflösen. Hier steht es im Projekt und überlebt jedes Neuerzeugen.
scheme:
testTargets:
- FlixyUITests
- HaloUITests
sources:
# Das Icon ist ein Bündel, also technisch ein Ordner. Ohne diesen
# Ausschluss läuft XcodeGen hinein und trägt icon.json und play.svg
# einzeln ein — dann fehlt das Icon, ohne dass irgendwo ein Fehler
# auftaucht.
#
- path: Flixy
- path: Halo
excludes:
- "AppIcon.icon"
- path: Flixy/AppIcon.icon
- path: Halo/AppIcon.icon
type: file
dependencies:
- target: DownloadWidget
# Die neutrale Grundschicht. Ausdrücklich genannt, obwohl sie über
# JellyfinKit ohnehin im Baum hängt: die App soll sie direkt benutzen und
# nicht davon abhängen, dass ein bestimmter Server sie mitschleppt.
- package: FlixyKit
- package: HaloKit
product: MediaKit
# Der Server. Steht auf der neutralen Schicht, nicht darin — kommt ein
# zweiter dazu, steht er daneben.
- package: FlixyKit
- package: HaloKit
product: JellyfinKit
- package: FlixyKit
product: FlixyDesign
- package: FlixyKit
product: FlixyPlayback
- package: FlixyKit
product: FlixyDownloads
- package: HaloKit
product: HaloDesign
- package: HaloKit
product: HaloPlayback
- package: HaloKit
product: HaloDownloads
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flixy
PRODUCT_NAME: Flixy
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo
PRODUCT_NAME: Halo
# Verweist auf AppIcon.icon. Der frühere leere AppIcon.appiconset im
# Asset-Katalog ist entfernt — zwei Dinge namens AppIcon, und Xcode
# nimmt das falsche.
@@ -75,9 +75,9 @@ targets:
TARGETED_DEVICE_FAMILY: "1,2"
CODE_SIGN_STYLE: Automatic
info:
path: Flixy/Info.plist
path: Halo/Info.plist
properties:
CFBundleDisplayName: Flixy
CFBundleDisplayName: Halo
UILaunchScreen:
UIColorName: LaunchBackground
@@ -136,25 +136,25 @@ targets:
# Freigabe. Fehlt der Text, verweigert das System sie kommentarlos und
# die Serversuche findet dauerhaft nichts.
NSLocalNetworkUsageDescription: >-
Flixy benötigt Zugriff auf das lokale Netzwerk, um deinen
Halo benötigt Zugriff auf das lokale Netzwerk, um deinen
Jellyfin-Server zu erreichen und Medien direkt von ihm zu laden.
# Die Fassung für den Fernseher.
#
# **Eigene Ansichten, geteilte Modelle.** Die Quellenpfade sind die ganze
# Aussage dieses Blocks: `FlixyTV/` gehört nur hierher, `Flixy/Session/`
# Aussage dieses Blocks: `HaloTV/` gehört nur hierher, `Halo/Session/`
# gehört beiden. Keine Datei muss dafür umziehen — XcodeGen nimmt Pfade je
# Ziel, und die iOS-Fassung sieht von der ganzen Sache nichts.
FlixyTV:
HaloTV:
type: application
platform: tvOS
# Aus demselben Grund ausgeschrieben wie bei Flixy — siehe dort.
# Aus demselben Grund ausgeschrieben wie bei Halo — siehe dort.
scheme: {}
sources:
# Die eigenen Ansichten.
- path: FlixyTV
- path: HaloTV
# Die Modelle.
- path: Flixy/Session
- path: Halo/Session
excludes:
# Ein Fernseher dreht sich nicht.
- "OrientationLock.swift"
@@ -169,60 +169,60 @@ targets:
# aufruft. Beide sind reine Übersetzer ohne UIKit.
# Reines Modell trotz des Ordnernamens: LoadState, ErrorText und
# MediaRoute liegen zusammen in einer Datei.
- path: Flixy/Views/LoadState.swift
- path: Halo/Views/LoadState.swift
type: file
# Der Player. **Ohne PlayerView** — die zeichnet auf iOS das Bild und
# alle Bedienelemente selbst; auf dem Fernseher macht das Apples
# AVPlayerViewController. Das Modell darunter ist dasselbe.
- path: Flixy/Views/Player/PlayerModel.swift
- path: Halo/Views/Player/PlayerModel.swift
type: file
- path: Flixy/Views/Player/VideoSurface.swift
- path: Halo/Views/Player/VideoSurface.swift
type: file
- path: Flixy/Branding.swift
- path: Halo/Branding.swift
type: file
# Die Texte. Dieselben Schlüssel, dieselben Übersetzungen.
- path: Flixy/Resources/Localizable.xcstrings
- path: Halo/Resources/Localizable.xcstrings
type: file
dependencies:
- package: FlixyKit
- package: HaloKit
product: MediaKit
- package: FlixyKit
- package: HaloKit
product: JellyfinKit
- package: FlixyKit
product: FlixyDesign
- package: FlixyKit
product: FlixyPlayback
- package: HaloKit
product: HaloDesign
- package: HaloKit
product: HaloPlayback
# Nur damit `PlayerModel` den Typ nennen darf. Angelegt wird nie einer:
# FlixyTVApp reicht `nil` durch, und damit gibt es auf tvOS auch keinen
# HaloTVApp reicht `nil` durch, und damit gibt es auf tvOS auch keinen
# ModelContainer und kein SwiftData.
- package: FlixyKit
product: FlixyDownloads
- target: FlixyTopShelf
- package: HaloKit
product: HaloDownloads
- target: HaloTopShelf
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flixy.tv
PRODUCT_NAME: Flixy
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo.tv
PRODUCT_NAME: Halo
# Nur Apple TV.
TARGETED_DEVICE_FAMILY: "3"
# Kein AppIcon.icon: Icon Composer deckt iOS, macOS und watchOS ab,
# tvOS nicht. Der Name zeigt auf die Brand-Assets-Gruppe im Katalog,
# und der Katalog liegt unter FlixyTV/Resources.
# und der Katalog liegt unter HaloTV/Resources.
ASSETCATALOG_COMPILER_APPICON_NAME: "App Icon & Top Shelf Image"
CODE_SIGN_STYLE: Automatic
CODE_SIGN_ENTITLEMENTS: FlixyTV/Flixy.entitlements
CODE_SIGN_ENTITLEMENTS: HaloTV/Halo.entitlements
info:
path: FlixyTV/Info.plist
path: HaloTV/Info.plist
properties:
CFBundleDisplayName: Flixy
CFBundleDisplayName: Halo
UIUserInterfaceStyle: Dark
ITSAppUsesNonExemptEncryption: false
# Über dieses Schema schickt das Regal zurück in die App. Ohne den
# Eintrag kennt tvOS es nicht, und ein Druck auf ein Plakat tut
# nichts — ohne Fehler, ohne Hinweis.
CFBundleURLTypes:
- CFBundleURLName: com.scarriffleservices.flixy.topshelf
- CFBundleURLName: com.scarriffleservices.halo.topshelf
CFBundleURLSchemes:
- flixy
- halo
# Was hier **nicht** steht, und warum:
#
# UILaunchScreen — tvOS hat kein Startbild dieser Art.
@@ -234,7 +234,7 @@ targets:
NSAppTransportSecurity:
NSAllowsLocalNetworking: true
NSLocalNetworkUsageDescription: >-
Flixy benötigt Zugriff auf das lokale Netzwerk, um deinen
Halo benötigt Zugriff auf das lokale Netzwerk, um deinen
Jellyfin-Server zu erreichen.
# Das Regal über der App im tvOS-Menü.
@@ -243,25 +243,25 @@ targets:
# läuft — und mit weniger als einer Sekunde Zeit. Sie liest deshalb nur eine
# Datei aus der App-Gruppe, die die App beim Laden der Startseite ablegt:
# kein Netz, kein Schlüsselbund, kein Blättern.
FlixyTopShelf:
HaloTopShelf:
type: tv-app-extension
platform: tvOS
sources:
- path: FlixyTopShelf
- path: HaloTopShelf
dependencies:
- package: FlixyKit
- package: HaloKit
product: MediaKit
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flixy.tv.topshelf
PRODUCT_NAME: FlixyTopShelf
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo.tv.topshelf
PRODUCT_NAME: HaloTopShelf
CODE_SIGN_STYLE: Automatic
CODE_SIGN_ENTITLEMENTS: FlixyTopShelf/FlixyTopShelf.entitlements
CODE_SIGN_ENTITLEMENTS: HaloTopShelf/HaloTopShelf.entitlements
SKIP_INSTALL: YES
info:
path: FlixyTopShelf/Info.plist
path: HaloTopShelf/Info.plist
properties:
CFBundleDisplayName: Flixy
CFBundleDisplayName: Halo
# **Die Erweiterung hat ihre eigene Info.plist.**
#
# Und damit ihre eigene Transportsicherheit: die Ausnahme in der
@@ -278,17 +278,17 @@ targets:
# Nur zum Hinsehen: fährt die App mit der Attrappe in einen bestimmten
# Zustand und hält sie dort an, damit von außen fotografiert werden kann.
# Kein Teil der App, wird nie mitgeliefert.
FlixyUITests:
HaloUITests:
type: bundle.ui-testing
platform: iOS
sources:
- FlixyUITests
- HaloUITests
dependencies:
- target: Flixy
- target: Halo
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flixy.uitests
TEST_TARGET_NAME: Flixy
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo.uitests
TEST_TARGET_NAME: Halo
TARGETED_DEVICE_FAMILY: "1,2"
CODE_SIGN_STYLE: Automatic
GENERATE_INFOPLIST_FILE: YES
@@ -303,13 +303,13 @@ targets:
sources:
- path: DownloadWidget
dependencies:
- package: FlixyKit
product: FlixyDownloads
- package: FlixyKit
product: FlixyDesign
- package: HaloKit
product: HaloDownloads
- package: HaloKit
product: HaloDesign
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flixy.downloadwidget
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo.downloadwidget
PRODUCT_NAME: DownloadWidget
CODE_SIGN_STYLE: Automatic
SKIP_INSTALL: YES
@@ -320,6 +320,6 @@ targets:
info:
path: DownloadWidget/Info.plist
properties:
CFBundleDisplayName: Flixy Downloads
CFBundleDisplayName: Halo Downloads
NSExtension:
NSExtensionPointIdentifier: com.apple.widgetkit-extension