Files
flimmer/CHANGELOG.md
T

223 lines
12 KiB
Markdown

# Changelog
Alle nennenswerten Änderungen an Flimmer stehen in dieser Datei.
Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/),
die Versionierung [Semantic Versioning](https://semver.org/lang/de/).
## [Unveröffentlicht]
## [0.5.0] — 2026-09-01
Übersicht, Kalender und Statistik.
### Hinzugefügt
- **Übersicht** mit „Weiterschauen" (laufende Serien samt nächster Episode,
Fortschritt und „+1 Episode" direkt aus der Kachel), den Ausstrahlungen der
nächsten vier Wochen und den Watchlist-Titeln, die zuletzt auf einem Dienst
verfügbar geworden sind.
- **Kalender** als Monatsraster mit Blättern und Sprung zum heutigen Tag,
darunter die Termine des Monats als Liste. Ausgezeichnet als Tabelle — ein
Kalender *ist* eine Tabelle, und mit Screenreader wird daraus dann
„Woche 3, Donnerstag, 24." statt einer ununterscheidbaren Kachelwüste.
- **Statistikseite** mit Gesamtschauzeit, Episoden und Filmen je Monat als
Diagramm, Verteilung nach Streamingdienst und Genre, Jahresrückblick
(„2026 in Zahlen") sowie den Listen „wo die meiste Zeit hinging" und
„deine besten Bewertungen". Alles aus den Sichtungen gerechnet, Rewatches
zählen mit.
- **Diagramme als handgeschriebenes SVG** — ohne Chart-Bibliothek, dafür an
den Design-Tokens. Die beiden Serienfarben sind abgedunkelte Varianten der
Signaturfarben; sie bestehen in **beiden** Farbschemata die Prüfungen auf
Helligkeitsband, Sättigung, Farbfehlsichtigkeit und Kontrast. Die vollen
Signaturtöne wären auf dunklem Grund zu hell. Legende, Achsenwerte,
Tooltip beim Überfahren und eine für Screenreader hinterlegte Tabelle
sorgen dafür, dass die Aussage nie allein an der Farbe hängt.
- Markenfarben der Streamingdienste in der Verteilung, aber nur, wenn sie auf
hellem *und* dunklem Grund mindestens 3:1 erreichen — sonst der geprüfte
Standardton.
- **7 weitere Tests** für Gesamtzahlen, Monatsgruppierung, Jahresrückblick,
„Weiterschauen" und den Kalenderzeitraum.
### Behoben
- Das Monatsdiagramm blieb leer, obwohl Sichtungen vorlagen: `date_trunc`
liefert Mitternacht in der Zeitzone der Datenbanksitzung, JavaScript legte
beim Abgleich die lokale Zone an — zwei Stunden Versatz genügten, damit kein
einziger Monatsschlüssel mehr passte. Der Schlüssel kommt jetzt als Text
(„2026-04") aus der Datenbank.
- Eine laufende Serie, bei der man auf dem Stand ist, gilt als „abgeschlossen"
und verschwand damit aus dem Kalender — dabei will man die nächste Folge
dort erst recht sehen. Jetzt fällt nur Abgebrochenes heraus.
- Der SVG-Titel des Diagramms brach die Hydration: React behandelt `<title>`
als Dokument-Metadatum und hebt es aus dem SVG heraus. Die Beschriftung
hängt jetzt als `aria-label` am `<svg>`.
## [0.4.0] — 2026-09-01
Universen: zusammengehörige Titel, mehrere Reihenfolgen, ein Gesamtfortschritt.
### Hinzugefügt
- **Universen** aus beliebigen Filmen **und** Serien — MCU, Star Wars,
Wizarding World oder was auch immer zusammengehört.
- **Mehrere Reihenfolgen je Universum**. Die Erscheinungsreihenfolge wird aus
den Erscheinungsdaten berechnet und nie gespeichert — sie stimmt damit immer.
Weitere Reihenfolgen (Story-Chronologie, Einsteiger-Route) sind frei
sortierbar, per Ziehen **und** über Pfeilknöpfe. Reines Drag & Drop wäre mit
Tastatur nicht bedienbar und auf dem Handy fummelig.
- **TMDB-Collections als Startpunkt**: Reihen, die in der eigenen Bibliothek
vorkommen, lassen sich mit einem Klick übernehmen.
- **Universums-Detailseite** mit nummerierter Liste, Gesamtfortschritt
(„4 von 7 abgeschlossen, 21 h 21 min gesehen"), hervorgehobenem
„Als Nächstes dran" und der Restlaufzeit bis zum Ende des Universums.
Bei Serien schrumpft die Restzeit anteilig mit den gesehenen Episoden.
- **Teilen** mit anderen Konten der Instanz, wahlweise nur zum Ansehen oder
zum gemeinsamen Pflegen. Der Fortschritt ist dabei immer der des
jeweiligen Betrachters — ein geteiltes Universum zeigt jeder Person ihren
eigenen Stand. Löschen bleibt dem Besitzer vorbehalten.
- **12 weitere Tests** für Reihenfolgen, Fortschrittsberechnung über Filme und
Serien hinweg, Freigaben und die Rechteprüfung.
- Beispieluniversum im Seed: die Sternenpfad-Reihe mit fünf Filmen, zwei
Serien und einer abweichenden Story-Chronologie.
### Behoben
- Die Posterkachel zog über `lib/images.ts` die serverseitige Cache-Logik in
den Browser-Bundle, sobald sie aus einer Client-Komponente heraus gerendert
wurde — der Build brach ab, sobald eine solche Seite dazukam. Die reine
URL-Bildung liegt jetzt in `lib/image-url.ts`, der Dateicache bleibt
serverseitig.
## [0.3.0] — 2026-09-01
Das Kernstück: Bibliothek, Status und Episodenfortschritt.
### Hinzugefügt
- **Bibliothek** als Posterraster mit Volltextsuche und Filtern nach Status,
Typ, Genre, Streamingdienst und Tag; Sortierung nach zuletzt aktualisiert,
hinzugefügt, Titel, Bewertung oder Erscheinungsjahr. Der gesamte Filterstand
steht in der URL und ist damit teilbar.
- **Fünf Status** je Eintrag (Schaue gerade, Pausiert, Abgeschlossen,
Abgebrochen, Watchlist). Der Status ergibt sich beim Abhaken von selbst:
die erste Episode startet einen Titel, die letzte schließt ihn ab.
Pausiert und Abgebrochen bleiben unangetastet — wer bewusst pausiert hat,
will das nicht durch eine Sichtung aufgehoben bekommen.
- **Episodenfortschritt**: einzeln abhaken, ganze Staffel auf einmal,
„bis hierhin gesehen" für den Einstieg mitten in einer Staffel, und ein
**„+1 Episode"**-Knopf, der genau die nächste offene Episode nimmt.
Häkchen reagieren sofort und werden zurückgedreht, wenn der Server
widerspricht; beim Abhaken glimmt die Zeile einmal warm auf.
- **„Als Nächstes dran"** mit Episodencode, Titel und Ausstrahlungsdatum;
Fortschritt in Prozent auf Basis der echten Episodenzahl, dazu die
verbleibende Laufzeit.
- **Rewatch-Zählung**: ein neuer Durchlauf setzt den Fortschritt zurück, die
Sichtungen des vorherigen bleiben für die Statistik erhalten. Bei Filmen
zählt jeder Durchlauf einzeln.
- **Rückgängig** für jede Sichtungsaktion — die Rückmeldung am unteren Rand
nennt, was passiert ist, und nimmt es auf Klick zurück.
- **Pro Eintrag**: Bewertung von 1 bis 10, Notizfeld, eigene Tags und das Feld
„wo schaue ich das", das beim Aufnehmen einen Vorschlag aus der
Streaming-Verfügbarkeit erhält und jederzeit überschreibbar ist.
- **Papierkorb** statt hartem Löschen: entfernte Titel bleiben 30 Tage liegen
und behalten dabei ihren Fortschritt. Wird ein Titel erneut aufgenommen,
lebt derselbe Eintrag wieder auf.
- **Titel selbst anlegen** für alles, was TMDB nicht kennt. Solche Einträge
haben keine TMDB-ID und werden vom Abgleich nie angefasst.
- **Seed mit Beispielbibliothek**: erfundener Katalog aus 8 Serien und
10 Filmen samt lokal erzeugten Postern, dazu 18 Bibliothekseinträge und
85 Sichtungen über die letzten Monate verteilt.
- **21 Tests** decken Aufnehmen, Abhaken, Fortschritt, Rewatch, Papierkorb und
den Zugriffsschutz zwischen Nutzern ab.
### Geändert
- Die Detailseite liegt jetzt unter `/titel/<id>` und hängt an der internen
Titel-ID statt an der TMDB-ID — nur so bekommen manuell angelegte Titel
dieselbe Seite. Treffer aus der Suche laufen über `/tmdb/<art>/<id>`, das
den Titel holt und weiterleitet.
- Die Zahl der Build-Worker ist auf vier begrenzt: mit einem Worker je Kern
stürzte der Build auf einer 18-Kern-Maschine reproduzierbar ab, weil jeder
Worker eine eigene Prisma-Engine hochzieht.
## [0.2.0] — 2026-09-01
Metadaten: Flimmer spricht mit TMDB.
### Hinzugefügt
- **TMDB-Anbindung** für Suche (gemeinsam über Serien und Filme oder getrennt),
Detailabruf, Staffeln und Episoden, offizielle Collections sowie die
Streaming-Verfügbarkeit in der eingestellten Region. Zugang wahlweise über
den klassischen API-Schlüssel oder das Bearer-Token.
- **Gemeinsamer Katalog**: Titel werden über (Typ, TMDB-ID) dedupliziert — bei
mehreren Nutzern liegt jede Serie samt Episodenliste nur einmal in der
Datenbank. `ensureTitle` holt einen Titel nur, wenn er fehlt oder veraltet ist,
und fällt bei einem TMDB-Ausfall auf den lokalen Stand zurück.
- **Bild-Cache**: Poster und Hintergrundbilder werden einmal geholt und danach
über `/api/image` vom eigenen Server ausgeliefert. Größe und Pfad werden
streng geprüft, damit der Endpunkt kein offener Proxy wird.
- **Suchseite** mit Typfilter; die Anfrage steht in der URL und ist damit
teilbar. Getippte Eingaben werden kurz gesammelt, bevor gesucht wird.
- **Detailseite** je Titel mit Backdrop, Kopfdaten, Genres, Streamingdiensten
(mit den Akzentfarben der großen Anbieter) und aufklappbaren Staffeln samt
Episodenliste.
- **Testlauf ohne Schlüssel**: nachgebildete TMDB-Antworten unter `tests/` und
`npm test` prüfen den kompletten Importpfad gegen eine echte Datenbank.
### Behoben
- `importSeries` gab den Titel zurück, bevor Staffel- und Episodenzähler
geschrieben waren — die Zähler standen dadurch auf 0.
- Poster und Dienstlogos zeigten das kaputte Bildsymbol des Browsers, wenn ein
TMDB-Pfad ins Leere lief. Die Rückfalldarstellung liegt jetzt dauerhaft
darunter statt an einem `onError`-Handler zu hängen, der bei einem früh
gescheiterten Bild gar nicht mehr feuert.
## [0.1.0] — 2026-09-01
Erste lauffähige Etappe: Gerüst, Marke, Datenmodell und Anmeldung.
### Hinzugefügt
- **Projektgerüst** mit Next.js 16 (App Router), TypeScript, Tailwind CSS v4
und `standalone`-Build für schlanke Container.
- **Marke Flimmer**: Logo als SVG in drei Varianten (Bildmarke, Bildmarke mit
Wortmarke, monochrom) plus Maskable-Variante. Die Wortmarke ist aus Pfaden
konstruiert und braucht keine installierte Schrift.
- **Icon-Generator** (`npm run icons`): erzeugt Favicon (SVG und ICO),
PWA-Icons in sieben Größen, Maskable-Icons, Apple-Touch-Icon und OG-Bild
aus den SVG-Quellen.
- **Design-Tokens** als CSS-Variablen, über `@theme inline` an Tailwind
angebunden. Dunkles Standard-Theme und heller Modus mit Umschalter
(Dunkel / Hell / System), ohne Aufblitzen beim Laden. Alle Farbkombinationen
erfüllen WCAG AA; getrennte Verläufe für Flächen und Text sorgen dafür, dass
auch der Signaturverlauf im hellen Modus lesbar bleibt.
- **Datenmodell** (Prisma, PostgreSQL) für Konten, Katalog (Titel, Staffeln,
Episoden, Streamingdienste), persönliches Tracking, Universen mit
Reihenfolgen sowie Benachrichtigungen und Hintergrundläufe.
- **Authentifizierung**: Registrierung und Anmeldung mit E-Mail und Passwort
(bcrypt), Sitzungen als opake Token in der Datenbank mit httpOnly-Cookie.
Der erste registrierte Zugang wird automatisch Administrator; die
Registrierung lässt sich instanzweit abschalten.
- **Optionales SSO** über OIDC (Authorization Code mit PKCE) für Authelia,
Keycloak, Authentik und Verwandte — per Umgebungsvariablen aktivierbar,
mit Zuordnung zu vorhandenen Konten über die E-Mail-Adresse.
- **API-Schlüssel** je Nutzer als Grundlage für die spätere REST-API.
- **Docker-Compose-Setup** für den Selbstbetrieb (App und PostgreSQL,
persistente Volumes, Healthcheck) samt Entrypoint, der ausstehende
Migrationen beim Start einspielt.
- **Healthcheck** unter `/api/health`, der auch die Datenbank prüft.
- **PWA-Manifest** mit allen Icon-Größen.
- **Oberflächentexte** auf Deutsch, gebündelt in `src/i18n` und so aufgebaut,
dass weitere Sprachen als zusätzliche Datei dazukommen können.
- **Seed-Skript** mit Demo-Konten sowie README und Design-Dokumentation.
[Unveröffentlicht]: https://git.wilde-server.de/florian.wilde/flimmer/compare/v0.5.0...HEAD
[0.5.0]: https://git.wilde-server.de/florian.wilde/flimmer/releases/tag/v0.5.0
[0.4.0]: https://git.wilde-server.de/florian.wilde/flimmer/releases/tag/v0.4.0
[0.3.0]: https://git.wilde-server.de/florian.wilde/flimmer/releases/tag/v0.3.0
[0.2.0]: https://git.wilde-server.de/florian.wilde/flimmer/releases/tag/v0.2.0
[0.1.0]: https://git.wilde-server.de/florian.wilde/flimmer/releases/tag/v0.1.0