Adapter: Jellyfin

Jellyfin adapter lets CrossWatch sync with your Jellyfin server. It supports watchlist, ratings, and history. It prefers external IDs for matching.

What it supports

  • Direction: source or target in a pair (one-way or two-way)

  • Features:

    • Watchlist (favorites, playlist, or collection mode)

    • Ratings (0–10 scale; accepts 0–5 stars input)

    • History (played movies and episodes)

    • Playlists (not supported yet)

  • Indexing: present-state snapshot (reads “what exists now”)

circle-info

Connect Jellyfin first. Use: Jellyfin (Authentication provider).

How matching works

CrossWatch normalizes items into a common shape:

  • type, title, year, ids

  • Episodes can include show_ids, season, episode

IDs are pulled from Jellyfin ProviderIds when available (IMDb/TMDb/TVDb). For episodes, the adapter tries to include show context in show_ids.

circle-exclamation

Watchlist behavior

Pick one watchlist mode:

  1. Favorites (default) Uses the user IsFavorite flag for Movies and Series.

  2. Playlist Uses a playlist (default name: Watchlist) as the watchlist container.

  3. Collection Uses a named collection as the watchlist container.

Reads enumerate the chosen container. Writes toggle favorites or add/remove from the playlist/collection.

circle-info

Recommended: Favorites or Collection.

circle-exclamation

Ratings behavior

  • Ratings are stored on a 0–10 scale.

  • If you provide 0–5 stars, CrossWatch up-scales it (×2) during writes.

  • “Unrate” is supported by clearing the rating (null).

History behavior

  • Reads played Movies and Episodes, sorted by DateLastPlayed.

  • Each entry becomes a normalized event with watched_at in UTC (...Z).

circle-info

Jellyfin does not expose unique play-event IDs. CrossWatch approximates event identity using item key + timestamp.

Settings (advanced)

The UI mirrors these under Settings → Synchronization Providers → Pairs (with Jellyfin).

chevron-rightImportant config keyshashtag

Watchlist:

  • mode: favorites | playlist | collection

  • playlist_name

  • watchlist_query_limit, watchlist_write_delay_ms

  • watchlist_guid_priority

History:

  • history_query_limit, history_write_delay_ms

  • history_guid_priority

  • history_libraries (optional include-list of library IDs)

Ratings:

  • ratings_query_limit

Diagnostics

chevron-rightHealth checkshashtag
  • Ping: GET /System/Ping

  • System info: GET /System/Info

  • User probe: GET /Users/{userId}

Logs are prefixed with [JELLYFIN:feature] (example: [JELLYFIN:ratings] ...).

chevron-rightState and unresolved fileshashtag
  • Ratings unresolved: /config/.cw_state/jellyfin_ratings.unresolved.json

  • History shadow (merge-only): managed by the module/orchestrator

These prevent infinite retries and make failures visible.

Notes and limitations

  • Missing external IDs reduces match quality.

  • If writes are flaky, add a small write delay.

  • Jellyfin actions are user-scoped. Use separate pairs per Jellyfin user.

Last updated