update
This commit is contained in:
94
README.md
94
README.md
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user