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.
This commit is contained in:
+115
@@ -7,6 +7,121 @@ die Versionierung [Semantic Versioning](https://semver.org/lang/de/).
|
||||
|
||||
## [Unveröffentlicht]
|
||||
|
||||
## [0.8.0] — 2026-09-02
|
||||
|
||||
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.
|
||||
|
||||
|
||||
## [0.7.1] — 2026-09-01
|
||||
|
||||
### Hinzugefügt
|
||||
|
||||
Reference in New Issue
Block a user