Sync watched status between jellyfin, plex and emby locally
Find a file
Luis Garcia 2d8d209a09 Tag version 8.4.0
Signed-off-by: Luis Garcia <git@luigi311.com>
2025-11-08 18:30:52 -07:00
.github CI: UV sync frozen and no extra tools 2025-07-11 10:37:26 -06:00
.vscode vscode: Fix deprecated python debug type 2025-02-21 14:47:14 -07:00
src Watched: Compare using viewed date so newer is better 2025-11-08 17:29:52 -07:00
test Jellyfin/Emby: Sync across the view times 2025-07-11 23:48:23 +00:00
.dockerignore Do not include test in docker image 2025-02-21 19:52:12 -07:00
.env.sample Update .env.sample 2025-05-18 20:38:19 +00:00
.gitignore Swap to UV 2025-02-19 19:48:16 -07:00
.python-version Swap to UV 2025-02-19 19:48:16 -07:00
docker-compose.yml Docker Compose: Use env_file for most variables 2024-08-28 16:46:19 -06:00
Dockerfile.alpine Docker: Set default env values to prevent issues 2025-02-21 23:36:19 -07:00
Dockerfile.slim Docker: Set default env values to prevent issues 2025-02-21 23:36:19 -07:00
entrypoint.sh Swap to UV 2025-02-19 19:48:16 -07:00
LICENSE Use async for jellyfin (#23) 2022-07-10 01:30:12 -06:00
main.py Force python 3.12 or greater 2025-02-21 12:10:53 -07:00
pyproject.toml Tag version 8.4.0 2025-11-08 18:30:52 -07:00
README.md README: Add sync view dates 2025-07-11 23:48:33 +00:00
uv.lock Tag version 8.4.0 2025-11-08 18:30:52 -07:00

JellyPlex-Watched

Codacy Badge

Sync watched between jellyfin, plex and emby locally

Description

Keep in sync all your users watched history between jellyfin, plex and emby servers locally. This uses file names and provider ids to find the correct episode/movie between the two. This is not perfect but it works for most cases. You can use this for as many servers as you want by entering multiple options in the .env plex/jellyfin section separated by commas.

Features

Plex

  • [x] Match via filenames
  • [x] Match via provider ids
  • [x] Map usernames
  • [x] Use single login
  • [x] One way/multi way sync
  • [x] Sync watched
  • [x] Sync in progress
  • [ ] Sync view dates

Jellyfin

  • [x] Match via filenames
  • [x] Match via provider ids
  • [x] Map usernames
  • [x] Use single login
  • [x] One way/multi way sync
  • [x] Sync watched
  • [x] Sync in progress
  • [x] Sync view dates

Emby

  • [x] Match via filenames
  • [x] Match via provider ids
  • [x] Map usernames
  • [x] Use single login
  • [x] One way/multi way sync
  • [x] Sync watched
  • [x] Sync in progress
  • [x] Sync view dates

Configuration

Full list of configuration options can be found in the .env.sample

Installation

Baremetal

  • Install uv

  • Create a .env file similar to .env.sample; fill in baseurls and tokens, remember to uncomment anything you wish to use (e.g., user mapping, library mapping, black/whitelist, etc.). If you want to store your .env file anywhere else or under a different name you can use ENV_FILE variable to specify the location.

  • Run

    uv run main.py
    
    ENV_FILE="Test.env" uv run main.py
    

Docker

  • Build docker image

    docker build -t jellyplex-watched .
    
  • or use pre-built image

    docker pull luigi311/jellyplex-watched:latest
    

With variables

  • Run

    docker run --rm -it -e PLEX_TOKEN='SuperSecretToken' luigi311/jellyplex-watched:latest
    

With .env

  • Create a .env file similar to .env.sample and set the variables to match your setup

  • Run

     docker run --rm -it -v "$(pwd)/.env:/app/.env" luigi311/jellyplex-watched:latest
    

Troubleshooting/Issues

  • Jellyfin

    • Attempt to decode JSON with unexpected mimetype, make sure you enable remote access or add your docker subnet to lan networks in jellyfin settings
  • Configuration

    • Do not use quotes around variables in docker compose
    • If you are not running all 3 supported servers, that is, Plex, Jellyfin, and Emby simultaneously, make sure to comment out the server url and token of the server you aren't using.

Contributing

I am open to receiving pull requests. If you are submitting a pull request, please make sure run it locally for a day or two to make sure it is working as expected and stable.

License

This is currently under the GNU General Public License v3.0.