# 14_Jellyfin

## jellyfin

*The Free Software Media System*

<table id="bkmrk-imagejellyfin%2Fjellyf"><tbody><tr><th>Image</th><td>`jellyfin/jellyfin:latest`</td></tr><tr><th>Version</th><td>10.10.7</td></tr><tr><th>Etat</th><td><span style="color:#008000;">Up 9 hours (healthy)</span></td></tr><tr><th>Compose project</th><td>jellyfin</td></tr><tr><th>Reseau</th><td>host</td></tr><tr><th>URL</th><td>[https://jellyfin.juxjux.ovh](https://jellyfin.juxjux.ovh)</td></tr><tr><th>Source</th><td>[https://github.com/jellyfin/jellyfin-packaging](https://github.com/jellyfin/jellyfin-packaging)</td></tr></tbody></table>

### Volumes

<table id="bkmrk-source-%28hote%29destina"><thead><tr><th>Source (hote)</th><th>Destination</th><th>Type</th><th>Mode</th></tr></thead><tbody><tr><td>`/mnt/nas_videos/movies`</td><td>`/data/movies`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/palettes`</td><td>`/data/palettes`</td><td>bind</td><td>rw</td></tr><tr><td>`/home/debian/jellyfin/config`</td><td>`/config`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/cinema_europe`</td><td>`/data/cinema_europe`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/cinema_UK`</td><td>`/data/cinema_uk`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/spectacles`</td><td>`/data/spectacles`</td><td>bind</td><td>rw</td></tr><tr><td>``</td><td>`/cache`</td><td>volume</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/animes`</td><td>`/data/animes`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/cinema_asie`</td><td>`/data/cinema_asie`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/cinema_realisateurs`</td><td>`/data/cinema_realisateurs`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/fantastique_et_SF`</td><td>`/data/fantastique_et_SF`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/historiques`</td><td>`/data/historiques`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/series`</td><td>`/data/series`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/cinema_italie`</td><td>`/data/cinema_italie`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/culture_cuisine`</td><td>`/data/culture_cuisine`</td><td>bind</td><td>rw</td></tr><tr><td>`/mnt/nas_videos/documentaires`</td><td>`/data/documentaires`</td><td>bind</td><td>rw</td></tr></tbody></table>

---

## Integration Claude Code — MCP

<table id="bkmrk-statut-mcpmcp-actifo"><tbody><tr><th>Statut MCP</th><td><span style="color:#008000;">MCP actif</span></td></tr><tr><th>Outils (prefix)</th><td>`mcp__jellyfin__`</td></tr><tr><th>Configuration</th><td>Script Python : C:\\Users\\eliob\\.claude\\mcp\_jellyfin.py | Auth : JWT MediaBrowser Token via POST /Users/AuthenticateByName</td></tr></tbody></table>

### Outils disponibles

- `get_libraries`
- `get_items`
- `get_item`
- `get_recently_added`
- `get_resume_items`
- `get_sessions`
- `get_users`
- `get_server_info`
- `scan_library`
- `search_items`

### Ce que nous pouvons faire ensemble

- Parcourir films, séries et musiques de la médiathèque
- Voir les ajouts récents et les éléments en cours de lecture
- Surveiller les sessions actives (qui lit quoi en ce moment)
- Déclencher un scan de bibliothèque après ajout de contenu
- Rechercher un titre dans toute la médiathèque

---

## 260830 - Lecture des flux vidéos Jellyfin à partir de kDrive

**Statut : FAIT le 2026-08-30.** Jellyfin ne lit plus le NAS. Il lit kDrive par un montage rclone FUSE. Le NAS conserve l'intégralité des 694 Go — l'étape 6 (suppression) reste en attente, après période d'observation.

### Résultat mesuré

<table id="bkmrk-avantapr%C3%A8s-source-de"><thead><tr><th></th><th>Avant</th><th>Après</th></tr></thead><tbody><tr><td>Source de `/mnt/nas_videos`</td><td>CIFS `//10.0.0.2/video`</td><td>rclone kDrive `Videos_NAS`</td></tr><tr><td>**Débit lu depuis le container**</td><td>**5,0 Mo/s**</td><td>**65,6 Mo/s**</td></tr><tr><td>Propagation des 15 binds</td><td>absente</td><td>`shared` sur les 15</td></tr><tr><td>`EnableRealtimeMonitor`</td><td>actif sur 15 biblios</td><td>désactivé partout</td></tr><tr><td>`monitor-rclone.sh`</td><td>5 montages</td><td>6, avec restart de `jellyfin`</td></tr><tr><td>Films catalogués</td><td>343</td><td>629 (+286, fusion cuisine)</td></tr></tbody></table>

Le goulot était le tunnel WireGuard depuis Toulon (40 Mbit/s, incompatible avec deux flux simultanés), pas kDrive. **La bascule améliore la lecture au lieu de la dégrader.**

### Le montage

Service `/etc/systemd/system/kdrive-video.service`, activé au démarrage, calqué sur `kdrive-music.service` :

```
ExecStart=/usr/bin/rclone --config=/home/debian/.config/rclone/rclone.conf mount \
  --rc --rc-addr 127.0.0.1:5578 --rc-user=rcadmin --rc-pass=RcVideo2026! --rc-enable-metrics \
  "kdrive:Julien Bertrand (0)/Videos_NAS" /mnt/nas_videos \
  --allow-other --dir-cache-time 72h --poll-interval 15s \
  --vfs-cache-mode minimal --buffer-size 256M \
  --uid 1000 --gid 1000 --umask 002 --allow-non-empty
```

- `--vfs-cache-mode minimal` : lectures en direct, seules les écritures (nfo, trickplay) passent par le disque. **Surtout pas `full`** comme les montages musique — il cacherait 4 Go par film, or le VPS n'a que 33 Go libres sur 99 et l'incident du 2026-06-24 (disque à 100 %) est parti de là.
- `--rc-addr 127.0.0.1` : **jamais `0.0.0.0`**, règle permanente depuis l'incident du 2026-06-09.
- `--uid 1000 --gid 1000` : la compose déclare `user: 1000:1000`.
- `/mnt` était **déjà** en propagation `shared` — le `mount --bind` prévu s'est révélé inutile.

### La carte des binds

Le montage porte sur `Videos_NAS` **entier**, pas seulement sur son sous-dossier `video`, parce que deux bibliothèques ont été fusionnées avec du contenu kDrive préexistant. Les chemins *conteneur* sont restés identiques : **aucune ré-identification, aucun historique de visionnage perdu.**

<table id="bkmrk-chemin-h%C3%B4techemin-co"><thead><tr><th>Chemin hôte</th><th>Chemin conteneur</th></tr></thead><tbody><tr><td>`/mnt/nas_videos/Séries`</td><td>`/data/series` — *fusionné*</td></tr><tr><td>`/mnt/nas_videos/Video Cuisine`</td><td>`/data/culture_cuisine` — *fusionné*</td></tr><tr><td>`/mnt/nas_videos/video/<13 autres>`</td><td>`/data/<13 autres>`</td></tr><tr><td>`/home/debian/jellyfin/config`</td><td>`/config`</td></tr></tbody></table>

Compose : stack Portainer **5**, projet compose `5`. Sauvegarde `docker-compose.yml.bak-260830`.

```
sudo docker compose -p 5 -f /var/lib/docker/volumes/portainer_data/_data/compose/5/docker-compose.yml up -d --force-recreate
```

### Disponible pour de futures bibliothèques

Le montage expose aussi ce qui vivait déjà dans `Videos_NAS` et qui n'est branché sur aucune bibliothèque : *Video Culture Arts et Peinture* (130,8 Go), *Video Architecture et Urbanisme* (29,4 Go), *Video concerts* (3,5 Go).

### Pièges rencontrés — à ne pas re-découvrir

1. **Le point de montage n'était pas vide.** Sous l'ancien CIFS subsistaient 15 dossiers vides. Laissés en place, **un montage rclone mort ferait voir à Jellyfin des dossiers vides au lieu d'une erreur** — et il purgerait ses bibliothèques. Vérifié (0 fichier réel, 65 536 octets de dossiers) puis supprimés, montage arrêté le temps de l'opération.
2. **`grep -c` renvoie 1 quand il ne trouve rien** et tue un script en `set -e`. Le redéploiement avait réussi, seule la vérification a échoué.
3. **Docker ne montre pas `:shared` dans `.HostConfig.Binds`**, il le normalise dans `.Mounts[].Propagation`. Vérifier là.
4. **Le projet compose est `5`** (l'ID de stack), pas `jellyfin` — lire le label `com.docker.compose.project` avant tout redéploiement, sous peine de créer une pile en double.

### Retour arrière

1. Décommenter la ligne 36 de `/etc/fstab` (sauvegarde `/etc/fstab.bak-260830`)
2. `sudo systemctl disable --now kdrive-video.service`
3. Restaurer `docker-compose.yml.bak-260830` et redéployer

Tant que le NAS n'a pas été vidé, le retour arrière est complet.

### À signaler, hors périmètre

`/home/debian/jellyfin/config` (688 Mo — tout l'historique de visionnage et les métadonnées) **n'est pas dans `vps_backup.sh`**, qui ne couvre que BookStack, Immich, Joplin, Mealie, Readeck, Baïkal et `~/Documents`. Cela se compresserait bien. À traiter séparément.