CI / pruefen (pull_request) Canceled after 0s
Passkeys und die Jellyfin-Anbindung als groessere Bausteine, dazu vier Nacharbeiten aus dem Betrieb. Changelog, Release-Notiz, DEVLOG und die bebilderte Anleitung nachgezogen. Die Anleitung hat zwei neue Abschnitte samt Screenshots: „Anmelden per Passkey" und ein Bild im Jellyfin-Abschnitt. Beide Aufnahmen brauchen Gegenstellen — einen Authenticator und einen Medienserver. Damit `npm run screenshots` reproduzierbar bleibt, stellt das Skript sie jetzt selbst bereit: der virtuelle Authenticator kommt ueber CDP vom Browser, der Jellyfin-Nachbau sind ein paar Zeilen HTTP im Skript. Beide Spuren raeumt es nach der Aufnahme ueber die Oberflaeche wieder weg. Der Merkposten zum Entwicklungsmodus in CLAUDE.md war zu absolut: dass unter Playwright nichts hydratisiert, stimmt nicht durchgehend — im Screenshot-Lauf gegen denselben Dev-Server funktionierten die Klicks. Der Eintrag beschreibt jetzt das Beobachtete statt einer Regel, die nicht traegt, und nennt die Pruefung, mit der sich der Zustand feststellen laesst. Dazu neu: APP_URL muss zum aufgerufenen Port passen, sonst scheitern Passkeys am Ursprungsabgleich. Alle Screenshots neu aufgenommen — die Einstellungsseite hatte sich durch die neuen Abschnitte ohnehin geaendert.
114 lines
5.5 KiB
Markdown
114 lines
5.5 KiB
Markdown
# Flimmer 0.8.0
|
|
|
|
Zwei größere Bausteine: **Anmeldung per Passkey** und die **Jellyfin-Anbindung**.
|
|
Dazu vier Nacharbeiten aus dem laufenden Betrieb.
|
|
|
|
> ⚠️ **Beim Aktualisieren kommen zwei Migrationen mit** (`passkeys`,
|
|
> `medienserver`). Der Container spielt sie beim Start selbst ein; `./update.sh`
|
|
> legt vorher eine Sicherung an.
|
|
|
|
### Hinzugefügt
|
|
|
|
- **Anmeldung per Passkey (WebAuthn).** Windows Hello, Face ID, Touch ID oder
|
|
ein Sicherheitsschlüssel — statt Passwort. Anlegen und verwalten unter
|
|
*Einstellungen → Passkeys*, anmelden über „Mit Passkey anmelden" **ohne
|
|
vorherige E-Mail-Eingabe**.
|
|
|
|
Ein Passkey ist der dritte Weg in denselben Trichter: am Ende steht dieselbe
|
|
Sitzung wie bei Passwort und OIDC. Das Passwort bleibt daneben bestehen, und
|
|
den letzten verbleibenden Anmeldeweg lässt Flimmer nicht entfernen.
|
|
|
|
Drei Dinge, die beim Selbsthosten zählen:
|
|
- **HTTPS ist Pflicht** (Ausnahme: `localhost`). Läuft die Instanz über
|
|
einfaches HTTP, verschwindet die Verwaltung mit einem Hinweis, statt einen
|
|
kryptischen Browserfehler zu zeigen.
|
|
- Der Hostname kommt aus `APP_URL`, nicht aus dem `Host`-Header — hinter
|
|
einem Reverse Proxy hinge er sonst am falschen Namen.
|
|
- **Ein Domainwechsel entwertet alle Passkeys.** Sie sind fest an den
|
|
Hostnamen gebunden und müssen danach neu angelegt werden.
|
|
|
|
Abschaltbar über `ENABLE_PASSKEYS`.
|
|
|
|
- **Jellyfin anbinden** — Bestand und Sichtungen übernehmen, unter
|
|
*Einstellungen → Medienserver*.
|
|
|
|
Zugeordnet wird über die **TMDB-Kennung**, die Jellyfin zu jedem Item
|
|
mitliefert; dieselbe Kennung, auf der Flimmers Katalog ohnehin aufbaut. Kein
|
|
Raten über Titel und Jahreszahlen — die Zuordnung ist eindeutig oder sie
|
|
findet nicht statt. Was Jellyfin ohne Kennung führt, landet im Bericht.
|
|
|
|
Angemeldet wird mit Benutzername und Passwort, **nicht** mit einem
|
|
API-Schlüssel: mit einem Schlüssel liefert Jellyfin den Bestand ohne
|
|
Gesehen-Status, und zwar ohne Fehlermeldung. Der Verbindungstest prüft das
|
|
ausdrücklich nach und sagt es. Das Zugangstoken liegt verschlüsselt in der
|
|
Datenbank (AES-256-GCM, Schlüssel aus `AUTH_SECRET`), das Passwort wird nicht
|
|
gespeichert.
|
|
|
|
Der Abgleich ist eine **Einbahnstraße**: er ergänzt und löscht nie etwas, das
|
|
in Flimmer steht. Fehlende Titel werden nur mit gesetztem Häkchen
|
|
aufgenommen — im täglichen Lauf also nie. Danach läuft er im
|
|
Hintergrundlauf mit.
|
|
|
|
*Grenze der Quelle:* Jellyfin kennt `PlayCount` und `LastPlayedDate`, aber
|
|
keine Liste einzelner Sichtungen. Ein dreimal gesehener Film kommt deshalb
|
|
mit **einem** Termin an, nicht mit drei. Das steht auch in der Anleitung.
|
|
|
|
Das Zurückschreiben nach Jellyfin (Stufe 3) ist noch nicht dabei; das Feld
|
|
liegt im Datenmodell bereit.
|
|
|
|
- **Standardreihenfolge je Universum.** Welche Reihenfolge beim Öffnen
|
|
erscheint, lässt sich jetzt festlegen — wer Schreibrecht hat, setzt sie für
|
|
alle. Die Rangfolge bleibt schlicht: Adresse schlägt Standard schlägt erste.
|
|
Über die Schnittstelle mit `PATCH /api/v1/universen/{id}`.
|
|
|
|
### Geändert
|
|
|
|
- **Rückmeldung beim Tippen** in Suche und Bibliothek. Beim Suchen wird das
|
|
Trefferraster gedämpft und auf `aria-busy` gesetzt, der Hinweis „sucht …"
|
|
steht jetzt auch in der Bibliothek. Die alten Treffer bleiben sichtbar —
|
|
sie verschwinden zu lassen ließe die Liste bei jedem Tastendruck springen.
|
|
Die Sammelverzögerung liegt einheitlich bei 250 ms.
|
|
|
|
- **`update.sh` erkennt jetzt den Container-Zustand.** Schlägt die Abfrage über
|
|
den veröffentlichten Port fehl, zählt der Healthcheck des Containers —
|
|
hinter einem Reverse Proxy ist der App-Port oft gar nicht auf dem Host
|
|
veröffentlicht, und das Skript meldete dann einen Fehlschlag, obwohl das
|
|
Update sauber durchgelaufen war. Im Fehlerfall nennt es außerdem den Zustand
|
|
und ordnet ihn ein.
|
|
|
|
*Zur Klarstellung:* Der Changelog zu 0.7.1 führte diese Rückfallprüfung
|
|
bereits auf. Sie war dort beschrieben, aber nicht umgesetzt — jetzt ist sie
|
|
es.
|
|
|
|
- Die Entwicklungsdatenbank hat einen eigenen Compose-Projektnamen
|
|
(`flimmer-dev`). Vorher leiteten beide Compose-Dateien ihn aus dem
|
|
Verzeichnis ab, und ein `docker compose down -v` auf dem Produktivstack nahm
|
|
das Volume der Entwicklungsdatenbank mit.
|
|
|
|
### Behoben
|
|
|
|
- **Ein als gesehen markierter Film ließ sich nicht mehr zurücksetzen.** Im
|
|
Zustand „gesehen" stand statt eines Knopfes ein Etikett ohne Klickziel, und
|
|
eine Gegenfunktion gab es nicht — Serien hatten längst einen Umschalter,
|
|
Filme nur einen Hinweg. Die grüne Plakette ist jetzt klickbar.
|
|
Zurückgenommen wird dabei **nur der laufende Durchlauf**: wer einen Film
|
|
dreimal gesehen hat, verliert die früheren Sichtungen nicht.
|
|
|
|
- **Die Beschriftungen im Titelraster sprangen**, sobald ein Titel zweizeilig
|
|
umbrach — die Metazeile saß dann eine Zeilenhöhe tiefer als bei den Nachbarn,
|
|
und die Reihen waren unterschiedlich hoch. Der Titelblock belegt jetzt immer
|
|
zwei Zeilen; in der Bibliothek wird zusätzlich der Platz des
|
|
Fortschrittsbalkens freigehalten, den es nur bei Serien gibt.
|
|
|
|
### Getestet
|
|
|
|
78 Tests (vorher 52). Neu dazu: Passkey-Verwaltung samt Aussperrsperre, der
|
|
Jellyfin-Abgleich gegen nachgebildete Antworten, die Standardreihenfolge samt
|
|
Eindeutigkeit, und das Zurücknehmen einer Filmsichtung über
|
|
Durchlaufgrenzen hinweg.
|
|
|
|
Zusätzlich wurden die Klickwege gegen einen **Produktionsbau** geprüft — die
|
|
Passkey-Anmeldung mit einem virtuellen Authenticator, der Jellyfin-Abgleich
|
|
gegen einen nachgebildeten Server samt des Falls, in dem der Gesehen-Status
|
|
fehlt.
|