Il y a quelques années, j’utilisais un plugin pour Plex pour synchroniser les visionnages. L’intérêt étant surtout de pouvoir ajouter/retirer des contenus, voire réinstaller un serveur Plex, tout en ne perdant pas le chemin parcouru 🙂
Avec l’évolution de Plex, il faut passer par un script Python, empaqueté dans un Docker pour plus de simplicité : PlexTraktSync, de Taxel. Alors que pour Jellyfin, on utilise toujours le plugin qui va bien.
On peut synchroniser de Plex vers Trakt et/ou Trakt vers Plex, par bibliothèque et utilisateur.
Voici un exemple d’installation et de configuration, sans prise en compte de Watchlists (que je n’ai pas vu qu’ici on passe par Overseerr uniquement).
Il faut une application Trakt.tv vérifiée (gratuit) pour récupérer ses clés d’accès. Et si vous voulez les notifications Discord, l’OS hôte (mon script est externe) doit avoir curl et jq.
Installation du Docker. Ofelia étant un cron qui permet de lancer la synchronisation selon nos préférences, je le lance toutes les 6h (0 */6 * * *). Pour paramétrer, aidez-vous de Cron Guru au besoin.
services:
plextraktsync:
image: ghcr.io/taxel/plextraktsync:latest
container_name: plextraktsync
restart: always
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- /home/aerya/docker/plextraktsync/config:/app/config
command: watch
labels:
- ofelia.enabled=true
- ofelia.job-exec.sync.schedule=0 */6 * * *
- ofelia.job-exec.sync.command=plextraktsync sync
- ofelia.job-exec.sync.no-overlap=true
ofelia:
image: mcuadros/ofelia:latest
container_name: ofelia
restart: always
command: daemon --docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks: {}
En suivant le ReadMe, lancer le Docker la 1ère fois créera le fichier de configuration config.yml. Mais on peut aussi l’éditer à la main, tout comme servers.yml.
Pour sélectionner le serveur, utiliser les flèches du clavier.

Je me suis trompé de serveur, j’ai édité la conf à la main ensuite, du coup il cherchait à valider un SSL alors que j’avais mis un serveur en IP locale. Il faut lui laisser un peu le temps mais ensuite c’est bon.

Si ce n’est pas déjà fait, il explique la marche à suivre pour se faire une application Trakt.tv

Quand je vois SickGear dans mes applications… ça rappelle de sacrés souvenirs ! 🙂




Il convient tout de même d’éditer un peu la configuration à la main, notamment si on veut exclure des bibliothèques ou watchlists. Ici c’est basique, je n’ai qu’un utilisateur et synchronise tout mais pour aller plus dans le détail je vous recommande de suivre son ReadMe.
C’est config.yml dans /home/aerya/docker/plextraktsync/config
cache:
path: $PTS_CACHE_DIR/trakt_cache
# You may want to use per server libraries config instead:
# - https://github.com/Taxel/PlexTraktSync#libraries
excluded-libraries:
- Private
config:
dotenv_override: true
plex:
timeout: 30
logging:
append: true
# Whether to show timestamps in console messages
console_time: false
debug: false
filename: plextraktsync.log
# Additional logger names to apply filtering
filter_loggers:
# - plexapi
# - requests_cache.backends
# - requests_cache.backends.base
# - requests_cache.backends.sqlite
# - requests_cache.policy.actions
# - requests_cache.session
# - trakt.core
# - urllib3.connectionpool
filter:
# # Filter out all messages with level WARNING
# - level: WARNING
# # Filter out message with level WARNING and containing a text
# - level: WARNING
# message: "not found on Trakt"
# - message: "because provider local has no external Id"
# - message: "because provider none has no external Id"
# - message: "Retry using search for specific Plex Episode"
# # Filter out messages by requests_cache
# - name: requests_cache.backends
# - name: requests_cache.backends.base
# - name: requests_cache.backends.sqlite
# - name: requests_cache.policy.actions
# - name: requests_cache.session
# settings for 'sync' command
sync:
# Setting for whether ratings from one platform should have priority.
# Valid values are trakt, plex or none. (default: plex)
# none - No rating priority. Existing ratings are not overwritten.
# trakt - Trakt ratings have priority. Existing Plex ratings are overwritten.
# plex - Plex ratings have priority. Existing Trakt ratings are overwritten.
rating_priority: plex
plex_to_trakt:
collection: false
# Clear collected state of items not present in Plex
clear_collected: false
ratings: true
watched_status: true
# If plex_to_trakt watchlist=false and trakt_to_plex watchlist=true
# the Plex watchlist will be overwritten by Trakt watchlist
watchlist: false
trakt_to_plex:
liked_lists: true
ratings: true
watched_status: true
# If trakt_to_plex watchlist=false and plex_to_trakt watchlist=true
# the Trakt watchlist will be overwritten by Plex watchlist
watchlist: false
# If you prefer to fetch trakt watchlist as a playlist instead of
# plex watchlist, toggle this to true (is read only if watchlist=true)
watchlist_as_playlist: false
# Sync Play Progress from Trakt to Plex
playback_status: false
# Configuration for liked lists
liked_lists:
# Whether to keep watched items in the list
keep_watched: true
# Configuration override for specific lists
#liked_list:
# "Saw Collection":
# keep_watched: true
# settings for 'watch' command
watch:
add_collection: false
remove_collection: false
# what video watched percentage (0 to 100) triggers the watched status
scrobble_threshold: 80
# true to scrobble only what's watched by you, false for all your PMS users
username_filter: true
# Show the progress bar of played media in terminal
media_progressbar: true
# Clients to ignore when listening Play events
ignore_clients: ~
xbmc-providers:
movies: imdb
shows: tvdb
De même, on peut venir éditer le fichier du ou des serveurs Plex à synchroniser : servers.yml
servers:
default:
token: null
urls:
- null
- null
id: null
config: null
plex.domain.tld:
token: xxxx
urls:
- https://plex.domain.tld
# - http://192.168.0.139:32400
id: xxxx
config: null
Et donc, toutes les 6h, le Docker se lance et synchronise Plex et Trakt.tv pour mettre à jour les films et séries lus/non lus.
La 1ère fois peut prendre un peu de temps selon le nombre de fichiers.
Je voulais les notifications sur Discord, j’ai donc créé un script qui lance le Docker et envoie la récap en notification :

Nécessite curl et jq. Pour l’icône, ici comme pour Heimdall, j’utilise dashboardicons.com
Et il faut retirer Ofelia et les labels inhérents
du compose plus haut puisque c’est maintenant l’hôte, via crontab par exemple, qui va exécuter le script qui va lui-même lancer le Docker de plextraktsync.
Le compose devient
services:
plextraktsync:
image: ghcr.io/taxel/plextraktsync:latest
container_name: plextraktsync
restart: always
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- /home/aerya/docker/plextraktsync/config:/app/config
command: watch
Et mon script
#!/bin/bash
set -euo pipefail
WEBHOOK_URL="https://discord.com/api/webhooks/xxxx"
TMP_LOG="$(mktemp)"
docker compose exec plextraktsync plextraktsync sync 2>&1 | tee "$TMP_LOG"
RESULT=$?
# récupère les 20 dernières lignes
LOG_TAIL="$(tail -n 20 "$TMP_LOG" | jq -Rs .)"
PAYLOAD=$(jq -n --arg res "$RESULT" --arg logs "$LOG_TAIL" '
{content: "Résultat sync : \($res)\n```\n\($logs | fromjson)\n```"}
')
curl -sS -X POST -H "Content-Type: application/json" \
-d "$PAYLOAD" "$WEBHOOK_URL"

Je l’ai donc mis en cron, toutes les 6h :
0 */6 * * * bash /home/aerya/docker/plextraktsync/config/plextraktsyncdiscord.sh