Jellyfin-Abgleich: unbekannte Titel aus TMDB nachladen statt zu überspringen #16
Notifications
Total Time Spent: 14 minutes
florian.wilde
14 minutes
No due date set.
Dependencies
No dependencies set.
Reference: florian.wilde/flimmer#16
Reference in New Issue
Block a user
Was heute passiert
Der Abgleich aus #1 ordnet Jellyfin-Items über die TMDB-Kennung zu — aber nur gegen Titel, die Flimmer schon kennt. Was der Katalog nicht enthält, wird übersprungen und landet mit dem Grund „TMDB 424242 nicht im Katalog" im Bericht (
src/lib/mediaserver.ts:226).Für eine frisch aufgesetzte Instanz heißt das: Jellyfin meldet 800 Filme, Flimmer ordnet null davon zu, weil die Bibliothek leer ist. Der Abgleich kann nur bestätigen, was ohnehin schon da war.
Das Häkchen „Fehlende Titel dabei aufnehmen" hilft dabei nicht — es nimmt nur Titel auf, die im Katalog stehen, aber noch nicht in der Bibliothek. Zwei verschiedene Dinge, die man leicht verwechselt.
Was fehlt
ensureTitle(type, tmdbId)(src/lib/catalog.ts:331) kann genau das: einen Titel bei TMDB holen und im Katalog anlegen, samt Staffeln und Episoden. Der Abgleich ruft es bloß nicht auf.Mit diesem Schritt wird aus „Bestand bestätigen" ein echtes Übernehmen: Jellyfin einmal verbinden, und die eigene Mediathek steht in Flimmer.
Was dabei zu bedenken ist
Der Typ muss stimmen.
ensureTitlebrauchtSERIESoderMOVIE. Jellyfin liefert bei Episoden die TMDB-Kennung der Serie — die Zuordnung ist alsoEpisode → Series → SERIES,Movie → MOVIE. Das steht schon so im Abgleich; es muss nur mitgereicht werden.Das kostet Zeit und TMDB-Anfragen. 800 unbekannte Titel bedeuten 800 Abrufe, bei Serien zusätzlich einen je Staffel. Der erste Lauf einer großen Mediathek läuft damit nicht mehr in Sekunden. Nötig sind deshalb:
Nur mit ausdrücklicher Erlaubnis. Das Nachladen gehört an dasselbe Häkchen wie das Aufnehmen (oder an ein eigenes daneben), und im täglichen Lauf bleibt es aus. Eine Mediathek soll nicht nachts ungefragt zur Bibliothek werden — dieser Grundsatz aus #1 gilt weiter.
Ohne TMDB-Schlüssel geht es nicht. Fehlt er, muss die Oberfläche das sagen, statt still nichts zu tun.
Umzusetzen
syncConnection()beim Fehlschlag der KatalogsucheensureTitle()aufrufen, wenn erlaubtAbnahme
Abgrenzung
Das ist die Fortsetzung von #1, nicht dessen Wiederholung. Bereits umgesetzt und ausgeliefert (v0.8.0):
Offen bleibt daneben weiterhin Stufe 3 aus #1: das Zurückschreiben von Flimmer nach Jellyfin.
Angelegt auf ausdrücklichen Wunsch direkt in Gitea, ohne Verknüpfung zu einem Nebula-Task.
Ergänzung: auswählen statt alles oder nichts
Florian hat den ersten Lauf gegen seine echte Mediathek gemacht. Das Ergebnis zeigt das Problem in voller Größe:
Keine einzige Zuordnung. Der Katalog kennt schlicht nichts davon, und der Bericht kann nur aufzählen, was er nicht einsortieren konnte.
Gewünscht ist deshalb kein pauschaler Import, sondern eine Auswahl: die nicht zuzuordnenden Einträge als Liste mit Häkchen, daraus aussuchen, was nach Flimmer soll, und nur das nachladen.
Das ist die bessere Lösung als das Häkchen aus der ursprünglichen Beschreibung. Bei 1322 Einträgen will niemand „alles oder nichts" — in einer Mediathek liegen Konzertmitschnitte, Kinderfilme und Testaufnahmen neben dem, was man wirklich verfolgen möchte.
Was der Screenshot zusätzlich zeigt
Die Berichtsgrenze von 50 ist viel zu klein.
BERICHT_GRENZEinsrc/lib/mediaserver.ts:55schneidet nach 50 Einträgen ab — bei über tausend gelesenen Items ist das ein Blick durchs Schlüsselloch. Wenn die Liste zur Auswahlliste wird, muss sie vollständig sein: blätterbar, durchsuchbar, sortierbar.Dubletten stehen doppelt drin. „College Animals 2 — TMDB 10104" erscheint zweimal, ebenso mehrere Bourne-Filme. Jellyfin führt offenbar mehrere Dateien zum selben Titel (verschiedene Fassungen, Extended Editions). Die Auswahlliste muss nach TMDB-Kennung zusammenfassen, sonst wählt man denselben Film dreimal aus.
Zwei verschiedene Gründe brauchen zwei verschiedene Behandlungen:
TMDB 584 nicht im Katalogkeine TMDB-Kennung am ItemFür die zweite Gruppe wäre eine Suche daneben richtig: Titel anklicken, Flimmer sucht bei TMDB, man wählt den passenden Treffer. Das ist mehr Arbeit und sollte einen eigenen Schritt bekommen — vielleicht sogar ein eigenes Issue, wenn die erste Gruppe erst einmal läuft.
Ein Hinweis nebenbei: Bei den Extended Editions liegt es an der Benennung in Jellyfin. Wer dort die Erkennung nachzieht, bekommt die Kennung ohne Zutun von Flimmer.
Ergänzung zur Abnahme
Nachgetragen auf Zuruf; die ursprüngliche Beschreibung bleibt unverändert.
🤖 Claude Code hat mit der Umsetzung begonnen.
feat/16-titel-nachladenensureTitle(), mit Obergrenze je Lauf; Fehler je Titel gesammelt statt AbbruchZur Abweichung: Die ursprüngliche Beschreibung sah ein Häkchen „alles nachladen" vor, der spätere Kommentar eine Auswahl. Ich richte mich nach dem Kommentar — bei 1322 Einträgen ist „alles oder nichts" keine Wahl.
Das alte Häkchen „Fehlende Titel dabei aufnehmen" bleibt bestehen, bekommt aber eine klarere Beschriftung: es nimmt auf, was Flimmer kennt; die neue Liste holt, was es nicht kennt.
Zeiterfassung läuft.
✅ Umsetzung abgeschlossen — bereit zum Testen.
Was geändert wurde
importUnassigned(): holt eine Auswahl überensureTitle(), höchstens 100 je Lauf, Fehler je Titel gesammelt statt Abbruch; nimmt auf mitownedund Quelle Jellyfindocs/ANLEITUNG.mdmit eigenem UnterabschnittGeänderte Dateien
src/lib/mediaserver.ts,src/app/actions/settings.tssrc/components/settings/MediaServer.tsx,src/app/einstellungen/page.tsxtests/mediaserver.test.ts,tests/fixtures/jellyfin.ts,docs/ANLEITUNG.mdEine Selbstkorrektur: Mein erster Entwurf strich auch gescheiterte Titel aus der Auswahlliste — und ich hatte das sogar in einem Test festgeschrieben. Beim Durchklicken fiel auf, wie ärgerlich das wäre: TMDB kurz nicht erreichbar, und die Titel sind aus der Liste, ohne importiert zu sein. Jetzt verschwindet nur, was tatsächlich ankam; Code und Test sind korrigiert.
Ein Fehler, den der Klickweg gefunden hat: Der Typ wurde aus dem Umkehrschluss „keine Episode, also Film" abgeleitet — eine Serie stand damit als „Film" in der Liste. Jetzt kommt er aus dem Item.
Geprüft
83 Tests grün (fünf neue), Typecheck sauber. Klickweg gegen einen nachgebildeten Jellyfin im Produktionsbau: Liste sichtbar, Entdopplung („2 Dateien"), Typ korrekt, Zeile ohne Kennung gesperrt, Suche filtert, Fehlschlag wird ehrlich gemeldet.
Was lokal nicht belegbar war: der Importschritt über die Oberfläche. Der Entwicklungs-Stub beantwortet nur Suchanfragen und speist sich aus dem Katalog — er kann nichts liefern, was dort fehlt. Der Erfolgsfall ist über die Domänenschicht getestet (Katalogeintrag, Bibliothekseintrag mit
owned, bei Serien mit Episoden). An deiner Instanz mit echtem TMDB-Schlüssel ist das der eigentliche Test.So testest du es
git switch feat/16-titel-nachladennpm run dev(Migration braucht es nicht), Einstellungen → MedienserverAufgewendete Zeit: 00:15
Pull Request: #18
Nach Freigabe:
/issue-freigabe 16🚀 Freigegeben und nach
mainübernommen.f8d5566Nach dem Merge auf
maingeprüft — zusammen mit #15: 93 Tests grün, Typecheck sauber, Bau erfolgreich.Der eigentliche Test steht noch aus: Der Importschritt ließ sich lokal nur über die Domänenschicht belegen, weil der Entwicklungs-Stub keine Detailabrufe kennt. An deiner Instanz mit echtem TMDB-Schlüssel und den gut tausend Jellyfin-Einträgen zeigt sich, ob es trägt.
Das Issue wurde durch das
Closes #16im Merge automatisch geschlossen; die Statuslabels sind geräumt.