Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Jellyfin <-> Jellyseerr Favorites Sync

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.

Schnellstart

Docker Compose

  • Empfohlen: mounten Sie die STATE_FILE in 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.json

Starten und Logs verfolgen:

docker compose up -d
docker compose logs -f jellyfin-jellyseerr-favorites-sync

Einzelner 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-sync

Tipps

  • Für Produktionsbetrieb: nutze docker compose + Host-Volume für STATE_FILE und überwache die Logs. Auf Windows kann das Volume-Pfad-Mapping variieren je nach Docker-Setup (Docker Desktop vs. Linux-VM).
  • Wenn du TMDB_API_KEY einsetzt (optional), setze die Umgebungsvariable, damit das Script bei fehlenden numeric TMDB-IDs auf die TMDB-API zurückgreifen kann.

Wichtige Umgebungsvariablen

  • 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-Instanz
  • JELLYSEERR_API_KEY (required): API-Key für Jellyseerr (Header-Name standardmäßig X-Api-Key)
  • JELLYSEERR_API_KEY_HEADER (optional): Name des Headers für den API-Key (Default X-Api-Key)
  • SYNC_INTERVAL (optional): Sekunden zwischen Sync-Runden (Default 60)
  • 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) oder DEBUG für ausführliche Logs

Verhalten / Hinweise

  • Initiallauf: Wenn keine STATE_FILE existiert, 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.

Logs & Debugging

  • Setze LOG_LEVEL=DEBUG fü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öschungen
    • Saved sync state to ... – Zustand erfolgreich persistiert
    • Detected removal on Jellyfin ... / Detected removal on Jellyseerr ... – erkannte Löschung und gestartete Entfernung auf Gegenstelle

About

Synchronizes favorite movies and shows between Jellyfin and Jellyseerr.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages