Dieses Projekt synchronisiert Favoriten zwischen Jellyseerr (Overseerr-Varianten) und Jellyfin. Es unterstützt jetzt bidirektionalen Sync:
- Zwei-Wege-Synchronisation: Favoriten werden von Jellyseerr → Jellyfin und von Jellyfin → Jellyseerr synchronisiert.
- Bevorzugt TMDB-Provider-IDs (TheMovieDb/Tmdb) zum sicheren Matching; Fallback ist Title + ProductionYear.
- Zustandsdatei: Das Tool speichert pro Benutzer, welche Items auf welcher Seite vorhanden waren. Beim ersten Start wird ein "additive-only" Initiallauf durchgeführt (keine Löschungen). Ab dem zweiten Lauf erkennt das Script entfernte Items und entfernt sie auf der Gegenstelle.
- Robust gegenüber API-Unterschieden: versucht mehrere Endpunkte / Payload-Varianten für Jellyseerr/Jellyfin.
- Umfangreiche Debug-Logs (setze
LOG_LEVEL=DEBUG).
Kurz: das Script versucht, nichts automatisch zu löschen beim ersten Start (sicher für Produktionsdaten). Danach erkennt es Löschungen und repliziert sie sicher.
- Empfohlen: mounten Sie die
STATE_FILEin ein Host-Verzeichnis, damit der Sync-Zustand zwischen Container-Neustarts erhalten bleibt.
Beispiel docker-compose.yml (minimal):
services:
jellyfin-jellyseerr-favorites-sync:
image: ghcr.io/panda260/jellyfin-jellyseerr-favorites-sync:latest
restart: unless-stopped
environment:
- JELLYFIN_URL=http://jellyfin.local:8096
- JELLYFIN_API_KEY=your_jellyfin_api_key_here
- JELLYSEERR_URL=http://jellyseerr.local:5055
- JELLYSEERR_API_KEY=your_jellyseerr_api_key_here
- SYNC_INTERVAL=300
- LOG_LEVEL=INFO
- STATE_FILE=/data/favorites_state.json
volumes:
- ./data:/data # Host-Ordner 'data' enthält dann favorites_state.jsonStarten und Logs verfolgen:
docker compose up -d
docker compose logs -f jellyfin-jellyseerr-favorites-syncEinzelner Docker-Container docker run
# Stelle sicher, dass ./data existiert
New-Item -ItemType Directory -Path .\data -Force
docker run -d --name favorites-sync \
-e JELLYFIN_URL='http://10.0.4.50:8095' \
-e JELLYFIN_API_KEY='YOUR_JELLYFIN_API_KEY' \
-e JELLYSEERR_URL='http://10.0.4.50:5057' \
-e JELLYSEERR_API_KEY='YOUR_JELLYSEERR_API_KEY' \
-e SYNC_INTERVAL='60' \
-e STATE_FILE='/data/favorites_state.json' \
-v ${PWD}:/workdir -v ${PWD}\data:/data \
--restart unless-stopped \
ghcr.io/panda260/jellyfin-jellyseerr-favorites-sync:latest
# Logs:
docker logs -f favorites-syncTipps
- Für Produktionsbetrieb: nutze
docker compose+ Host-Volume fürSTATE_FILEund überwache die Logs. Auf Windows kann das Volume-Pfad-Mapping variieren je nach Docker-Setup (Docker Desktop vs. Linux-VM). - Wenn du
TMDB_API_KEYeinsetzt (optional), setze die Umgebungsvariable, damit das Script bei fehlenden numeric TMDB-IDs auf die TMDB-API zurückgreifen kann.
JELLYFIN_URL(required): Basis-URL deiner Jellyfin-Instanz (http(s) + Port)JELLYFIN_API_KEY(required): Jellyfin API token (X-Emby-Token)JELLYSEERR_URL(required): Basis-URL deiner Jellyseerr/Overseerr-InstanzJELLYSEERR_API_KEY(required): API-Key für Jellyseerr (Header-Name standardmäßigX-Api-Key)JELLYSEERR_API_KEY_HEADER(optional): Name des Headers für den API-Key (DefaultX-Api-Key)SYNC_INTERVAL(optional): Sekunden zwischen Sync-Runden (Default60)STATE_FILE(optional): Pfad zur JSON-Datei, die den letzten Sync-Zustand speichert (Default./favorites_state.json). In Docker: mounten, damit erhalte die Historie.LOG_LEVEL(optional):INFO(default) oderDEBUGfür ausführliche Logs
- Initiallauf: Wenn keine
STATE_FILEexistiert, macht das Script nur additive Aktionen (es fügt überall fehlende Favoriten hinzu) und speichert den Zustand. Es löscht beim ersten Lauf nichts. - Folge-Läufe: Das Script vergleicht den aktuellen Zustand mit dem gespeicherten Zustand. Wenn ein Item in der vorherigen Runde auf beiden Seiten vorhanden war, und nun auf einer Seite fehlt, wird das Item auf der anderen Seite entfernt (replicated removal).
- Matching: Priorität: numeric TMDB id -> provider ids in Jellyfin -> Titel + Jahr. Wenn ein Item nicht automatisch gematched werden kann, wird es geloggt und beim nächsten Lauf erneut geprüft.
- API-Varianten: Aufgrund unterschiedlicher Jellyseerr/Overseerr-Versionen probiert das Script mehrere Endpunkte und Payload-Formate; die Logs zeigen genau, welche Endpunkte erfolgreich waren.
- Setze
LOG_LEVEL=DEBUGfür ausführliche Ausgabe (Request/Response) und um zu sehen, welche Endpunkte und Payloads benutzt werden. - Wichtige Log-Meldungen:
No previous state file found; performing initial additive-only sync– erster Lauf, keine LöschungenSaved sync state to ...– Zustand erfolgreich persistiertDetected removal on Jellyfin .../Detected removal on Jellyseerr ...– erkannte Löschung und gestartete Entfernung auf Gegenstelle