This commit is contained in:
team3
2026-08-29 11:28:25 +02:00
parent 38d5a8cfae
commit f5aeaadc42
20 changed files with 1934 additions and 184 deletions

View File

@@ -1,10 +1,12 @@
# Horrorfilme
# Filmabend
Privater Katalog-Browser mit zwei Reitern:
Privater Katalog-Browser für den wöchentlichen Filmabend. Vier Reiter:
- **Netflix** — alle Horrorfilme im Netflix-DE-Abo, aktuell 325.
- **Kanon** — 194 Einträge aus anerkannten Bestenlisten, davon 28 Filmreihen.
Zusammen 320 Filme, unabhängig davon, wo sie laufen.
- **Netflix** — alles im Netflix-DE-Abo ab 50 Stimmen, aktuell 2567 Filme.
- **Kanon** — 194 Einträge aus Horror-Bestenlisten, davon 28 Filmreihen.
Zusammen 319 Filme, unabhängig davon, wo sie laufen.
- **Suche** — freie TMDB-Suche für alles, was in keinem der beiden steht.
- **Rad** — Glücksrad über die eingereichten Vorschläge.
Daten kommen von TMDB (Provider-Info stammt dort aus der JustWatch-Partnerschaft).
Die deutschen Teaser schreibt MiniMax M3 beim Sync und landen in der SQLite-Datei.
@@ -81,6 +83,8 @@ FastAPI /api/movies ──► Vue-Grid, Detail-Overlay
| `GET /api/movies` | ganzer Katalog, das Frontend filtert clientseitig |
| `GET /api/movies/{id}` | einzelner Film |
| `GET /api/status` | Anzahl Filme, letzter Sync, läuft gerade einer |
| `GET /api/search?q=` | freie TMDB-Suche, nicht auf den Katalog beschränkt |
| `GET /api/search/{id}` | volle Daten, erst aus dem Katalog, sonst von TMDB |
| `GET /api/health` | für den Docker-Healthcheck |
| `POST /api/sync` | Sync von Hand anstoßen |
@@ -90,8 +94,63 @@ Gehört ein Film zu einer Reihe, zeigt die Detailansicht die anderen Teile —
aber nur die, die selbst auf Netflix liegen. Grundlage ist TMDBs
`belongs_to_collection`. Ein Klick springt direkt zum nächsten Teil.
Aktuell haben 86 Filme eine Reihe, 24 Reihen sind mit mehr als einem Teil
vertreten. Die größte ist Resident Evil mit fünf Filmen.
Im Raster stehen Reihen als eine Karte, die durch ihre Teile blättert. Aus
2567 Netflix-Kacheln werden so 2369 — Herr der Ringe belegt eine statt drei.
Die Karte startet beim bestbewerteten Teil, danach richtet sich auch ihr
Platz im Raster.
## Vorschläge und Rad
Im Reiter **Rad** landen die Filmvorschläge. Jede Sitzung darf einen Film
vorschlagen — erkannt über ein Cookie, ohne Anmeldung. Ein zweiter Vorschlag
ersetzt den ersten, statt abgelehnt zu werden.
Vorgeschlagen wird aus der Detailansicht heraus, mit optionalem Namen. Das
klappt auch mit Filmen aus dem Suche-Reiter, die gar nicht im Katalog stehen:
Titel, Jahr und Poster werden beim Vorschlagen mitgespeichert.
Das Rad verteilt die Vorschläge auf gleich große Segmente und dreht fünf bis
sieben Runden. Der Zeiger steht oben; das Ziel wird ausgelost und die Drehung
so berechnet, dass die Segmentmitte dort landet.
**Gedreht wird für alle gleichzeitig.** Die Ziehung passiert im Server, nicht
im Browser — sonst sähe jede Seite ein anderes Ergebnis. Wer auf „Drehen"
klickt, stößt nur an; das Ergebnis samt Zielwinkel geht per Server-Sent Events
an alle offenen Seiten. Neue Vorschläge kommen auf demselben Weg an.
Wer die Seite mitten im Dreh lädt, fragt `GET /api/spin` und steigt in die
Restanimation ein. Ist der Dreh schon durch, springt das Rad ohne Animation
auf die Endstellung — sonst zeigte der Zeiger woanders hin als die
Gewinnerkarte.
Die Abonnenten liegen im Speicher des Prozesses. Das trägt genau so weit wie
ein einzelner uvicorn-Worker; bei mehreren bekäme jeder nur seine eigenen.
| Endpoint | Zweck |
| --- | --- |
| `GET /api/suggestions` | alle Vorschläge, plus die eigene ID |
| `POST /api/suggestions` | vorschlagen oder ersetzen |
| `DELETE /api/suggestions` | eigenen Vorschlag zurückziehen |
| `GET /api/events` | Live-Kanal (SSE) für Dreh und Vorschläge |
| `POST /api/spin` | Dreh für alle auslösen |
| `GET /api/spin` | laufenden oder letzten Dreh abfragen |
## Die Filterleiste
Rechts am Fensterrand, fest stehend. Von oben nach unten:
- Suche und Sortierung
- Vier Bereichsregler: Bewertungen, Dauer, Jahr, Bewertung. Die Skalen kommen
aus dem offenen Reiter und wechseln beim Umschalten mit. Bei den Stimmen ist
die Skala gestaucht — linear säßen fast alle Filme im linken Prozent.
- Genres zum Zeigen und zum Ausblenden, je als Badge-Gruppe mit "alle"
Eingeschlossene Genres wirken als ODER. Ein Ausschluss sticht immer: Ein
Actionfilm mit Komödie fliegt raus, wenn Komödie ausgeblendet ist.
Ein früherer Versuch mit acht Subgenres (Geister, Zombies, Slasher …) ist
wieder raus. TMDBs Schlagwörter reichten dafür nicht: 77 Filme hatten gar
keine, der Rest nur allgemeine wie "supernatural horror".
## Der Kanon-Reiter
@@ -129,7 +188,7 @@ stillschweigend. Filme ohne ID versucht der nächste Sync erneut.
Hat ein Film mehrere IDs, gewinnt die erste. Godzilla Minus One liegt bei
Netflix in Farbe und in Schwarzweiß.
## Warum der Katalog bei drei Stimmen abschneidet
## Warum der Katalog bei 50 Stimmen abschneidet
JustWatch ordnet unbekannte Titel gelegentlich der Netflix-ID eines
gleichnamigen bekannten Films zu. TMDB übernimmt das ungeprüft. Der Film
@@ -147,23 +206,28 @@ Nachgewiesen an fünf Fällen, alle nach demselben Muster:
Nachweis über TMDBs Watch-Seiten: Dort steht die Netflix-ID im
Weiterleitungslink. Zwei Filme mit derselben ID können nicht beide stimmen.
Oberhalb von zwei Stimmen trat kein einziger Fall auf, deshalb die Grenze
bei drei. Das kostet 11 Einträge von 336.
Oberhalb von zwei Stimmen trat kein einziger Fall auf. Die Grenze liegt
inzwischen bei 50 Stimmen, weil der Katalog alle Genres umfasst — das hält
die Fehlzuordnungen ohnehin draußen.
## Grenzen
- Verfügbarkeit hinkt Netflix 24–48 h hinterher. So oft liefert JustWatch an TMDB.
- Es gibt keine Info, ob ein Film deutsche Synchronisation hat. TMDB kennt nur
die Originalsprache, nicht die Tonspuren bei Netflix.
- Der Netflix-Knopf führt bei 310 von 325 Filmen direkt auf die Titelseite.
Die restlichen 15 landen auf TMDBs Watch-Seite, weil dort kein Netflix-Link
hinterlegt ist. Der nächste Sync versucht sie erneut.
- Der Netflix-Knopf führt bei 730 von 2567 Filmen direkt auf die Titelseite.
Der Rest landet auf TMDBs Watch-Seite, von dort ist es ein Klick weiter.
Pro Sync kommen 250 dazu, meistgesehene zuerst — mehr auf einmal drosselt
TMDB.
- Die Szenenbilder sind TMDB-Backdrops. Der Sync wirft Duplikate raus, indem
er die Bilder selbst vergleicht (dHash plus Farbhistogramm, siehe
`app/imagehash.py`). Motive mit Titeltext fliegen ganz raus. Werbemotive
ohne Text bleiben drin — die lassen sich nicht von Szenenfotos trennen.
- 15 Filme haben gar keine Bilder, 46 keinen Trailer. Dann zeigt die
Detailansicht entsprechend weniger.
- Neun Filme haben gar keine Bilder. Dann zeigt die Detailansicht weniger.
- Der Teaser-Ton richtet sich nach dem Genre. Horror, Thriller, Mystery und
Krimi bleiben reißerisch, alles andere bekommt die Anweisung, den Ton des
Films zu treffen. Vorher wurde aus einer Bollywood-Romanze ein Dorf mit
verschlingenden Almwiesen.
## Attribution