Startseite: Umschalten von "Gesamtes Archiv" fühlt sich nicht mehr wie eine hängende Seite an. Beim Klick legt sich der Schalter sofort um, das Raster wird gedimmt und ein Hinweis ("Gesamtes Archiv wird geladen ..." bzw. "Empfehlungen werden geladen ...") erscheint, bis die neue Seite da ist. Bei Zurück-Navigation wird der Ladezustand wieder zurückgesetzt.
Rendering-Last im Browser gesenkt: Poster-Karten nutzen jetzt `content-visibility: auto`, der Browser überspringt Layout und Zeichnen für alles außerhalb des sichtbaren Bereichs (im Archiv-Modus ~3000 Karten; gemessen ca. dreimal weniger Layoutzeit). Ein Innenpolster mit gleich großem negativem Rand hält das Raster unverändert und verhindert, dass Hover-Zoom und Schatten am Kartenrand abgeschnitten werden.
Der Archiv-Schalter wird per `aria-checked` gestylt (statt über serverseitig gesetzte Klassen) - nötig für das sofortige Umlegen.
v0.53.0 – 2026-09-21
Startseite: Standardsortierung je nach Modus, solange keine Sortierung im Dropdown gewählt wurde. Bei den Empfehlungen jetzt "Zuletzt gesehen: Neueste zuerst", im Archiv-Modus ("Gesamtes Archiv") "Zuletzt hinzugefügt". Eine gewählte Sortierung bleibt bei allen Wechseln (Typ, Genre, Anbieter, Archiv-Schalter) erhalten; die Standardsortierung wird dagegen nicht in die URL geschrieben und passt sich beim Umschalten des Archiv-Modus an. Unbekannte Sortierwerte in der URL gelten als nicht gewählt.
Sortier-Dropdown neu geordnet (nach Relevanz/Häufigkeit): Zuletzt gesehen (neueste), Zuletzt hinzugefügt, Bewertung (höchste/niedrigste), Erscheinungsjahr (neueste/älteste), Zuletzt gesehen (älteste), Titel A-Z/Z-A. Die Sortier-Schlüssel heißen jetzt einheitlich `watched_*`, `added_desc`, `rating_desc`; die alten (`last_viewed_*`, `added`, `rating`) funktionieren in bestehenden Links weiter.
Ein Wechsel der Sortierung im Dropdown verwarf bisher die gewählten Genre-Filter (Einschließen/Ausschließen); sie bleiben jetzt erhalten.
v0.52.1 – 2026-09-21
Header-Ticker: der Titel bei "Zuletzt geschaut" war bei Serien nie klickbar. Plex liefert in Verlaufseintraegen den Serien-Key nur als Pfad (`grandparentKey`), nicht als `grandparentRatingKey` - dadurch blieben Key und TMDb-ID leer und es gab kein Klickziel. Der Key wird jetzt aus dem Pfad gelesen. Zusaetzlich sucht der Ticker den Titel zuerst ueber die Plex-Verknuepfung (`plex_rating_key`) und erst danach ueber die TMDb-ID; dadurch klappt der Link auch, wenn Plex keine TMDb-GUID liefert. "Schaut gerade" war davon nicht betroffen.
v0.52.0 – 2026-09-21
Startseite: Schalter "Gesamtes Archiv" in der Filterleiste. Ohne ihn bleibt die Übersicht strikt bei den Empfehlungen (>= 8 Sterne). Mit ihm erscheinen zusätzlich alle Titel darunter (und unbewertete). Der Zustand steht als `?show_all=1` in der URL, bleibt also beim Wechsel von Typ, Genre, Anbieter und Sortierung erhalten und ist verlinkbar. Der Zähler oben zeigt im Archiv-Modus die Gesamtzahlen mit dem Zusatz "(gesamtes Archiv)".
Archiv-Titel (unter der Empfehlungsschwelle) sind im Grid klar gekennzeichnet: gedämpftes Poster (Farbe/Deckkraft kommt beim Hover zurück), abgeblasster Titel und ein Streifen "Archiv · nicht empfohlen". Gilt auch für Suchergebnisse, die ja schon immer den kompletten Katalog durchsuchen.
Sortierung: Im Archiv-Modus ist die Standardsortierung "Meine Bewertung: Höchste zuerst" (Empfehlungen oben, Archiv folgt darunter); eine explizit gewählte Sortierung gilt weiter. Beim Umschalten des Archiv-Modus wird die Standardsortierung nicht in die URL eingefroren. Bei gleichem Sortierwert entscheidet jetzt zusätzlich das Hinzufüge-datum, damit die Reihenfolge stabil bleibt.
Der Zufallsgriff bleibt bewusst bei den Empfehlungen, auch im Archiv-Modus. Der Hinweis auf der Detailseite unter der Schwelle verlinkt jetzt auf das Archiv.
v0.51.2 – 2026-09-21
Plex-Import überschreibt manuell korrigierte TMDb-Zuordnungen nicht mehr. Bisher setzte jeder Lauf die per "TMDb-Zuordnung korrigieren" gewählte ID (und den Typ) wieder auf die Plex-GUID zurück - z.B. kennt Plex bei "My Mother The Animation" nur einen Duplikat-Eintrag ohne Poster. Die Korrektur setzt jetzt ein Flag (`tmdb_locked`, neue Spalte, wird beim Start automatisch angelegt); für gesperrte Einträge nutzt der Sync die gespeicherte ID samt Typ.
Liefert Plex für einen Titel gar keine TMDb-ID (z.B. WWE-PPVs), ordnet der Import ihn jetzt über Titel und Typ auch einem manuell angelegten Eintrag MIT TMDb-ID zu (sofern dieser noch keinem anderen Plex-Objekt gehört), statt bei jedem Lauf ein Duplikat anzulegen.
v0.51.1 – 2026-09-19
Export-Liste: die beiden Checkboxen "Genres kombinieren" und "Nur mit 10 Sternen bewertete Titel" sind jetzt Schalter (Toggle-Switches) statt einfacher Kästchen. Farben kommen aus den Theme-Tokens (Track/Knopf in Gold bei "an", gedämpft bei "aus"), passen sich also automatisch an Hell und Dunkel an; reines Tailwind (`peer`-Checkbox), kein JS. Das Formular sendet unverändert dieselben Feldwerte.
v0.51.0 – 2026-09-19
Export-Liste (`/admin/export`): neuer Schalter "Genres kombinieren". Bisher ergab jedes gewählte Genre einen eigenen Abschnitt (z.B. "Anime" und "Action" getrennt - alle Animes plus alle Action-Titel). Mit dem Schalter entsteht stattdessen ein einziger Abschnitt (Label z.B. "Anime + Action") mit nur den Titeln, die ALLE gewählten Genres tragen (UND-Verknüpfung). Ohne Schalter bleibt das bisherige Verhalten unverändert; bei nur einem gewählten Genre hat er keine Wirkung.
Deployment: `deploy-nas.sh` zielt nicht mehr auf die Synology, sondern auf den neuen Docker-Host (`dockerhost`, 192.168.1.26). Dort läuft der Stack über Dockhand mit einem lokal gebauten Image (`cinelog-cinelog:latest`, Daten unter `/opt/docker/appdata/cinelog`); das Skript baut das Image auf dem Host und erzeugt den Container daraus neu. Plex bleibt weiterhin auf der Synology (192.168.1.4:32400, `PLEX_BASE_URL` im Stack unverändert).
v0.50.1 – 2026-09-15
Bug: `_sync_plex_item()` (Plex-Import/-Abgleich) hat die TMDb-ID eines Titels bei jedem erneuten Sync stumpf mit dem überschrieben, was Plex' eigene GUID-Auflösung liefert - lieferte Plex dabei keine (z.B. bei Sonderformaten wie Wrestling-PPVs oder mehrdeutigen Treffern), wurde eine zuvor manuell über "TMDb-Zuordnung korrigieren" gesetzte ID auf "keine" zurückgesetzt. Betroffene Titel tauchten dadurch nach jedem "Aus Plex importieren" wieder bei "Titel mit fehlenden Daten" auf, obwohl sie bereits korrigiert waren. Eine vorhandene TMDb-ID bleibt jetzt erhalten, wenn Plex selbst keine liefert.
Manuelle TMDb-ID-Eingabe im "TMDb-Zuordnung korrigieren"-Widget (admin_form.html): akzeptiert eine nackte ID oder einen kompletten TMDb-Link, als Fallback für Titel, die TMDbs eigene Such-API nicht findet, obwohl die Detailseite existiert (z.B. "My Mother The Animation" - TMDb-Datenlücke, nicht durch uns behebbar). Neuer Endpoint `GET /admin/media/tmdb-lookup`.
v0.50.0 – 2026-09-15
Plex-Webhook reagiert jetzt zusätzlich zu `media.rate` auch auf `media.scrobble` (feuert bei jeder abgeschlossenen Wiedergabe, auch bei einem Rewatch) - ein bereits getrackter Titel bekommt dadurch sofort ein aktuelles `watched_at`, ohne dass dafür die Bewertung neu gesetzt werden muss. Damit rutscht er auch direkt in der Sortierung "Zuletzt gesehen" nach oben, statt erst beim nächsten manuellen Plex-Abgleich. Bei Serien wird die Episode über ihre `grandparentRatingKey` der Serie zugeordnet (die GUID/rating_key der Episode selbst zeigt auf einen anderen Eintrag als die Serie). Nur `watched_at` wird angefasst - Bewertung und übrige Metadaten bleiben unverändert, das bleibt weiterhin allein `media.rate` vorbehalten. Noch nicht getrackte Titel werden durch ein Scrobble-Event nicht neu angelegt.
v0.49.0 – 2026-09-15
Header-Untertitel unter dem Logo von "Meine Film- & Serienempfehlungen" zu "unLiebs Film- & Serienempfehlungen" geändert.
Der Titel im "Schaut gerade"/"Zuletzt geschaut"-Ticker ist jetzt klickbar: liegt der laufende Titel bereits in unserer DB (per media_type + TMDb-ID), geht der Link auf die eigene Detailseite (`/media/<id>`), sonst extern auf die passende TMDb-Seite (neuer Tab). Dafür löst `plex.py` bei Episoden die TMDb-ID der Serie über die `grandparentRatingKey` auf (die GUID der Episode selbst zeigt auf einen anderen Titel, siehe bestehende Season/Episode-Falle in `fetch_metadata()`) statt über die Episode direkt. Die Verlinkungs-Logik läuft im 60s-Hintergrund-Refresh (`live_status.refresh()`), nicht pro Seitenaufruf.
v0.48.1 – 2026-09-14
Zahlen-Label neben den 5-Sterne-Widgets (v0.48.0) zeigt wieder die 10er-Skala ("9 / 10" statt "4,5 / 5") - nur die Sterne-Darstellung selbst nutzt 5 Sterne mit Halbschritten, der Zahlenwert bleibt auf der vertrauten Skala.
v0.48.0 – 2026-09-14
Die beiden interaktiven Sternebewertungs-Widgets (Bearbeiten-Seite `admin_form.html` und Detailseite `detail.html`) zeigen jetzt 5 Sterne mit halben Schritten statt 10 einzelne Sterne (Plex-Stil) - spart Platz und fühlt sich vertrauter an. Speicherung intern unverändert auf der bestehenden 0–10-Skala (`my_rating`), nur die Anzeige/Eingabe rechnet durch 2 (z.B. 9 → 4,5 Sterne) - kein Datenbank- oder Backend-Umbau nötig, Plex-Rück-Sync (v0.45.0) unverändert kompatibel. Klick auf die linke/rechte Hälfte eines Sterns setzt den Halb-/Vollwert; per Tastatur ausgelöste Klicks (kein Mausereignis) setzen defensiv den vollen Stern. Badges/Export/Statistik (10er-Skala) bewusst unverändert gelassen (siehe Notiz-Feature-Verwechslung v0.47.0 - diesmal vorab abgestimmt).
v0.47.0 – 2026-09-14
Rich-Link-Preview-Feature aus v0.46.0 war ein Missverständnis (Ziel war nicht, extern eingefügte Links innerhalb von CineLOG als Karte anzuzeigen, sondern dass CineLOG-Links, die anderswo geteilt werden, dort selbst eine schöne Vorschau bekommen) - daher zurückgebaut: `/api/link-preview`-Endpoint (`app/link_preview.py`) sowie die Karten-Anzeige im Notiz-Feld (detail.html) entfernt.
Stattdessen: Open-Graph-Meta-Tags (og:title/og:description/og:image/ og:url/og:type) sind jetzt pro Seite überschreibbar (base.html, neue Jinja-Blocks) und auf der Detailseite mit den echten Daten des jeweiligen Titels befüllt (Titel, Handlungs-Teaser, Poster, video.movie/video.tv_show). Rein statisch, kein eigener Abruf durch CineLOG nötig - Plattformen wie WhatsApp/Discord/gutefrage.net holen sich die Daten beim Teilen eines CineLOG-Links selbst ab.
v0.46.0 – 2026-09-14
Rich Link Preview Cards: extern eingefügte Links in der Notiz ("Meine Meinung", `my_note`) werden automatisch erkannt und als Vorschau-Karte im CineLOG-Pillen-Design dargestellt (Site-Name, Titel, Teaser, Bild rechts) - für angemeldete und anonyme Besucher.
Neuer Endpoint `GET /api/link-preview?url=...` (`app/link_preview.py`) löst die Open-Graph-Meta-Tags (og:title/og:description/og:image/ og:site_name) einer beliebigen URL per httpx auf. Da der Server dabei beliebige extern eingegebene URLs abruft, ist der Abruf gegen Server-Side-Request-Forgery (SSRF) abgesichert: nur http/https, jeder aufgelöste Hostname (inkl. jedes Redirect-Ziels) wird gegen private/ loopback/link-lokale IP-Bereiche geprüft, Redirects werden manuell verfolgt statt automatisch, und Antwortgröße sowie Timeout sind begrenzt.
v0.45.1 – 2026-09-13
Native `confirm()`-Dialoge durch eine gemeinsame Modal-Komponente im CineLOG-Design ersetzt (base.html, `cinelogConfirm(message, onConfirm, {title, confirmLabel, danger})`) - betraf noch die beiden Lösch-Bestaetigungen (Detailseite, Bearbeiten-Seite). Das bereits bestehende TMDb-Zuordnungs-Modal (admin_form.html, siehe v0.43.1) wurde auf dieselbe gemeinsame Komponente umgestellt statt eine eigene Modal-Instanz zu behalten - drei Stellen mit demselben Muster rechtfertigen die gemeinsame Komponente statt weiterer Duplizierung. Lösch-Bestaetigungen nutzen die rote/"danger"-Einfaerbung, die TMDb-Zuordnung die bisherige goldene. - Geprueft: im gesamten Projekt gab es nur noch diese zwei `confirm()`-Aufrufe, keine weiteren `alert()`/`prompt()`-Dialoge.
v0.45.0 – 2026-09-13
Schnelles Um-/Neubewerten direkt auf der Detailseite: statt über "Bearbeiten" → Stern setzen → "Speichern" (drei Schritte) genügt jetzt ein Klick auf einen Stern im interaktiven Widget (nur für angemeldete Nutzer sichtbar, ersetzt dort die sonst gezeigte Bewertungs-Pille) - wird sofort per AJAX gespeichert, kein Reload noetig. Fuer Besucher ohne Login bleibt die bekannte farbige Bewertungs-Pille (Meisterwerk/Highlight/Empfehlenswert/...) unveraendert. - **Rueck-Synchronisation nach Plex**: ist der Titel mit Plex verknuepft (plex_rating_key gesetzt), wird dieselbe Bewertung automatisch auch dorthin geschrieben (`PUT /:/rate`, neue `plex.set_rating()`) - inklusive Entfernen einer Bewertung (Plex-Sonderwert `rating=-1`). Verifiziert am echten Plex-Server (Test-Rundlauf: setzen, entfernen, zurücksetzen - keine bleibende Änderung). - Neue Route `POST /admin/media/{id}/rate`, gibt JSON zurueck (`plex_synced: true/false`) fuer eine kurze Bestaetigungsmeldung im UI ("Gespeichert · auch in Plex aktualisiert").
v0.44.1 – 2026-09-13
Große Zahlen werden jetzt durchgängig in deutscher Schreibweise mit Tausenderpunkt dargestellt (`10.000` statt `10000`/`10,000`) - betrifft das Statistik-Dashboard (Titel gesamt, Empfohlen, Gefiltert, Ø Bewertung, Verteilung, Top-Genres/-Anbieter), den OMDb-Nutzungszähler, die Bibliotheksgröße auf der Startseite sowie die Sync-Fortschritts-anzeige (Titelzähler, importiert/aktualisiert). Neuer Jinja-Filter `de_number` (main.py, `format(x, ",d").replace(",", ".")`) für serverseitig gerenderte Templates, `toLocaleString('de-DE')` für die clientseitige Fortschrittsanzeige (admin_list.html).
v0.44.0 – 2026-09-13
Prioritaet für die Handlung beim Plex-Sync (`_sync_plex_item`) neu geordnet: deutsche TMDb-Handlung zuerst, dann Plex' eigene Zusammenfassung (oft schon deutsch, z.B. bei "Die Rote Meile" ueber einen lokalen Metadaten-Agent), erst als letzter Ausweg die englische TMDb-Handlung (siehe v0.43.3). `plex.fetch_metadata()` liefert dafuer jetzt zusaetzlich das `summary`-Feld. `tmdb.fetch_details()` liefert wieder nur die rohe deutsche Handlung (ohne automatischen Fallback); die englische Handlung ist jetzt eine eigene Funktion (`fetch_overview_en()`), damit Aufrufer mit einer besseren deutschsprachigen Quelle (Plex) diese zuerst versuchen koennen. `sync.refresh_item_from_tmdb()` (TMDb erneut abrufen/Relink/ wöchentlicher Job, kein Plex-Kontext vorhanden) faellt weiterhin direkt von Deutsch auf Englisch zurueck.
v0.43.3 – 2026-09-13
`tmdb.fetch_details()` zeigte eine leere Handlung, wenn TMDb fuer einen Titel keine deutsche Uebersetzung hinterlegt hat (bestaetigt fuer alle verbliebenen 10 Datenqualitaets-Warnungen, z.B. "Die Rote Meile" - eine echte, eigenstaendige Sat.1-Serie von 1999, deren TMDb-Verknuepfung die ganze Zeit korrekt war). Holt jetzt als Fallback die englische Handlung nach, wenn die deutsche leer ist, statt gar keine anzuzeigen - betrifft ausschliesslich Titel ohne deutschen Text, eine vorhandene deutsche Handlung bleibt unveraendert vorrangig.
v0.43.2 – 2026-09-13
"TMDb-Zuordnung korrigieren" (admin_media_relink) crashte mit Internal Server Error (500), wenn die gewaehlte TMDb-ID bereits einem ANDEREN Eintrag gehoerte - verletzte den DB-UNIQUE-Constraint (media_type, tmdb_id) ungefangen. Praktisch der Kernfall der Datenqualitaets-Warnung selbst: derselbe Titel kam einmal ueber Plex ohne TMDb-Link und einmal ueber Trakt MIT Link als zwei getrennte Eintraege herein (z.B. "Lilo & Stitch" 2025 als Item 1168 ueber Plex ohne Link und Item 1885 ueber Trakt mit Link 552524 - Relink von 1168 auf 552524 kollidierte). Wird jetzt vorab geprueft: bei Konflikt keine Aenderung, sondern eine Meldung mit Link zum bereits vorhandenen Eintrag ("vermutlich ein Duplikat - bitte vergleichen und einen davon löschen").
v0.43.1 – 2026-09-13
"TMDb-Zuordnung korrigieren" (admin_form.html) auf Client-seitiges JS umgestellt statt Seiten-Reload: - Die Suche läuft jetzt per `fetch()` gegen einen neuen JSON-Endpunkt (`GET /admin/media/tmdb-search`) und rendert die Treffer dynamisch ins bestehende Grid, ohne dass die Seite neu lädt oder das Formular darunter kurz aufblitzt. - Das native Browser-`confirm()` vor dem Übernehmen einer Zuordnung ist einem eigenen, dezenten Modal im CineLOG-Design gewichen (Overlay mit "Abbrechen"/"Zuordnung übernehmen" - schließt auch bei Klick auf den Hintergrund). Die eigentliche Übernahme bleibt ein normaler Form-POST (kein AJAX), damit alle abhängigen Felder (Titel, Poster, Genres, Jahr, Bewertungen, Sternen-Widget, ...) einfach per Redirect+Reload konsistent neu geladen werden, statt jedes Feld einzeln per JS nachzuziehen. - Ergebnis-Titel bekommen ein `title`-Attribut mit vollständigem Titel + Jahr, damit bei abgeschnittenen (`truncate`) Titeln der volle Name beim Hovern sichtbar ist.
v0.43.0 – 2026-09-13
"TMDb-Zuordnung korrigieren" in der Bearbeiten-Seite: eine In-App-Suche (statt bisher nur einem manuellen Poster-Pfad-Textfeld) zeigt TMDb-Treffer als Poster-Grid; ein Klick ersetzt die komplette Verknüpfung (`tmdb_id` + Typ) und holt Poster, Handlung, Genres, Jahr, Serien-Status, TMDb-/IMDb-Bewertung, Streaming-Anbieter und Altersfreigabe frisch von der neuen ID (nutzt dieselbe `refresh_item_from_tmdb()` wie der bestehende "TMDb erneut abrufen"-Button, nur mit austauschbarer ID statt der alten). Behebt u.a. Fälle wie "My Mother The Animation": eine TMDb-ID war zwar gesetzt, zeigte aber auf einen falschen/leeren TMDb-Datensatz. - Suchfeld ist mit dem aktuellen Titel vorbefüllt, Typ-Auswahl (Film/Serie) für Fälle, in denen die richtige Zuordnung beim jeweils anderen Typ lag. Sicherheitsabfrage vor dem Übernehmen, aktuell verknüpfter Treffer wird im Ergebnis-Grid hervorgehoben. - Neue Route `POST /admin/media/{id}/relink`; `GET .../edit` akzeptiert jetzt optional `tmdb_query`/`tmdb_type` für die Suche.
v0.42.0 – 2026-09-13
**Datenqualitäts-Check**: Warn-Kachel in der Verwaltung ("⚠️ N Titel benötigen Überarbeitung"), sobald Titel mit fehlendem Poster, fehlender Handlung oder ganz ohne TMDb-Verknüpfung existieren (deckt u.a. den kürzlich gefundenen "My Mother The Animation"-Fall ab: TMDb-ID vorhanden, aber Poster/Handlung leer). Klick führt zu einer neuen Liste (`/admin/data-quality`) mit direktem Bearbeiten-Link pro Titel und Tags, welches Problem konkret vorliegt.
**Top-Anbieter**: dritte Auswertung neben Top-Genres in den Statistiken - die 3 am häufigsten vorkommenden Streaming-Anbieter (kuratiert wie gehabt über `MediaItem.provider_names()`, keine Roh-Varianten wie "... Amazon Channel").
**OMDb-Nutzungszähler**: "OMDb heute: X / Y Aufrufe" bei der Sync-Info in der Verwaltung, inkl. Warnhinweis bei erschöpftem Tageslimit. Neuer `OMDB_DAILY_LIMIT`-Wert (Default 1000, bei uns auf den bezahlten 10.000er-Tarif gesetzt) nur für die Anzeige - das reaktive Abschalten bei erschöpftem Kontingent lief schon vorher unabhängig davon. Der Zähler wird wie der Sync-Status als kleine JSON-Datei neben der DB persistiert, übersteht also einen Neustart am selben Tag.
v0.41.0 – 2026-09-13
Statistik-Dashboard in der Verwaltungsübersicht, unterhalb der Aktions-Kacheln und der Sync-Info: 4 kompakte Stat-Pillen (Titel gesamt inkl. Film-/Serien-Aufteilung, Empfohlen ≥ RECOMMEND_THRESHOLD, Gefiltert/nur über Suche, Ø Bewertung), eine horizontale Prozentbalken-Visualisierung der Sterne-Verteilung (10 bis 1, jeweils Anzahl + Prozent) sowie die Top-3-Genres nach Häufigkeit. - Neue `_admin_stats(db)`-Funktion in main.py: zählt Filme/Serien getrennt, "Gefiltert" ist bewusst `total - recommended` (schliesst unbewertete Titel mit ein, die ebenfalls nicht auf der Startseite erscheinen), Ø Bewertung per SQL-`AVG` (ignoriert NULLs automatisch). Genre-Häufigkeit wird in Python ausgezählt (`collections.Counter`), da Genres als kommagetrennter String pro Titel vorliegen und sich dafür kein sinnvoller reiner SQL-Weg anbietet. - Design durchgehend im bestehenden Pillen-/Kachel-Look (border-line, bg-panel/bg-panel2, bg-accent für die Balken) - fügt sich ohne neue Farbwerte in die bestehende Amber/Gold-Palette ein.
v0.40.0 – 2026-09-13
Eigene Bewertung ("Meine Bewertung") von Float auf Ganzzahl (1-10) umgestellt: Anzeige auf Karten/Detailseite/Export zeigt jetzt `★ 8` statt `★ 8.0`. `my_rating` in models.py ist jetzt als Integer deklariert; bereits gespeicherte Bewertungen bleiben unangetastet (waren schon immer ganzzahlig, keine Datenmigration nötig). - SQLite behält bei Bestandsinstallationen die urspruengliche Spalten-Affinitaet (REAL) bei, auch wenn das Modell jetzt Integer sagt - eine neu geschriebene Ganzzahl kaeme sonst als 8.0 zurueck statt als 8. Statt einer riskanten Tabellenmigration (SQLite kennt kein ALTER COLUMN TYPE) wird an allen Ausgabestellen explizit mit `|int` (Templates) bzw. `int(...)` (main.py-Export) auf Ganzzahl gerundet - robust unabhaengig vom tatsaechlichen Spaltentyp. - `_sync_plex_item` rundet Plex' userRating (kommt als Float von der API) jetzt beim Zuweisen explizit auf eine Ganzzahl.
Bewertungs-Eingabe in der Bearbeiten-Seite (admin_form.html): das bisherige `<input type="number" step="0.1">` weicht einem interaktiven 10-Sterne-Widget (Hover-Vorschau, Klick setzt den Wert, Klartext-Anzeige "X / 10" bzw. "Keine Bewertung", "Entfernen"-Link zum Zuruecksetzen) im gewohnten Pillen-/Border-Design. Der eigentliche Wert liegt in einem `<input type="hidden" name="my_rating">`, der beim Zuruecksetzen deaktiviert wird, damit das Formular wie bisher ganz ohne Bewertung abgeschickt werden kann. - Die manuelle "Neu anlegen"-Suche (admin_search.html) erfasst weiterhin keine Bewertung direkt bei der Erstellung (das war schon vorher so - Bewertung wird erst danach über "Bearbeiten" vergeben), daher kein Sternen-Widget dort.
v0.39.0 – 2026-09-13
Neue Funktion "Mit Plex abgleichen" in der Verwaltung (neben "Aus Plex importieren"): verknüpft bestehende CineLOG-Einträge (z.B. aus dem Trakt-Import oder manuell angelegt) nachträglich mit ihrem Plex-Bibliothekseintrag - anders als der normale Import OHNE Beschränkung auf in Plex bewertete Titel. Hintergrund: der normale Import/Webhook berücksichtigt nur Titel mit einer Plex-Bewertung >= PLEX_RATING_THRESHOLD; Titel, die zwar in Plex vorhanden aber dort nie bewertet wurden (Bewertung nur auf Trakt/plex.tv vergeben, oder beim Neuaufsetzen eines Plex-Servers verlorengegangen), blieben dadurch dauerhaft unverknüpft. - Matching läuft über die TMDb-ID (neue `plex.list_all_tmdb_matches()`, liest die komplette Bibliothek inkl. Guid-Array in einem Rutsch statt mit Einzelabfragen pro Titel). - Eine bestehende eigene Bewertung bleibt erhalten, wenn Plex selbst keine hat; hat Plex eine Bewertung, gewinnt diese (Plex gilt als aktuellere/autoritativere Quelle). Getestet: beide Faelle laufen korrekt (Plex-Bewertung übernommen bzw. eigene Bewertung erhalten). - Nutzt denselben Fortschrittsbalken/Abbrechen-Mechanismus wie der normale Plex-Import (admin_list.html, jetzt zwei "sync-trigger-form"-Formulare statt einem fest verdrahteten).
v0.38.1 – 2026-09-13
"Bearbeiten" auf der Detailseite bekommt jetzt ebenfalls eine Pille (Outline-Stil, passend zum "TMDb erneut abrufen"-Button), statt als reiner Textlink neben der roten "Löschen"-Pille zu stehen.
"Löschen" auf der Bearbeiten-Seite selbst (zweiter Zugang neben dem auf der Detailseite - bewusst belassen, praktisch falls man sich schon mitten in der Bearbeitung umentscheidet) ebenfalls als rote Pille statt reinem Textlink, passend zu "Speichern"/"TMDb erneut abrufen" in derselben Reihe. Die Sicherheitsabfrage ("... wirklich löschen?") gab es an beiden Stellen bereits und bleibt unveraendert bestehen.
v0.38.0 – 2026-09-13
"Löschen"-Button direkt auf der Detailseite (neben "Bearbeiten", nur für angemeldete Nutzer sichtbar) - als auffällige rote Pille mit Bestätigungsdialog. Die eigentliche Lösch-Route (`POST /admin/media/{id}/delete`) gab es bereits (nur ueber den Umweg Bearbeiten-Formular erreichbar), war dort aber leicht zu uebersehen. Duplikate oder Fehlimporte koennen damit jetzt ohne Umweg ueber die Bearbeiten-Seite entfernt werden.
v0.37.3 – 2026-09-13
`scripts/trakt_import.py`: Zeitzonen-Vergleich korrigiert - SQLite/SQLAlchemy liefert `watched_at` ohne tzinfo zurueck, obwohl die Werte als UTC gemeint sind (siehe main.py), waehrend die aus Trakt geparsten Zeitstempel tzinfo-aware waren - der direkte Vergleich brach mit TypeError ab. `_parse_dt()` gibt jetzt konsistent ein naives UTC-datetime zurueck.
`scripts/trakt_import_create.py`: von seriellem auf paralleles Abrufen der Netzwerkdaten umgestellt (Default-Parallelitaet 10, per `--concurrency` einstellbar). Seriell brauchte praktisch jeder Titel durchgaengig ca. 12s (nicht nur beim ersten Aufruf), weil zwischen zwei Anfragen an denselben externen Host (TMDb-Hauptendpunkt, Bild-CDN, OMDb) durch die jeweils anderen Zwischenschritte mehr Zeit verging, als die Gegenstelle die Verbindung offenhielt - jede Anfrage baute dadurch trotz wiederverwendetem HTTP-Client faktisch eine neue Verbindung auf. Mit mehreren Titeln gleichzeitig in Bearbeitung bleiben die Verbindungen durchgehend beschaeftigt (1111 Titel: von rechnerisch mehreren Stunden auf ca. 10 Minuten, im Praxistest ohne einen einzigen Fehltreffer). Eine hoehere Parallelitaet (25) fuehrte dagegen zu vereinzelten TMDb-Fehlantworten, die faelschlich als "nicht gefunden" gewertet wurden - Netzwerkabruf (parallel) und Datenbank-Schreiben (sequentiell, danach) laufen daher jetzt in getrennten Phasen.
v0.37.2 – 2026-09-12
`poster_color.average_color()` baute bei jedem einzelnen Aufruf einen komplett neuen `httpx.AsyncClient` auf (TLS-/DNS-Handshake), statt wie `tmdb.py`/`omdb.py` einen wiederverwendeten Client zu nutzen - im Normalbetrieb (einzelne Aufrufe beim Anlegen/Bearbeiten) nie aufgefallen, beim Trakt-Massenimport (`scripts/trakt_import_create.py`, hunderte Poster in Folge) aber ein durchgaengiger Kostenfaktor von ca. 4 Sekunden pro Titel (gemessen per Direktvergleich: neuer Client jedes Mal ~4.1s, wiederverwendeter Client nach dem ersten Aufruf ~0.1s). Auf denselben Wiederverwendungs-Client wie in den anderen beiden Modulen umgestellt.
v0.37.1 – 2026-09-12
Einmaliges Ergaenzungs-Skript `scripts/trakt_import_create.py`: legt fuer die von `trakt_import.py` erzeugte Kandidatenliste (Trakt-Titel ohne CineLog-Eintrag) automatisch vollstaendige Eintraege an - inklusive TMDb-Anreicherung (Poster, Handlung, Genres, Streaming-Anbieter, IMDb-Bewertung via OMDb) sowie my_rating/watched_at/view_count direkt aus den Trakt-Daten, ohne manuelles Nacherfassen. Ein vorheriger Bewertungsfilter ist nicht noetig: Eintraege unterhalb von RECOMMEND_THRESHOLD tauchen wie bei jedem anderen Import auch nur in der Suche auf, nicht auf der Startseite. Neuer Quelle-Wert `source="trakt"`.
Neues Label `"trakt": "Trakt"` in `SOURCE_LABELS` (models.py) fuer die Detailseiten-Anzeige der so importierten Titel.
v0.37.0 – 2026-09-12
Einmaliges Backfill-Skript `scripts/trakt_import.py`: gleicht die komplette Trakt.tv-Watch-Historie und -Bewertungen (per OAuth-Device-Code-Flow, kein Passwort-Handling im Skript) ueber die TMDb-ID mit der CineLog-Datenbank ab. Hintergrund: Plex-Verlauf hat Luecken bei Filmen/Serien, die zwischenzeitlich aus Plex geloescht wurden, waehrend Trakt (Jahre an per Webhook uebertragenen Sichtungen) die vollstaendigere Quelle ist. - Bestehende CineLog-Eintraege (Treffer per tmdb_id): view_count wird als Maximum aus beiden Quellen uebernommen (verhindert Doppelzaehlung von Plex->Trakt-Webhook-Events), watched_at je nach watch_status entweder als spaetestes (abgeschlossen/Filme) oder fruehestes (angefangene Serien) bekanntes Datum aktualisiert, my_rating nur befuellt wenn noch keine eigene Bewertung vorhanden ist. watch_status/watched_episodes/ total_episodes bleiben unangetastet (Plex-spezifische Felder). - Trakt-Titel ohne CineLog-Eintrag werden NICHT automatisch angelegt, sondern als Vorschlagsliste nach `/data/trakt_import_candidates.json` geschrieben - Aufnahme in die Bibliothek bleibt eine manuelle Entscheidung ueber die bestehende "Neu anlegen"-Suche. - Standardmodus ist ein Trockenlauf (zeigt alle geplanten Aenderungen, schreibt nichts); erst mit `--apply` werden die Aenderungen gespeichert. - Kein Teil des laufenden Docker-Images - wird bei Bedarf per `docker cp` in den Container kopiert und manuell ausgefuehrt, da es nur fuer die Dauer eines befristeten Trakt-VIP-Zugangs gebraucht wird.
v0.36.2 – 2026-09-12
Auf Mobile (unter `md`) waren die drei Kreis-Icons sichtbar tiefer positioniert als das Logo, optisch auf Höhe des Plex-Tickers. Ursache: Logo und Ticker standen im selben Flex-Container-Block wie die Icon-Gruppe; durch `items-center` wurde die 36px hohe Icon-Gruppe vertikal auf die volle Höhe von Logo+Ticker (ca. 60px) zentriert, statt bündig mit der Logo-Zeile abzuschließen (gemessen: Icon-Mitte bei 46px, Logo-Mitte bei 34px).
Header-Struktur so umgebaut, dass Logo und Icon-Gruppe auf Mobile in einem eigenen Row-Container stehen (`flex items-center justify-between`), komplett getrennt vom Ticker. Der Ticker läuft jetzt in einer eigenen Zeile darunter, die Suchleiste in einer dritten Zeile darunter. Auf Mobile trägt dabei keines der beiden Icon-Gruppen-Elemente eine `order`-Klasse mehr.
Für Desktop (ab `md`/768px) wird derselbe Row-Container per `md:contents` transparent geschaltet, sodass Logo-Spalte und Icon-Gruppe zu direkten Kindern der äußeren `md:flex-row`-Zeile werden; zusammen mit `md:order-2`/`md:order-3` auf Suche und Icons ergibt sich wieder exakt die bisherige einzeilige Desktop-Anordnung (Logo+Ticker · Suche zentriert · Pille "Verwaltung" + Logout + Theme). Der Ticker-Inhalt wurde dafür in ein Jinja-Macro ausgelagert und wird einmal für Mobile (eigene Zeile) und einmal für Desktop (unter dem Logo) gerendert, jeweils per `hidden md:block` / `md:hidden` ein-/ausgeblendet.
v0.36.1 – 2026-09-12
Die Header-Umstellung aus v0.36.0 hatte versehentlich auch das Desktop-Layout verändert (Suche + Ticker standen dort in einer eigenen zweiten Zeile statt wie gewohnt neben Logo und Icons in einer Zeile). Desktop-Struktur (ab `md`/768px) wieder exakt wie vor v0.36.0 hergestellt: eine Zeile mit Logo+Ticker, zentrierter Suche und rechts der Pille "Verwaltung" + An-/Abmelde- + Theme-Icon.
Das kompakte Mobile-Layout aus v0.36.0 (unter `md`: Zahnrad-Icon statt Text-Pille, Icons direkt neben dem Logo, Suche in eigener voller Zeile darunter) bleibt erhalten. Beide Ansichten werden jetzt konsistent über denselben Breakpoint (`md`, 768px) gesteuert - vorher lag die Layout-Umbruchgrenze bei `sm` (640px), während der Pille/Icon-Wechsel bei `md` (768px) lag, was zu einem kurzen inkonsistenten Zwischenzustand zwischen 640px und 768px führte.
v0.36.0 – 2026-09-12
Mobiler Header grundlegend gestrafft: Statt der bisherigen mehrzeiligen Anordnung (Logo, Ticker, Verwaltung+Icons, Suche jeweils in eigenen, teils umbrechenden Zeilen) gibt es jetzt eine feste zweizeilige Struktur, die für alle Bildschirmgrößen gilt: Zeile 1 = Logo links, die drei Kreis-Icons rechts (`flex items-center justify-between`); Zeile 2 = Plex-Status-Ticker und Suchleiste (auf Mobile untereinander, ab `sm`/640px nebeneinander). Spart auf dem Smartphone deutlich vertikalen Platz und verhindert das unschöne Umbrechen einzelner Elemente.
"Verwaltung" ist unterhalb `md` (768px) jetzt ein drittes rundes Icon (Zahnrad, `title="Verwaltung"`, führt zu `/admin`) statt der Text-Pille, passend zu den Icons für An-/Abmeldung und Theme-Wechsel. Ab `md` bleibt die bekannte Text-Pille erhalten.
Tailwinds `flex-1` (`flex: 1 1 0%`) setzt in einem `flex-col`-Kontext die Flex-Basis (= Starthöhe) auf 0 statt der Breite - der Ticker war dadurch beim ersten Umbau auf die neue zweizeilige Struktur auf Mobile unsichtbar (Höhe 0px trotz vorhandenem Inhalt). Behoben, indem `flex-1` beim Ticker nur noch ab `sm` greift (`sm:flex-1`); auf Mobile (Spalten-Layout) übernimmt die normale Blockhöhe.
v0.35.3 – 2026-09-12
Mobile Header-Anordnung optimiert: An-/Abmelde- und Theme-Icon rücken jetzt in die erste Zeile neben das Logo (dort war bisher ungenutzter Leerraum), die "Verwaltung"-Pille bekommt dafür eine eigene Zeile darunter. Umgesetzt rein über Flex-`order`-Klassen auf den bestehenden Elementen; die Desktop-Ansicht (ab `sm`/640px) bleibt unverändert einzeilig (Logo · Suche · Verwaltung · Icons). Getestet bei 375px und 360px sowie am Desktop.
v0.35.2 – 2026-09-12
Header-Überlappung in der mobilen Ansicht: die "Verwaltung"-Pille + An-/Abmelde- und Theme-Icons (`shrink-0`, seit v0.34.0/0.34.1 breiter als die vorherigen reinen Textlinks) passten auf schmalen Viewports nicht mehr neben das Logo, das aber selbst nicht umbricht/schrumpft (der Logo-Link ist `w-fit`) - statt sauber umzubrechen, lief der Text einfach über die zugewiesene Spalte hinaus und überlappte mit den Icons. Die Icon-Gruppe bekommt jetzt unterhalb `sm` (640px) eine eigene volle Zeile (`w-full`, rechtsbündig) statt neben dem Logo gequetscht zu werden - ab `sm` wieder wie gehabt in einer Zeile mit Logo und Suchfeld. Getestet bei 360px und 375px (keine Überlappung mehr) sowie am Desktop (unverändertes Layout).
v0.35.1 – 2026-09-12
Zwei neue Sortier-Optionen auf der Startseite: "Zuletzt gesehen: Neueste zuerst" und "... Älteste zuerst", basierend auf `watched_at` (dem aus Plex' `lastViewedAt` übernommenen Sichtungsdatum). Titel ohne Sichtungsdatum (z.B. manuell ohne Plex-Sync angelegt) landen bei beiden Richtungen konsequent am Ende der Liste (`nullslast()`) statt die Sortierung zu durchmischen.
v0.35.0 – 2026-09-12
Konsistente Zurück-Navigation auf allen Verwaltungsseiten, analog zum "← Zurück zur Übersicht"-Link auf den Detailseiten (gleiches Styling: dezent, `text-text-muted` mit `hover:text-accent-strong`): - "Liste exportieren", "Neu anlegen" und "... bearbeiten" bekommen "← Zurück zur Verwaltung" (Ziel: `/admin`). - Die Verwaltungs-Hauptseite selbst bekommt "← Zurück zur Übersicht" (Ziel: `/`).
v0.34.3 – 2026-09-12
Formular-Elemente in der Verwaltung ans Pillen-Design angeglichen: - "Liste exportieren": Dropdowns "Typ" und "Streaming-Anbieter" von `rounded-lg` auf `rounded-full`, Padding von `px-3` auf `px-4` (weiterhin `py-2`), plus `focus:border-accent` statt nativem Browser-Fokusring - identisch zum Vorgehen bei den Hauptseiten-Filtern (v0.34.2). - "Neu anlegen": Titel-Inputfelder (beide Formulare) und das Film/Serie-Dropdown ebenfalls auf `rounded-full` mit `px-4`, einheitlich `text-sm`. Die Buttons "Bei TMDb suchen" (bekam einen unsichtbaren `border-accent`-Rand in eigener Akzentfarbe) und "Manuell anlegen" passen dadurch jetzt exakt in Höhe (38px), Border-Radius und Grundlinie zu den danebenliegenden Inputs/ Dropdowns - per `getBoundingClientRect()` pixelgleich verifiziert.
v0.34.2 – 2026-09-12
Die drei Filter-Dropdowns (Sortierung, Genres, Anbieter) auf der Startseite von `rounded-lg` auf `rounded-full` umgestellt - passend zur Pillen-Optik von Suchfeld und "Verwaltung"-Button. Padding von `px-3` auf `px-4` erhöht, damit der Text bei der runden Form genug Abstand zum Rand behält (bei den `<select>`-Elementen bleibt die Pfeil-Seite unverändert bei 2rem).
Beim Fokussieren (Klick/Tastatur) zeigte v.a. "Alle Anbieter" einen abweichenden, dunklen nativen Browser-Fokusring statt des eigenen Rahmenstils. Alle drei Dropdowns nutzen jetzt `focus:border-accent` (den bereits an Hover-Zuständen verwendeten Akzentton) statt des nativen Outlines - per computed style verifiziert (Fokus-Randfarbe jetzt identisch zur Akzentfarbe statt browserabhängigem Dunkelton).
v0.34.1 – 2026-09-12
"Verwaltung"-Link im Header wirkte neben den beiden kreisrunden Icon-Buttons unpassend. Bekommt jetzt Pillen-Styling im Look des Suchfelds (`rounded-full border border-line bg-panel`) und exakt dieselbe Höhe wie die Icon-Buttons (36px, per `getBoundingClientRect()` bestätigt pixelgleich in Höhe und vertikaler Zentrierung).
v0.34.0 – 2026-09-12
An-/Abmeldung im Header von Textlinks auf Icon-Buttons umgestellt: "Anmelden" wird jetzt als Schlüssel-Symbol dargestellt, "Abmelden (Name)" als Logout-Symbol (Tür mit Pfeil) - beide exakt in Höhe, Padding und Rahmen-Styling an den benachbarten Theme-Toggle-Button angeglichen (36×36px, runder Rahmen). Tooltips (`title`) und `aria-label` zeigen weiterhin "Anmelden"/"Abmelden" beim Hover bzw. für Screenreader. Der "Verwaltung"-Textlink bleibt unverändert.
v0.33.5 – 2026-09-12
Änderungspunkte im Changelog (`/changelog`) wurden mitten im Satz abgeschnitten (z.B. "... beheben: die"). Ursache lag nicht im CSS (kein `truncate`/`overflow-hidden` im Template vorhanden), sondern im Parsing: CHANGELOG.md-Einträge sind im Rohtext zur Lesbarkeit weich umgebrochen (eingerückte Folgezeilen ohne führendes `- `), die bisherige Regex in `version.py` erfasste aber nur die erste physische Zeile. Folgezeilen werden jetzt wieder zu einem durchgehenden Text zusammengefügt - ein Bindestrich am Zeilenende OHNE vorangehendes Leerzeichen gehört zu einem zusammengesetzten Wort (z.B. "Show-" + "Knoten" → "Show-Knoten", kein Leerzeichen), einer MIT vorangehendem Leerzeichen ist ein eigenständiger Gedankenstrich (Leerzeichen bleibt erhalten) - geprüft gegen alle 135 Änderungspunkte der bisherigen Historie. `changelog.html` bekommt zusätzlich `whitespace-normal break-words` für lange, leerzeichenfreie Code-Schnipsel im Text.
v0.33.4 – 2026-09-11
Verbleibendes "Aufblitzen" beim Zurücknavigieren zur Übersicht behoben: per Navigation-Timing-API bestätigt, dass diese Navigation bei uns nicht aus dem bfcache bedient wird, sondern das Dokument komplett neu lädt - das Poster-Grid-Einblenden (IntersectionObserver, opacity 0→1 + translateY 10px→0, 0.5s) lief dadurch bei jedem Zurück-Klick erneut ab, obwohl der Nutzer das Grid Sekunden zuvor schon gesehen hatte. Ein früher `<head>`-Check (vor dem ersten Paint, analog zum Theme-Script) erkennt `performance.getEntriesByType('navigation')[0].type === "back_forward"` und setzt die Karten dann sofort in den Endzustand (keine Transition) - normale Erstladungen/Filterwechsel sind davon nicht betroffen, die Einblend-Animation bleibt dort erhalten. Das Theme-Script selbst war bereits FOUC-sicher (läuft synchron als allererstes `<head>`-Script) und ein echter Layout-Shift (CLS) lag nicht vor, da die Poster-Boxen bereits über `aspect-[2/3]` feste Maße haben - beides geprüft, kein weiterer Handlungsbedarf.
v0.33.3 – 2026-09-11
Wahrgenommenes "Doppelladen" beim Klick auf einen Titel behoben: die seit v0.20.8 aktive Speculation-Rules-Prefetch-Regel für `/media/*` feuerte bei jedem Klick ohne vorherigen Hover (Touch-Geräte haben gar keinen Hover-Zustand, auch schnelle Mausklicks) zusätzlich zur echten Navigation einen zweiten, realen Request an den Server - verifiziert über Server-Logs (2 echte Requests pro Detailseiten-Aufruf statt 1). Bei echtem Hover vor dem Klick wurde der Prefetch dagegen korrekt wiederverwendet (nur 1 Request) - das Risiko einer Verdopplung bei Touch/schnellen Klicks überwog den Geschwindigkeitsvorteil, die Regel wurde daher komplett entfernt.
v0.33.2 – 2026-09-11
Rewatch-Zähler bei Serien war irreführend: Plex' `viewCount` am Show-Knoten summiert alle Episoden-Views auf (z.B. 220 bei einer 22-Episoden-Serie nach einem einzigen Durchlauf statt "1×"). Für Serien wird `view_count` jetzt aus der MINIMALEN Wiedergabezahl aller Episoden berechnet - der ehrliche Flaschenhals, wie oft die Serie tatsächlich komplett durchgesehen wurde. Bei Filmen unverändert Plex' direktes `viewCount`.
Der Rewatch-Zusatz "(X× gesehen)" erscheint bei Serien ohnehin nur im Status "completed" (nie bei "in_progress") - das war bereits so umgesetzt und wurde nochmal gezielt verifiziert.
v0.33.1 – 2026-09-11
"Angefangen am ..." bei unvollständigen Serien zeigte fälschlich das Datum der ZULETZT gesehenen Folge (aus dem lastViewedAt der Serie/ neuesten Episode). Für in_progress-Serien wird jetzt stattdessen das Datum der ERSTEN gesehenen Folge verwendet (`first_viewed_at`, aus Plex' Episodenliste ermittelt) - bei komplett gesehenen Serien und Filmen bleibt weiterhin das Datum der letzten Sichtung maßgeblich.
v0.33.0 – 2026-09-11
Rewatch-Zähler aus Plex' `viewCount`: neue Spalte `view_count` (Default 1, da jeder DB-Eintrag mindestens einmal gesehen wurde). Wird beim Plex-Sync automatisch mitgepflegt.
Detailseite zeigt bei mehrfach gesehenen Titeln die Anzahl in Klammern an, z.B. "Zuletzt gesehen am 23.04.2024 (3× gesehen)" bzw. bei Serien "Zuletzt komplett gesehen am 10.01.2026 (2× gesehen)". Bei nur einmal gesehenen Titeln bleibt die Klammer weg.
"Gesehen am ..." heißt auf der Detailseite jetzt "Zuletzt gesehen am ..." (Filme) bzw. "Zuletzt komplett gesehen am ..." (Serien).
v0.32.0 – 2026-09-11
Serien unterscheiden jetzt zwischen komplett gesehen und angefangen: Plex liefert `viewedLeafCount`/`leafCount` (gesehene/gesamte Folgen) mit, daraus leitet der Sync `watch_status` ("completed"/"in_progress") plus den Episoden-Fortschritt ab. Detailseite zeigt entsprechend "Komplett gesehen am ..." bzw. "Angefangen am ... (12/48)" statt des bisherigen einheitlichen "Gesehen am ...". Bei Filmen unverändert.
Neue Felder `watch_status`, `watched_episodes`, `total_episodes` - Bestandseinträge bleiben bei NULL und zeigen weiter das bisherige schlichte "Gesehen am ...", bis der nächste Plex-Sync sie befüllt.
v0.31.0 – 2026-09-10
Die Verwaltung zeigt jetzt "Letzter Abgleich: <Datum/Uhrzeit> · <n> importiert/aktualisiert" unter den Aktionskacheln. Der Zeitpunkt wird als kleine JSON-Datei neben der DB persistiert und übersteht damit einen Server-Neustart/Deploy.
Gestaffeltes Auffrischen der IMDb-Bewertung statt "einmal geholt = eingefroren": Neue Titel (Erscheinungsjahr < 2 Jahre) werden alle 7 Tage neu abgefragt, ältere alle 30 - IMDb-Scores wandern vor allem bei frischen Titeln noch. Der wöchentliche Refresh arbeitet die Titel mit der ältesten/fehlenden Bewertung zuerst ab und deckelt die OMDb-Aufrufe bei 900/Lauf (Puffer unter dem 1.000er-Tageslimit).
Neues Feld `imdb_rating_updated_at`; bestehende Bewertungen wurden bei der Migration zufällig über die letzten 30 Tage "gealtert", damit nicht alle Titel gleichzeitig fällig werden.
OMDb-Anbindung merkt sich, wenn das Tageslimit gemeldet wurde, und macht bis Mitternacht keine weiteren Aufrufe - reaktiv statt mitzuzählen, übersteht damit auch einen Neustart am selben Tag.
v0.30.1 – 2026-09-09
Restzeit-Anzeige beim Plex-Abgleich sprang unruhig hin und her bzw. brach unschön um, weil sie in derselben Zeile am wechselnd langen Filmtitel hing. Titel (Zeile 1) bekommt jetzt eine feste `truncate`-Kürzung mit "...", die Restzeit steht auf einer eigenen, festen zweiten Zeile darunter ("Verbleibende Zeit: ca. X Min.") - bleibt dadurch an fester Position, unabhängig von der Titellänge.
v0.30.0 – 2026-09-09
Fortschrittsanzeige beim Plex-Abgleich (Verwaltung) zeigt jetzt eine geschätzte Restzeit ("noch ca. X Min."/"noch ca. X Sek."), linear aus bisher verstrichener Zeit und Ø Sekunden/Titel hochgerechnet.
Neuer "Abbrechen"-Button neben der Fortschrittsanzeige: setzt nur ein Flag, das der laufende Sync-Loop zwischen zwei Titeln prüft und sich dann sauber beendet - der gerade verarbeitete Titel wird noch fertig, danach stoppt der Lauf. Bereits synchronisierte Titel bleiben unverändert in der DB (kein Rollback), die UI springt zurück auf "Bereit".
v0.29.6 – 2026-09-09
Sync/Refresh (Plex-Abgleich, wöchentlicher Refresh, "TMDb erneut abrufen") war seit der IMDb-Anbindung spürbar langsam geworden (~20s pro Titel) - Ursache: OMDb beantwortete jeden Aufruf mit 8-9s (teils sogar über unserem 10s-Timeout), und wurde bisher bei jedem Sync erneut abgefragt, auch für längst gecachte Titel. Die IMDb-Bewertung wird jetzt nur noch abgefragt, wenn `imdb_rating` noch leer ist - bereits gecachte Titel überspringen den OMDb-Call komplett.
v0.29.5 – 2026-09-09
TMDb- und IMDb-Bewertungs-Pill auf der Detailseite hatten durch das vergrößerte TMDb-Logo unterschiedliche Höhen. Beide Pill-Container haben jetzt eine feste, identische Höhe (`h-8`), das TMDb-Logo wurde dafür leicht auf `h-5` (20px) verkleinert - beide Inhalte bleiben via `items-center` exakt vertikal zentriert.
v0.29.4 – 2026-09-09
TMDb-Logo im Bewertungs-Badge von `h-4` (16px) auf `h-6` (24px) vergrößert - wirkte im Vergleich zum breiteren IMDb-Logo optisch zu klein. Bleibt dank `items-center` am Pill-Container weiterhin exakt vertikal zentriert.
v0.29.3 – 2026-09-09
Nachgebautes TMDB-Logo im Bewertungs-Badge (inline SVG) durch das offizielle Logo als statische Bilddatei ersetzt (`static/img/tmdb-logo.png`) - bei 16px Höhe schärfer als die SVG-Nachbildung.
v0.29.2 – 2026-09-09
TMDB-Logo im Bewertungs-Badge auf der Detailseite entspricht jetzt dem offiziellen zweizeiligen Primary-Logo (oben "TM" in Hellgrün + blaue Pille, unten grüne Pille + "DB" in Blau) statt des vorherigen einzeiligen Farbverlaufs-Schriftzugs - quadratisch auf `h-4` skaliert.
Der TMDb-Wert wird jetzt als ganzzahliger Prozentwert angezeigt (z.B. "84%" statt "8.4"), passend zum offiziellen TMDb-Schema. IMDb und die eigene Bewertung bleiben unverändert auf der 10er-Skala.
v0.29.1 – 2026-09-09
TMDb-/IMDb-Bewertungs-Badges auf der Detailseite zeigen jetzt die echten Marken-Logos statt Emoji-Platzhaltern: das gelbe IMDb-Kästchen (#F5C518, schwarzer "IMDb"-Schriftzug) und der türkis-grüne TMDB-Farbverlaufs-Schriftzug, beide als inline-SVG auf `h-4` (16px) skaliert und mit `gap-1.5` direkt vor der jeweiligen Zahl platziert.
v0.29.0 – 2026-09-09
IMDb-Bewertung zusätzlich zur TMDb-Wertung: Die IMDb-ID kommt ohne zusätzlichen TMDb-Call direkt aus `append_to_response=external_ids` mit, die eigentliche Bewertung über die neue OMDb-Anbindung (`app/omdb.py`, `OMDB_API_KEY`). Wird wie die TMDb-Wertung als `imdb_rating` in der DB gecacht (Sync-/Refresh-Zeitpunkt) statt bei jedem Seitenaufruf neu abgefragt, und erscheint auf der Detailseite als eigenes Badge neben "🎬 TMDb". Ohne gesetzten `OMDB_API_KEY` bleibt das Badge einfach weg, keine Pflicht-Konfiguration.
v0.28.2 – 2026-09-09
Suche mit Anführungszeichen (z.B. `"Rambo"`) lieferte trotz entfernter Anführungszeichen weiterhin Fuzzy-Teiltreffer wie "Lammbock" oder "Guns Akimbo", da nur die Zeichen selbst gestrippt, aber kein eigener Suchmodus aktiviert wurde. Anführungszeichen schalten jetzt auf eine strikte, case-insensitive Teilstring-Suche ohne jedes Fuzzy-/Levenshtein-Scoring um - `"Rambo"` findet dadurch ausschließlich Titel, die "Rambo" tatsächlich im Namen tragen. Suchen ohne Anführungszeichen nutzen weiterhin ganz normal die tippfehler-tolerante Fuzzy-Suche.
v0.28.1 – 2026-09-09
Das Genre-Dropdown auf der Startseite schloss sich anders als die Sortierung/Anbieter-Dropdowns (native `<select>`-Elemente, vom Browser selbst bei Klick außerhalb geschlossen) nicht bei einem Klick außerhalb des Fensters - liegt am zugrundeliegenden `<details>`-Element, das dieses Verhalten nicht von Haus aus mitbringt. Ein Klick außerhalb schließt das Panel jetzt genauso wie bei den anderen beiden Dropdowns.
v0.28.0 – 2026-09-09
Dedup-Bug beim Plex-Sync: Ein noch unverknüpfter Titel-Fallback (per Namensvergleich) konnte auch bereits mit einer TMDb-ID verknüpfte Einträge treffen und deren Daten überschreiben. Dadurch fiel z.B. die Netflix-Realverfilmung "One Piece" (2023) beim Sync der gleichnamigen Anime-Serie (1999) unter den Tisch, weil beide denselben Titel tragen - nur der zuletzt synchronisierte Eintrag blieb übrig. Der Titel-Fallback greift jetzt ausschließlich noch bei Einträgen ohne TMDb-ID (echte, unverknüpfte manuelle Einträge); Eindeutigkeit wird zusätzlich durch einen Datenbank-Unique-Index auf (Typ, TMDb-ID) erzwungen.
TMDb-Import erkennt japanische Animationsproduktionen jetzt automatisch als eigenes Genre "Anime" statt "Animation" (Kriterium: Originalsprache Japanisch oder Herkunftsland Japan) - taucht dadurch als eigener Eintrag in den Genre-Filtern auf und lässt sich unabhängig von westlicher Animation (Pixar, Dreamworks, ...) filtern.
v0.27.2 – 2026-09-09
Der Status-Bereich im Header (Titel/Ticker links neben dem Logo) nutzt jetzt ein flexibles Layout (`flex-1`) statt einer festen Breite, sodass der Titel den gesamten verfügbaren Platz bis kurz vor das Suchfeld ausnutzt, bevor er mit "..." gekürzt wird.
Der Status-Text (z.B. "Schaut gerade: ...") zeigt jetzt beim Hovern per `title`-Attribut den vollständigen, ungekürzten Titel als Tooltip an.
v0.27.1 – 2026-09-09
Die Restspielzeit im Header-Status ("noch X Min.") wurde bei langen Titeln (z.B. "WWE WrestleMania 42 - Sunday...") hart abgeschnitten (z.B. "(noc"), weil die Kürzung bisher auf der ganzen Zeile statt gezielt nur auf dem Titel lag. Titel und Restzeit sind jetzt getrennte Elemente: der Titel bekommt eine saubere "..."-Kürzung, die Restzeit bleibt mit `shrink-0` immer vollständig sichtbar.
v0.27.0 – 2026-08-25
Suchbegriffe mit umschließenden Anführungszeichen (z.B. `"28 Years"`) wurden wörtlich mitgesucht und in der "Suche: ..."-Anzeige doppelt gerendert (`""28 Years""`). Anführungszeichen (gerade, typografisch, auch escaped) werden jetzt vor Suche und Anzeige entfernt.
Mehrwort-Suchen verlangen jetzt UND-Verknüpfung: Jedes eingegebene Wort muss für sich im Titel wiederzufinden sein, statt nur die Gesamt-Ähnlichkeit zum kompletten Suchbegriff zu bewerten. Das verhinderte bisher, dass kurze, inhaltlich irrelevante Titel (z.B. "Her") bei einer Suche wie "28 Years" auftauchten, nur weil die Gesamt-Fuzzy-Bewertung zufällig hoch genug war. Die Suche bleibt weiterhin auf den Titel beschränkt (nie die Handlung/Overview).
v0.26.2 – 2026-08-25
Das nach dem letzten Fix noch verbliebene "Flackern" beim Genre-Filtern war kein doppelter Request (per Network-Tab-Mitschnitt geprüft: jeder Klick löst zuverlässig genau eine Navigation aus) - sondern die View-Transition-Überblendung, die zwei stark unterschiedliche Poster-Grids ineinander crossfadet und dadurch wie ein doppeltes Laden aussieht. Die Überblendung wird jetzt gezielt nur noch bei echten Seitenwechseln (z.B. Übersicht → Detailseite) ausgeführt und bei reinen Filter-/Sortier-/Such-Navigationen auf derselben Seite übersprungen (`pageswap`-Event, Pfadvergleich).
v0.26.1 – 2026-08-25
Flackern/Springen der Filterleiste nach einem Genre-Klick behoben. Ursache: Die Navigation löste die View-Transition-Überblendung aus, während das Genre-Panel noch offen war - der Crossfade zwischen "Seite mit offenem Panel" und "neue Seite mit geschlossenem Panel" sah wie ein Sprung aus. Das Panel wird jetzt vor dem Navigieren per JS geschlossen. Zusätzlich `view-transition-name: none` auf der Filterleiste sowie eine Mindesthöhe gegen Layout-Shifts durch wechselnde Label-Textlängen ("Alle Genres" ↔ "Genres (n)"). Der Filter-Zustand (Icons, aktive Klassen) war schon vorher vollständig serverseitig gerendert, keine nachträgliche JS-Umschaltung nötig.
v0.26.0 – 2026-08-25
Genre-Filter hat jetzt einen 3-Zustände-Klick pro Genre: neutral → einschließen (grünes Häkchen) → ausschließen (rotes X) → wieder neutral. Beliebig viele Genres können gleichzeitig ein- oder ausgeschlossen werden, sauber und kompakt komma-getrennt in der URL (`?include=Drama,Action&exclude=Animation,Horror`). Das Dropdown bleibt eine schlichte, einspaltige Liste ohne Pills/Grid.
Fester Eintrag "Filter zurücksetzen" ganz oben in der Liste entfernt alle Markierungen auf einmal (Typ/Sortierung/Anbieter/Suche bleiben erhalten).
v0.25.1 – 2026-08-25
Genre-Filter auf ein klassisches Single-Select-Dropdown zurückgebaut (kein Multi-Select-Checkbox-Panel mehr, kein separater "Animes ausblenden"-Button) - Styling jetzt wieder identisch zu "Sortierung"/"Alle Anbieter". Der Ausschluss-Filter ist stattdessen als fester Eintrag "Ohne Animation / Anime" direkt unter "Alle Genres" im selben Dropdown integriert.
v0.25.0 – 2026-08-24
Genre-Filter auf der Startseite ist jetzt eine Mehrfachauswahl: ein Checkbox-Dropdown ("Genres (n)") ersetzt das bisherige Einzelauswahl-Dropdown, Titel werden gezeigt, wenn sie mindestens eines der gewählten Genres tragen. Wird sauber in der URL geführt (mehrere `genres=`-Parameter), lässt sich also als Lesezeichen speichern/teilen.
Direkter "Animes ausblenden"-Schalter neben den Filtern, blendet alle Titel mit dem Genre "Animation" sofort aus (`exclude_genre` in der URL). Nur sichtbar, wenn die Bibliothek Animation-Titel enthält.
Ein selbstgebauter `urlencode`-Jinja-Filter verhindert jetzt, dass Genre-/Anbieternamen mit "&" (z.B. "Action & Adventure") die Filter-URLs kaputt machen - Jinja2 bringt anders als Flask keinen solchen Filter von Haus aus mit.
v0.24.2 – 2026-08-24
Etwas mehr Abstand zwischen Logo und dem darunterliegenden Claim-/Status-Ticker (2px → 8px), damit der Text nicht mehr so dicht an der Logo-Unterkante klebt.
v0.24.1 – 2026-08-24
Der Header-Claim wurde am rechten Rand abgeschnitten (auf Höhe des "CineLOG"-Schriftzugs), weil die absolut positionierten Ticker-Zeilen ihrem Container keine Breite mehr meldeten und dieser sich auf die Logo-Breite zusammenzog. Der Ticker hat jetzt eine feste, ausreichend breite Mindestbreite (mobil/Desktop gestaffelt) - Claim und übliche Status-Texte passen vollständig, nur ungewöhnlich lange Titel werden weiterhin sauber mit "..." gekürzt.
v0.24.0 – 2026-08-23
Claim ("Meine Film- & Serienempfehlungen") unter dem Logo im Header. Läuft gerade etwas auf Plex oder wurde zuletzt etwas geschaut, wechselt die Zeile alle 6 Sekunden per sanftem CSS-Crossfade zwischen Claim und Live-Status - reine CSS-Animation (kein JS), feste Zeilenhöhe verhindert Layout-Sprünge, respektiert `prefers-reduced-motion` (zeigt dann beide Zeilen statisch untereinander statt zu animieren).
v0.23.2 – 2026-08-22
TMDb-Anfragen (Details, Anbieter, Empfehlungen, FSK) öffneten bislang pro Aufruf eine eigene, neue Verbindung - auf dem Produktivserver kostete allein der DNS-Lookup dafür ca. 4 Sekunden *pro Anfrage*. Ein voller Bibliotheks-Sync brauchte dadurch mehrere Stunden. `app/tmdb.py` nutzt jetzt einen wiederverwendeten HTTP-Client über die gesamte Prozesslaufzeit - Folgeanfragen dauern nur noch ~30-50ms. Ein kompletter Sync sollte dadurch statt Stunden nur noch wenige Minuten dauern.
v0.23.1 – 2026-08-22
TMDb-Bewertung steht jetzt direkt neben der eigenen Bewertungs-Pill (statt darunter im Fließtext) - als eigenes, kleineres Badge mit dezentem Hintergrund/Rand ("🎬 TMDb 8.1"), beide in einer aufgeräumten Zeile.
v0.23.0 – 2026-08-22
FSK-Altersfreigabe für Deutschland wird jetzt von TMDb abgerufen (Filme: release_dates-Zertifizierung, Serien: content_ratings) und als dezentes Badge in der Metadaten-Zeile der Detailseite angezeigt ("FSK 12" o.ä.). Fehlt ein deutsches Rating, bleibt die Anzeige ausgeblendet. Wie Streaming-Anbieter/Empfehlungen am Sync-/Anlage-Zeitpunkt gecacht.
Sichtbarer Fortschritt für den Plex-Abgleich in der Verwaltung: Der Import läuft jetzt im Hintergrund (blockiert nicht mehr die Anfrage), ein neuer `/api/sync-status`-Endpunkt liefert den aktuellen Stand, und die Verwaltungsseite zeigt einen Ladebalken mit "Synchronisiere X / Y: Titel..." sowie eine grüne Erfolgsmeldung nach Abschluss. Ein bereits laufender Abgleich wird auch beim erneuten Öffnen der Seite erkannt und weiter angezeigt; ein zweiter, sich überschneidender Lauf wird verhindert.
v0.22.0 – 2026-08-21
Neue Sektion "Ähnliche Titel" am Ende der Detailseite (unter der Handlung): bis zu 6 Empfehlungen von TMDb als Poster-Kacheln mit Titel und Jahr. Existiert ein empfohlener Titel bereits lokal in CineLOG, verlinkt die Kachel direkt auf dessen Detailseite; ansonsten öffnet sie extern auf TMDb (leicht abgedunkelt dargestellt).
Die Empfehlungen werden wie die Streaming-Anbieter am Sync-/Anlage-Zeitpunkt von TMDb geholt und gecacht (Anlage, Bearbeiten-Refresh, wöchentlicher Hintergrund-Job, Plex-Sync) statt live bei jedem Seitenaufruf - Live-Abrufe hatten früher schon einmal die Ladezeit spürbar erhöht (siehe watch_providers-Historie).
v0.21.4 – 2026-08-21
Titel, die in Plex bewertet, aber nie dort abgespielt wurden (z.B. weil schon vorher anderswo gesehen), zeigten fälschlich den Sync-/ Import-Zeitpunkt als "Gesehen am" an. `watched_at` wird jetzt nur noch gesetzt, wenn Plex ein echtes `lastViewedAt` liefert - sonst bleibt es leer und die Anzeige blendet sich aus. Ein erneutes "Aus Plex importieren" bereinigt auch schon vorhandene Alt-Einträge mit dem falschen Sync-Datum.
v0.21.3 – 2026-08-21
"Gesehen am" (`watched_at`) übernahm bei Serien bislang das `lastViewedAt` der Show selbst, das nicht zuverlässig das tatsächliche Sichtungsdatum widerspiegelt. Der Plex-Sync liest jetzt bei Serien das `lastViewedAt` der zuletzt gesehenen Episode direkt aus (`/allLeaves`), bei Filmen weiterhin vom Film-Objekt selbst. Ein erneutes "Aus Plex importieren" überschreibt `watched_at` bestehender Einträge mit dem korrekten historischen Datum.
v0.21.2 – 2026-08-21
Zitat-Kachel für "Meine Meinung" optisch aufgewertet: dezent gold/beige getönter Hintergrund, abgerundete rechte Ecken, mehr Innenabstand - wirkt jetzt wie eine eigene Feedback-Kachel statt reinem Blockzitat-Strich.
Ist noch kein Kommentar vorhanden, öffnet sich das Eingabefeld direkt (statt "Noch kein Kommentar." anzuzeigen); sobald ein Kommentar existiert bzw. gespeichert wurde, erscheint automatisch der Lese-Modus mit der Zitat-Kachel. Das Edit-Icon bleibt in beiden Fällen zum Umschalten verfügbar.
v0.21.1 – 2026-08-21
"Meine Meinung" auf der Detailseite zeigt jetzt standardmäßig einen sauberen Lese-Modus (Blockquote, kein sichtbares Textfeld). Ein dezentes Edit-Icon neben der Überschrift (nur für eingeloggte Nutzer) schaltet in den Bearbeiten-Modus um; nach dem Speichern springt die Ansicht automatisch zurück in den Lese-Modus.
v0.21.0 – 2026-08-18
Nach dem Speichern über die Bearbeiten-Maske geht es jetzt zurück zur Detailseite des Eintrags statt zur Verwaltungsübersicht.
Plex-Sync übernimmt für "Gesehen am" jetzt das echte `lastViewedAt`-Datum aus Plex, statt den Sync-/Import-Zeitpunkt zu verwenden (Fallback bleibt bestehen, falls Plex kein Wiedergabedatum liefert).
Bewertungskommentar ("Meine Meinung") lässt sich für eingeloggte Nutzer jetzt direkt auf der Detailseite bearbeiten und speichern, ohne über die Bearbeiten-Maske zu müssen.
"Gesehen am"-Datum wird (falls vorhanden) dezent in den Metadaten der Detailseite angezeigt.
v0.20.8 – 2026-08-17
Sanfte Seitenübergänge zwischen Übersicht und Detailseiten über die browsernative Cross-Document View Transitions API (reines CSS, kein eigener Client-Router - Chromium-Browser überblenden automatisch, andere ignorieren es folgenlos). Respektiert `prefers-reduced-motion`.
Prefetching für Detailseiten-Links (`/media/*`) über die Speculation-Rules-API, damit der Wechsel bei Klick spürbar schneller wirkt.
v0.20.7 – 2026-08-17
Beschriftungen der Bewertungs-Badges auf der Detailseite angepasst: 8.0 "Empfehlenswert", 9.0 "Highlight", 10.0 "Meisterwerk".
v0.20.6 – 2026-08-17
"Liste exportieren" erzeugte keine Ausgabe mehr, wenn weder ein Genre noch ein Anbieter ausgewählt wurde, obwohl das Formular "leer = alle" verspricht. Betraf nicht nur die aktuelle Version, sondern bestand schon länger. Ohne Auswahl wird jetzt eine einzelne Gruppe mit allen empfohlenen Titeln erzeugt.
Neue Checkbox "Nur mit 10 Sternen bewertete Titel" im Export-Formular, um die Liste auf absolute Top-Empfehlungen einzuschränken.
v0.20.5 – 2026-08-17
Formatierung des "Schaut gerade"-Status im Header überarbeitet: Restlaufzeit steht jetzt in Klammern am Ende ("Ted Lasso · S04E02 (noch 37 Min.)"). Titel/Episode sind optisch hervorgehoben (fett), Prefix und Restzeit-Klammer bleiben in der blasseren Sekundärfarbe.
v0.20.4 – 2026-08-16
"Schaut gerade"-Anzeige im Header zeigt jetzt zusätzlich die verbleibende Restspieldauer (z.B. "noch 23 Min."), berechnet aus Plex' `duration`/`viewOffset` der laufenden Session.
v0.20.3 – 2026-08-16
Umami-Tracking-Script wird jetzt nur noch geladen, wenn die Seite tatsächlich unter `cinelog.nifflheim.de` läuft (Hostname-Check). Verhindert Fehl-Tracking durch lokale Datei-/Template-Vorschauen oder Tests gegen `localhost`.
v0.20.2 – 2026-08-16
Umami-Tracking-Script eingebunden (eigene, bereits laufende Umami-Instanz unter stats.nifflheim.de) für einen datenschutz-freundlichen Seitenaufrufszähler. Eigene Besuche lassen sich pro Browser über `localStorage.setItem('umami.disabled', 1)` in der Entwicklerkonsole ausschließen.
v0.20.1 – 2026-08-16
Open-Graph-Meta-Tags im `<head>` für Link-Vorschauen (z.B. beim Teilen in Chats): `og:title`, `description`/`og:description`, `og:image` (Logo) und `og:url`.
v0.20.0 – 2026-08-16
Verwaltung (`/admin`) ist jetzt ein reines Dashboard: die lange Liste aller Filme/Serien mit Bearbeiten-Links wurde entfernt, stattdessen gibt es drei klare Kacheln ("Aus Plex importieren", "Liste exportieren", "+ Neu anlegen"). Einzelne Einträge werden weiterhin über den "Bearbeiten"-Link auf der jeweiligen Detailseite angepasst.
v0.19.4 – 2026-08-16
Status-Indikator im Header: "Schaut gerade" zeigt jetzt einen grünen, sanft pulsierenden Punkt vor dem Text; "Zuletzt geschaut" zeigt an derselben Stelle einen ruhenden grauen Punkt gleicher Größe, damit kein Layout-Shift zwischen beiden Zuständen entsteht.
v0.19.3 – 2026-08-16
Header-Navigation überarbeitet: Der Link "Übersicht" wurde entfernt (Logo und Schriftzug verlinken bereits zur Startseite).
"Anmelden" ist jetzt oben rechts im Header sichtbar, wenn niemand eingeloggt ist (statt nur im Footer); eingeloggt zeigt der Header wie bisher "Verwaltung" und "Abmelden (Name)".
Header-Layout auf ein klares Drei-Zonen-Schema umgestellt: Logo links, Suche mittig, Konto-Aktionen und Design-Umschalter rechts.
v0.19.2 – 2026-08-16
Suchfeld im Header leert sich jetzt automatisch: beim Klick auf ein Ergebnis in der Live-Vorschlagsliste, beim Klick woanders auf die Seite, oder mit Escape.
v0.19.1 – 2026-08-16
Kleine Poster-Thumbnails (30×45px) in der Live-Suche-Vorschlagsliste.
Bewertung in der Vorschlagsliste farblich hervorgehoben: Gold ab der Empfehlungsschwelle (8+), gedämpftes Grau darunter - auf einen Blick erkennbar, ob ein Treffer ein Top-Titel ist.
v0.19.0 – 2026-08-16
Live-Suche im Header: Vorschlagsliste erscheint beim Tippen (debounced, `/api/search`), tippfehler-tolerant (rapidfuzz, neue Abhängigkeit) statt reinem Substring-Abgleich - findet z.B. "Avatar" bei Eingabe von "Avtar".
Volle Ergebnisseite (Enter) nutzt dieselbe Fuzzy-Suche und sortiert bei aktiver Suche standardmäßig nach Relevanz statt "Zuletzt hinzugefügt", damit der beste Treffer immer oben steht. Manuell umstellbar über eine neue "Relevanz"-Sortieroption.
v0.18.0 – 2026-08-15
Alle bewerteten Filme/Serien werden jetzt importiert, nicht nur ab der Empfehlungsschwelle - Titel darunter sind aber nur über die Suche zu finden, nicht auf der Startseite. Neuer `RECOMMEND_THRESHOLD` (8) getrennt vom `PLEX_RATING_THRESHOLD` (jetzt 0.5, steuert nur noch den Import).
Zwei neue Badge-Stufen für Titel unter der Schwelle: 7.0–7.9 gedämpftes Grau, darunter dezentes Rot - beide klar von den Empfehlungs-Badges (Gold/Bordeaux) unterscheidbar.
Hinweis-Banner auf der Detailseite bei Titeln unter der Schwelle.
Randomizer und Export bleiben bewusst auf echte Empfehlungen beschränkt, auch bei aktiver Suche.
v0.17.0 – 2026-08-15
"Schaut gerade"/"Zuletzt geschaut"-Badge im Header, öffentlich sichtbar (Plex `/status/sessions` bzw. `/status/sessions/history/all`). Wird von einem neuen 60-Sekunden-Hintergrund-Job zwischengespeichert statt live pro Seitenaufruf abgefragt (gleiche Lektion wie beim Streaming-Anbieter-Fix in v0.11.1 - ein Live-Abruf hätte die Ladezeit wieder hochgetrieben).
v0.16.0 – 2026-08-15
Freigestelltes Logo im Header, links neben dem "CineLOG"-Schriftzug, vertikal zentriert, beides gemeinsam als ein Link zur Startseite.
v0.15.0 – 2026-08-11
Titelsuche im Header (`/?q=...`, kombinierbar mit Typ/Genre/Anbieter/ Sortierung, kein JS nötig - normales Formular).
Randomizer-Button (Würfel-Icon) neben Alle/Filme/Serien: springt zu einem zufälligen Titel aus der aktuell gefilterten Auswahl.
Sanftes Fade-In der Poster-Karten beim Scrollen (IntersectionObserver), respektiert `prefers-reduced-motion`. Poster laden jetzt zusätzlich nativ lazy (`loading="lazy"`).
v0.14.0 – 2026-08-11
TMDb-Bewertung dezent unter der eigenen Bewertung auf der Detailseite ("TMDb 7.6") - kommt kostenlos aus den ohnehin schon abgerufenen TMDb-Daten, kein neuer Dienst nötig. IMDb/Rotten Tomatoes bewusst noch nicht dabei (brauchen einen separaten Drittanbieter, z.B. OMDb API).
v0.13.4 – 2026-08-11
Export-Links zeigen jetzt direkt auf die TMDb-"Wo ansehen?"-Unterseite (`/watch?locale=DE`) statt auf die allgemeine Titelseite - spart einen Klick, da genau das der Zweck der Verlinkung ist.
v0.13.3 – 2026-08-11
Eine Bewertung einer einzelnen Plex-Staffel (statt der ganzen Serie) hat einen falschen Eintrag erzeugt: die Staffel-GUID wurde fälschlich als Serien-TMDb-ID interpretiert und landete bei einer völlig anderen, zufällig passenden Serie. Bewertungen von Staffeln/Episoden werden jetzt erkannt und ignoriert, statt einen falschen Eintrag anzulegen.
v0.13.2 – 2026-08-11
Anbieter-Filter alphabetisch sortiert statt nach Relevanz.
v0.13.1 – 2026-08-11
Anbieter-Filter (Startseite + Export) zeigt jetzt nur noch eine kuratierte Liste (Netflix, Disney Plus, Amazon Prime Video, HBO Max, Crunchyroll, WOW, Apple TV) statt aller ~30 TMDb/JustWatch-Rohnamen (die u.a. jedes "XY Amazon Channel"-Zusatzabo und jede Werbe-Tarifstufe separat auflisten). Varianten wie "Netflix Standard with Ads" oder "HBO Max Amazon Channel" zählen automatisch zum jeweiligen Haupt-Anbieter.
v0.13.0 – 2026-08-11
Wöchentlicher Hintergrund-Job (sonntags 3 Uhr, Europe/Berlin), der alle Titel automatisch neu von TMDb abruft (Handlung/Genres/Poster/Status/ Streaming-Anbieter) - hält u.a. auslaufende Streaming-Lizenzen aktuell, ohne dass ein neuer Plex-Sync-Anlass nötig ist. Neue Abhängigkeit: APScheduler.
Manueller "TMDb erneut abrufen"-Button nutzt jetzt dieselbe Logik wie der neue Hintergrund-Job (app/sync.py), keine doppelte Implementierung mehr.
v0.12.0 – 2026-08-11
Filter nach Streaming-Anbieter (z.B. Netflix) auf der Startseite und im Export - nutzt die bereits gecachten TMDb/JustWatch-Daten, keine neue externe Abfrage nötig. Im Export auch ohne Genre-Auswahl nutzbar ("alles auf Netflix").
v0.11.1 – 2026-08-11
Detailseite rief die Streaming-Anbieter bei jedem Seitenaufruf live bei TMDb ab (~4,5s Ladezeit). Wird jetzt wie alle anderen TMDb-Daten beim Sync (Plex-Webhook, Backfill, manueller Refresh, Neuanlage) in der DB gecacht und nur noch von dort gelesen (~0,1s).
v0.11.0 – 2026-08-11
Detailseite zeigt jetzt "Wo ansehen?" mit den deutschen Streaming-Anbietern (TMDb watch/providers-API, Daten von JustWatch, inkl. Attribution) - bevorzugt Abo-Anbieter (Streaming), sonst Leihen/Kaufen.
v0.10.2 – 2026-08-10
Favicon (Browser-Tab-Icon) ergänzt.
v0.10.1 – 2026-08-10
Klick auf die formatierte Export-Ansicht markiert jetzt ebenfalls alles (wie schon bei der Markdown-Ansicht) - ein Klick direkt auf einen Titel-Link öffnet stattdessen wie gewohnt TMDb.
v0.10.0 – 2026-08-10
Export-Liste zeigt jetzt standardmäßig eine gerenderte Ansicht mit echten Links/Fettschrift statt reinem Text - beim Kopieren des gerenderten Ergebnisses überträgt der Browser die echte Formatierung, was Foren ohne Markdown-Unterstützung wie GuteFrage direkt übernehmen. Umschalter auf reines Markdown für Plattformen, die es selbst darstellen (Reddit, Discord, GitHub, ...).
v0.9.1 – 2026-08-10
Export-Liste nutzt jetzt reinen Text statt Markdown - Foren wie GuteFrage rendern `[Text](URL)` nicht, zeigen es als Rohtext an, während eine nackte URL automatisch verlinkt wird.
v0.9.0 – 2026-08-10
„Liste exportieren" in der Verwaltung: Genres auswählen (Mehrfachauswahl) und eine fertige Markdown-Liste erzeugen (Titel verlinkt zur TMDb-Seite, die auch die deutschen Streaming-Anbieter zeigt) - zum Reinkopieren in Foren/Communities bei Empfehlungsfragen.
v0.8.1 – 2026-08-10
Filme mit mehreren Plex-Editionen (z.B. Normal + IMAX) landeten als Duplikate in CineLOG, da der Abgleich weitere Editionen desselben Films nicht erkannt hat. Wird jetzt über die TMDb-ID zusammengeführt statt dupliziert; bereits entstandene Duplikate wurden bereinigt.
v0.8.0 – 2026-08-10
Schwellwert für automatische Plex-Übernahme von 9 auf **8** gesenkt (passend zur eigenen Bewertungsskala: ab 8 = "würde ich empfehlen").
Drei visuelle Bewertungsstufen statt nur einer Sonderfarbe für 10.0: 8.0–8.9 wie bisher (hohler Stern, dezenter Umriss), 9.0–9.9 jetzt mit gefülltem Stern auf kräftigem Gold ("einer meiner Lieblinge"), 10.0 weiterhin Bordeaux, jetzt zusätzlich etwas größer als die anderen Stufen.
Der experimentelle "Kino"-Modus ersetzt jetzt den bisherigen Dunkel-Modus (gefiel besser) - zurück auf drei Modi (Hell/Dunkel/Automatisch), der bisherige Dunkel-Look ist komplett entfernt.
Ein im Browser gespeicherter, nicht mehr existierender Theme-Modus (z.B. "cinema" nach dieser Umstellung) führte zu einem kaputten Toggle-Icon ("undefined"). Unbekannte gespeicherte Werte fallen jetzt sauber auf "Automatisch" zurück.
v0.6.1 – 2026-08-10
`poster_color` wurde beim Plex-Sync nur neu berechnet, wenn sich der Poster-Pfad selbst geändert hat - dadurch blieb es beim Backfill für alle Bestandstitel leer (Pfad ändert sich beim erneuten Sync ja nicht). Wird jetzt auch nachgezogen, wenn es schlicht noch fehlt.
v0.6.0 – 2026-08-10
Detailseite: sehr dezenter, aus der Durchschnittsfarbe des Posters berechneter Verlauf hinter dem Inhalt (neue Abhängigkeit: Pillow).
Dritter Design-Modus "Kino" (sehr dunkles Anthrazit + warmes Gold), über den Theme-Toggle erreichbar (Zyklus: Hell → Dunkel → Kino → Automatisch).
NEU-Badge kleiner und dezenter (Punkt + Outline statt vollem Farbblock).
v0.5.0 – 2026-08-10
Visuelles Feintuning: gedeckteres Gold statt kräftigem Gelb, echte Serifenschrift für Logo/Überschriften (vorher nie geladene Fonts durch einen funktionierenden Serifen-Fallback ersetzt).
10.0-Bewertungen heben sich jetzt farblich ab (neue Bordeaux-Akzentfarbe, gefüllter Stern statt normalem Rating-Badge) - "das ist eine absolute Empfehlung", nicht nur eine weitere gute Bewertung.
Poster-Karten mit dezentem Schatten + leichtem Hover-Lift statt der vorherigen Abdunklung.
Filter-Buttons (Alle/Filme/Serien) ruhiger: nur die aktive Auswahl ist eine gefüllte Fläche, der Rest reiner Text ohne Umrandung.
Logo-Wortmarke "CineLOG" mit fetterem "LOG"-Teil.
v0.4.2 – 2026-08-10
NEU-Badge zeigt jetzt 7 statt 14 Tage.
Titel aus dem Plex-Bulk-Import (jetzt und künftig) zeigen kein NEU-Badge mehr - ein Backfill-Treffer ist keine frische Entdeckung, sondern nur neu in CineLOG. Bereits vorhandene Einträge wurden beim Update rückwirkend umgestellt.
v0.4.1 – 2026-08-10
"Zurück zur Übersicht" auf der Detailseite behält jetzt Sortierung/Filter bei (nutzt Browser-History statt fest auf "/" zu verlinken).
Serien zeigen jetzt an, ob sie abgeschlossen sind oder noch laufen (von TMDb übernommen, in der Verwaltung auch manuell überschreibbar).
v0.3.1 – 2026-08-10
Anzahl der Filme/Serien wird auf der Startseite angezeigt.
Eine spätere, niedrigere Neubewertung eines bereits importierten Titels in Plex (z.B. nach nochmaligem Ansehen) wurde ignoriert, sobald sie unter den Schwellwert fiel - der alte, zu hohe Wert blieb stehen. Bereits getrackte Titel werden jetzt bei jeder Neubewertung aktualisiert.
v0.3.0 – 2026-08-10
„Aus Plex importieren"-Button in der Verwaltung: durchsucht einmalig die komplette Plex-Bibliothek nach bereits vergebenen Bewertungen ≥ Schwellwert (auch solche von vor dem Einrichten des Webhooks) und importiert sie.
Dabei werden bereits manuell angelegte Einträge (gleiche TMDb-ID oder gleicher Titel) automatisch mit dem Plex-Treffer verknüpft statt dupliziert - persönliche "Meine Meinung"-Texte bleiben erhalten.
v0.2.0 – 2026-08-10
Sortierung in der Übersicht: Zuletzt hinzugefügt, Erscheinungsjahr (neueste/älteste zuerst), Meine Bewertung, Titel A–Z/Z–A.
„NEU"-Badge auf Karten, die in den letzten 14 Tagen hinzugefügt wurden.
Neues Feld „Meine Meinung" (warum empfiehlst du das?), auf der Detailseite getrennt von der TMDb-Handlung dargestellt.
v0.1.1 – 2026-08-10
Nicht erreichbarer Plex-/TMDb-Server (z.B. Netzwerkfehler) ließ den Webhook-Endpunkt mit 500 abstürzen statt sauber zu antworten.
v0.1.0 – 2026-08-10
Erste Version: öffentliche Präsentationsseite für Lieblingsfilme/-serien (Poster-Grid, Filter nach Typ/Genre, Detailseite mit Handlung).
Manuelle Verwaltung (Login-geschützt): Titel per TMDb-Suche übernehmen oder ganz manuell anlegen, Bewertung/Genres/Handlung frei editierbar.
Plex-Webhook (`/webhook/plex`): Bewertungen ab einem konfigurierbaren Schwellwert (Standard 9/10) werden automatisch übernommen, inkl. Handlung und Genres von TMDb über die TMDb-ID aus den Plex-GUIDs.