Zwei Fehler, die dieselbe Ursache haben: alles, was über VLC läuft, ging
an der Bildebene vorbei, an der die App gedreht hat.
**Das Bild sass nicht mittig.** Nicht ein paar Punkte daneben — gemessen
eine Anzeigefläche von 1200×480 Punkt in einer Zeichenfläche von 711×400,
unten rechts angeschlagen, im falschen Seitenverhältnis. Der Grund steht
im Vertrag von `VLCDrawable`: VLCKit fragt die Grösse **einmal** beim
Anlegen ab und überlässt seine Anzeigefläche danach der
Autoresizing-Maske. Eine Maske hält aber den Unterschied fest, nicht das
Verhältnis — was beim Anlegen zu gross war, bleibt für immer um denselben
Betrag zu gross. Und angelegt wird sie mitten in der Drehung ins
Querformat, während SwiftUI sie einblendet: also regelmässig falsch.
Die Zeichenfläche ist jetzt eine eigene Klasse, die ihrer Anzeigefläche
bei jedem Layout wieder die eigene Grösse gibt. Danach gemessen: 695,7 ×
400 Punkt, Rand links 130,0, rechts 130,3 — mittig.
**Der Knopf für einpassen/füllen tat nichts.** Er schrieb `videoGravity`
auf eine `AVPlayerLayer`, die bei VLC gar nicht im Baum hängt. Die
Einstellung geht deshalb jetzt durch die Engine: `setVideoFit` am
Protokoll, beim Systemplayer eine Voreinstellung, die nichts tut — dort
macht es die Bildebene —, bei VLC `videoFitMode`. `smaller` heisst bei
libvlc „fit inside", `larger` „fit outside".
Gemessen, im Querformat auf einem Pro Max, über VLC:
eingepasst 695,7 × 400 pt Rand l/r 130,0/130,3 o/u 20,0/20,0
füllend 935,3 × 440 pt Rand l/r 10,3/ 10,3 o/u 0,0/ 0,0
**Zurückgenommen:** im Kommentar an `videoFit` stand, ein `didSet` auf
einer `@Observable`-Klasse werde nicht gemeldet. Das stimmt nicht —
`HomeLayoutSettings` lebt davon. Ein Kommentar, der einen falschen
Mechanismus behauptet, schickt den nächsten in die falsche Richtung;
jetzt steht der belegte Grund dort.
Dazu, damit dieser Weg überhaupt prüfbar ist: die Attrappe meldet mit
`--vlc` DTS-Ton. AVFoundation kann das nicht, also fällt die App auf
VLCKit zurück. Die Beispieldatei bleibt dieselbe — geprüft wird der Weg,
nicht der Ton. Ohne diesen Schalter ist der VLC-Zweig im Simulator gar
nicht zu erreichen, und genau deshalb lagen beide Fehler so lange da.
Ebenfalls dabei: `EdgeInsets.symmetrical` mit fünf Tests und das Polster
im Player, das damit nicht mehr verschiebt statt einrückt.
iOS und tvOS bauen, 465 Tests grün.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1.7 KiB
Jellyfin-Attrappe
Ein Server, der so tut, als wäre er Jellyfin — gerade so viel, dass die App sich anmelden und stöbern kann. Gedacht fürs Ansehen der Oberfläche, nicht fürs Prüfen der Protokollschicht; dafür gibt es Tests mit aufgezeichneten Antworten.
python3 Tools/JellyfinStub/server.py
Dann in der App Mit Jellyfin anmelden → 127.0.0.1 eintragen. Quick
Connect bestätigt sich nach drei Abfragen von selbst, damit der Bildschirm mit
dem Code sichtbar wird und die Anmeldung trotzdem durchläuft.
Die Bilder sind einfarbige Flächen, deren Farbe aus der Kennung des Titels entsteht. Das ist Absicht: so lässt sich auf einen Blick erkennen, ob der Aufmacher tatsächlich weiterwandert und ob eine Kachel das Bild zeigt, das zu ihr gehört.
Abgespielt wird sample.mp4 — zehn Sekunden Farbverlauf, mit einem kleinen
Swift-Programm erzeugt. Der Server beantwortet Bereichsanfragen, weil der
Systemplayer eine Datei nie am Stück holt.
Was hereinkommt, steht unter http://127.0.0.1:8096/__reports: jede
Wiedergabemeldung mit ihrem Anfragekörper. Damit lässt sich prüfen, ob die App
den Beginn meldet, ob der Fortschritt in Ticks ankommt und ob am Ende
abgeräumt wird.
Mit --unanalysed melden die Quellen keine Spuren. Dann entscheidet die App
wie bei einem Server, der eine Datei noch nicht untersucht hat.
Mit --vlc melden sie DTS-Ton. AVFoundation kann das nicht, also läuft die
Wiedergabe über VLCKit — der einzige Weg, diesen Zweig mit der Beispieldatei
überhaupt zu erreichen. Die Datei bleibt dieselbe; VLC spielt sie ebenso, und
geprüft wird der Weg, nicht der Ton.
Kein echter Server wird dabei angefasst, und es gehen keine Zugangsdaten über die Leitung.