Synology [Obsolète] [Tuto] Installation de Jellyfin + Transcodage matériel (HW) + Proxy Ngnix HTTPS ( Docker-compose )

EVO

Administreur
Membre du personnel
25 Novembre 2019
8 160
1 563
278
/var/run/docker.sock
Informations: N'ayant plus de NAS Synology, ce tutoriel n'est plus maintenu.
Vous pouvez toujours consulter : [Tuto] Installation de Jellyfin + Transcodage matériel (HW) + Acces HTTPS en Docker

Bonjour,
Voici un tuto, pour ceux qui souhaiterai installer Jellyfin en docker, avec un accès externe en HTTPS.

fRgGkBt.png


Nous allons ici utiliser docker-compose, cette solution ne pourra donc ce faire, uniquement sur un NAS ou est possible d'installer Docker.

Le but de ce tuto sera de rendre cette installation facile et accessible a tous, bien que loin d’être un expert de docker/docker-compose, n’hésiter pas à répondre à ce sujet avec vos interrogations, ..
Pour ceux qui sont plus a l'aise avec ce genre d'installation, n'hésiter pas a proposer des améliorations, ou des conseils, ...

Pré-requis :
Avoir installé le paquet Docker
Avoir un accès SSH au Synology*
Dans docker : télécharger l'image linuxserver/jellyfin:latest et nginxinc/nginx-unprivileged:alpine
Posséder un nom de domaine

* Pour faire cette manip, il vous faudra vous connecter en SSH à votre NAS, si vous ne savez pas le faire, vous trouverez ici un tuto explicatif : [Tuto] Acceder à son NAS en lignes de commande.

A modifier selon votre installation :
Toute mon installation, va ce faire dans un dossier partagé "docker" situé sur "@volume1"
Je vais donc installer jellyfin dans /volume1/docker/jellyfin
Les PUID/PGID de mon compte utilisateur sont : PUID=9999 PGID=111**
Le nom de domaine utilisé pour l'exemple sera : tutoevo.fr

** Pour connaitre le PUID/GUID de l'utilisateur : [Tuto] Connaitre le PUID / PGID d'un utilisateur.

Sommaire :
1/ Créer les dossiers nécessaires
2/ Mise en place de la config nginx
3/ Création du fichier "docker-compose.yml"
4/ Création des conteneurs avec docker-compose



1/ Créer les dossiers nécessaires
Comme dit au dessus, les chemins sont basé sur mon installation, à adapter selon votre installation.

Voici les dossiers a créer :
- /volume1/docker/jellyfin/config
- /volume1/docker/jellyfin/cache

2/ Mise en place de la config nginx
Dans le dossier /volume1/docker/jellyfin, nous allons créer un fichier "jellyfin_nginx.conf" avec comme contenu :

Code:
server {
  listen 8080;
  server_name _;
 
    location / {
        # Proxy main Jellyfin traffic
        proxy_pass http://jellyfin:8096;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Protocol $scheme;
        proxy_set_header X-Forwarded-Host $http_host;

        # Disable buffering when the nginx proxy gets very resource heavy upon streaming
        proxy_buffering off;
    }
    location /socket {
        # Proxy Jellyfin Websockets traffic
        proxy_pass http://jellyfin:8096/socket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Protocol $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
    }
}

( Attention : Remplacer 2x "jellyfin:8096" par IP_DU_NAS:8096 et dans server_name _; remplacer _ par votre ip public ou nom de domaine. )


3/ Création du fichier "docker-compose.yml"
Nous allons maintenant créer un fichier "docker-compose.yml" avec les paramètres des conteneurs.
Celui-ci est a placer dans /volume1/docker/jellyfin.

Voici mon fichier "docker-compose.yml" :
Code:
version: "3" 

services: 
  jellyfin: 
    image: linuxserver/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    environment:
     - PUID=9999
     - PGID=111
     - TZ=Europe/Paris
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
    networks:
      - jellyfin
    ports:
      - 8096:8096
    expose:
      - 8096
    volumes: 
      - /volume1/docker/jellyfin/config:/config 
      - /volume1/docker/jellyfin/cache:/cache

  nginx:
    image: nginxinc/nginx-unprivileged:alpine
    container_name: jellyfin_proxy
    restart: unless-stopped
    networks:
      - jellyfin
    volumes:
      - /volume1/docker/jellyfin/jellyfin_nginx.conf:/etc/nginx/conf.d/default.conf:ro
    ports:
      - "8083:8080"

networks:
  jellyfin:
    external:
      name: jellyfin

On peut y voir 2 services "jellyfin" et "ngnix".
Dans le service "jellyfin" vous allez devoir porter votre attention sur :
- PUID=9999, à modifier avec le PUID de votre utilisateur
- PGID=111, à modifier avec le PUID de votre utilisateur
- /volume1/docker/jellyfin/config:/config, la 1ere partie "/volume1/docker/jellyfin/config" correspond au chemin vers votre dossier /config.
- /volume1/docker/jellyfin/cache:/cache, la 1ere partie "/volume1/docker/jellyfin/cache" correspond au chemin vers votre dossier /cache.
Il vous faudra aussi ajouter les chemins vers vos médias à cette endroit afin que jellyfin puisse y accéder.

Attention :
Si votre NAS n'est pas compatible avec le transcodage hard, il vous faudra enlever ces lignes du fichier :

Code:
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128


Dans le service "ngnix", vous allez devoir porter votre attention sur :
- /volume1/docker/jellyfin/jellyfin_nginx.conf:/etc/nginx/conf.d/default.conf:ro, la 1ere partie "/volume1/docker/jellyfin/jellyfin_nginx.conf" correspond au chemin vers le fichier de configuration "jellyfin_nginx.conf" que nous avons créer avant.

Une fois les modifications effectuées, enregistrer votre fichier sous le nom : docker-compose.yml
Puis charger le fichier sur votre NAS ( chez moi, il se trouve dans /volume1/docker/jellyfin )

3/ Création des conteneurs avec docker-compose
En SSH, 1ere chose, je passe en mode administrateur avec la commande :

Le mot de passe admin vous est demandé.

Dans mon dossier /volume1/docker/jellyfin, j'ai chargé mon fichier docker-compose.yml. Je vais donc accéder à ce dossier, pour cela je fait :
cd /volume1/docker/jellyfin

Ensuite, afin "d’exécuter" mon fichier docker-compose.yml, je tape en ssh :
sudo docker-compose up -d

La création des conteneurs se fait, ils deviennent visible dans l'appli "Docker" de DSM. Si tout se passe bien, ils doivent apparaître démarrer dans Docker.

Il est maintenant possible d’accéder à jellyfin depuis l'adresse http://ADRESSE_IP_DU_NAS:8096 et de configurer Jellyfin.

Dans les paramètres réseaux de Jellyfin, il vous faudra Autoriser les connexions distantes à ce serveur Jellyfin
Z8sfPa5.png

et sélectionner le mode de connexion sécurisé : Gérée par un proxy inversé
g5qAddb.png


4/ Accéder à Jellyfin en HTTPS grâce au Proxy inversé
Sur DSM, dans panneau de configuration > Portail des Applications > Proxy inversé, vous allez pouvoir accéder aux réglages du proxy.
Dans le "Proxy inversé", nous allons donc rediriger le port 443 ( https ) vers un sous domaine de mon domaine "tutoevo.fr".
Le sous domaine choisi sera : jellyfin.tutoevo.fr ( Pour que cela fonctionne le nom d’hôte doit aussi être créer chez votre fournisseur du nom de domaine ).

Dans l'image ci-dessous, nous avons créé une règle "Jellyfin", allons rediriger le protocole "HTTPS" au nom d’hôte "jellyfin.tutoevo.fr". Nous activons "HTTP/2" et renseignons en destination, soit "localhost" sur le port "8083"
xxJc3wO.png


Dans l'onglet "En-Tête personnalisé" nous allons renseigner les paramètres ci-dessous :
  • Upgrade / $http_upgrade
  • Connection / "upgrade"
  • Host / $host
  • X-Real-IP / $remote_adrr
  • X-Forwarded-For / $proxy_add_x_forwarded_for
  • X-Forwarded-Proto / $scheme
  • X-Forwarded-Protocol / $scheme
  • X-Forwarded-Host / $http_host
Comme dans l'image ci-dessous :
XkoLBVB.png


Voila, maintenant notre installation est aussi accessible depuis l'extérieur via
 
Dernière édition:
Merci pour le tuto, dommage qu'il n'y ait pas de package développé.

Je pense tenter de remplacer mon Plex par Jellyfin, je me pose une question contre : doit-on refaire cette procédure à chaque mise à jour ?

Merci :)
 
Salut,
Non la mise à jour ce fait simplement via Docker. Il suffit de télécharger la nouvelle image, et d'effacer l e conteneur. Il va alors se ré-créer tout seul avec la nouvelle image.

Au besoin j'en ferait un point dans mon tuto.
 
Petite question bête : a quoi servent exactement les "En-Tête personnalisé" dans le reverse proxy :?:
 
Bonjour,

Pour ma part, je bloque au lancement du docker-compose.
2 erreurs différentes, car j'ai essayé de créer les fichiers de conf au début avec vim localement sur le NAS.
Puis avec notepad et notepad++ sous windows

Code:
root@DS918PLUS:/volume1/docker/jellyfin# sudo docker-compose up -d
ERROR: In file './docker-compose.yml', service must be a mapping, not a NoneType.

root@DS918PLUS:/volume1/docker/jellyfin# sudo docker-compose up -d
ERROR: yaml.parser.ParserError: while parsing a block mapping
  in "./docker-compose.yml", line 1, column 1
expected <block end>, but found '<block mapping start>'
  in "./docker-compose.yml", line 3, column 5

Si ça parle à quelqu'un svp ...
 
Salut,
étrange pourtant cela resemble beaucoup aun problème d'encodage, surtout la 2eme erreur !demain j'essaye de rajouter dans le tuto un lien à dl vers mes fichier de configuration, afin d'éviter à avoir à copier coller !
 
je viens de trouver mon erreur, c'était peut-être la variable "Server_name" , j'avais mis "Server" :-(

Par contre, maintenant, j'ai ça :
Code:
root@DS918PLUS:/volume1/docker/jellyfin# sudo docker-compose up -d
ERROR: Network jellyfin declared as external, but could not be found. Please create the network manually using `docker network create jellyfin` and try again.

Il m'embête de faire cette vérif. Tautulli fonctionne bien avec mon nom de domaine externe ... qu'est ce qu'il m’embête lui alors ???
 
Salut
Comme indiquer dans l'erreur tu doit avoir un réseau jellyfin
tu peu le créer depuis l'interface dsm ou avec la commande

Code:
docker network create jellyfin
 
Merci,
c'est bon, j'ai pu poursuivre ton tuto, j'ai un peu galéré à comprendre comment mapper les dossiers multimédia, mais j'ai pu arriver au bout.
Super tuto :)
 
salut tout le monde,

j'ai suivi cet excellent tuto et ca fonctionne...pour le HTTP

seulement pour l'accès HTTPS, faut-il créer un certificat et renseigner un chemin dans les paramètres réseau de jellyfin ? Ou bien y'a t'il une autre méthode que je ne connais pas sur docker ? le paramètre "géré par un proxy inverse" n'as pas l'air d'exister dans cette version de jellyfin (je n'ai pas trouvé)

par ailleurs, dans la partie port du proxy inversé dans les paramètres du syno, j'ai mis le port 8920 (j'ai pour habitude de ne pas laisser de redirection pour le port 443)

La première erreur que j'ai eu en reproduisant la conf (et en ajoutant un certificat P12 à la conf jellyfin) c'est une belle page SSL Error PR_END_OF_FILE_ERROR
La 2ème erreur que j'ai est l'affichage d'une page "Désolé, la page que vous recherchez est introuvable" avec un beau logo synology (ce qui suppose que ca pointe bien sur le nas au minimum)
 
bobaxx a dit:
seulement pour l'accès HTTPS, faut-il créer un certificat et renseigner un chemin dans les paramètres réseau de jellyfin ? Ou bien y'a t'il une autre méthode que je ne connais pas sur docker ? le paramètre "géré par un proxy inverse" n'as pas l'air d'exister dans cette version de jellyfin (je n'ai pas trouvé)

Effectivement dans la nouvelle version de Jellyfin, il faut cocher ceci :
dd4CZCc.png

Il n'y as pas de lien de certificat a indiquer car nous allons les faire sur DSM.

bobaxx a dit:
par ailleurs, dans la partie port du proxy inversé dans les paramètres du syno, j'ai mis le port 8920 (j'ai pour habitude de ne pas laisser de redirection pour le port 443)

Je suis pas sur de comprendre, le but du reverse proxy etant de faire tout paser par le port 443 :)
Dans DSM Securité Certificat, il te faudra générer un certificat pour ton reverse et le Configurer dessus.
 
Merci pour le tuto ça marche de ce coté et avec le https ^^.
Par contre je cherche une solution pour les videos en HDR10 qui ne sont pas très belles sur jellyfin.
Activer le mappage tonale ne donne pas de bons résultats : Erreur de lecture Ce client n'est pas compatible avec le média et le serveur n'envoie pas de format compatible.
 
Petit up j'ai rententé une installation mais lors de l'activation du transcodage matériel dans Jellyfin j'ai toujours Erreur de lecture Ce client n'est pas compatible avec le média et le serveur n'envoie pas de format compatible.

Les vidéos se lisent sans sans le transcodage video par contre le processeur souflotte....

J'ai bidouillé les option rien et ce même en faisant le chmod 666 /dev/dri/renderD128 directement en SSH.
Quelqu'un a une piste ?
 
Salut !Voici la dernière en date (par contre je t'avourais que j'ai un peu tout essayé donc c'est peut être le foutoir ^^):
Pour infos j'ai essayé de voir du coté de FFmpeg mais j'ai fait choux blanc pour l’instant.

1641237316663.png
1641237363699.png
1641237399122.png
1641237418681.png
 
Si tu désactive "Activer le mappage tonal" et "Autoriser l'encodage au format HEVC" le probleme reste identique ?
Sinon dans Journaux, tu devrai egalement trouver des logs de transcodage
 
En décochant rien de bon par contre j'ai ceci dans le joural en rapprot avec le dossier transcode devrais-je le mapper dans les parametres docker ?
20:25:47] [ERR] [10] Jellyfin.Api.Helpers.TranscodingJobHelper: FFmpeg exited with code 1
[20:25:47] [WRN] [10] Jellyfin.Api.Controllers.DynamicHlsController: cannot serve /config/data/transcodes/5289b73464b75d355642222b135eddfc0.ts as transcoding quit before we got there
[20:25:47] [ERR] [10] Jellyfin.Server.Middleware.ExceptionMiddleware: Error processing request: Could not find file '/config/data/transcodes/5289b73464b75d355642222b135eddfc0.ts'. URL GET /videos/99e45aae-5d4e-b90a-858d-b30fc50f1f50/hls1/main/0.ts.
Je met aussi le reste si cela sert
dleware.ResponseTimeMiddleware: Slow HTTP Response from http://192.168.1.80:8096/videos/99e...oCodecNotSupported&allowVideoStreamCopy=false to 172.17.0.1 in 0:00:00.9841907 with Status Code 404
[20:25:46] [INF] [65] Jellyfin.Api.Controllers.MediaInfoController: GetPostedPlaybackInfo profile: {"Name": null, "Id": null, "Identification": null, "FriendlyName": null, "Manufacturer": null, "ManufacturerUrl": null, "ModelName": null, "ModelDescription": null, "ModelNumber": null, "ModelUrl": null, "SerialNumber": null, "EnableAlbumArtInDidl": false, "EnableSingleAlbumArtLimit": false, "EnableSingleSubtitleLimit": false, "SupportedMediaTypes": "Audio,Photo,Video", "UserId": null, "AlbumArtPn": null, "MaxAlbumArtWidth": 0, "MaxAlbumArtHeight": 0, "MaxIconWidth": null, "MaxIconHeight": null, "MaxStreamingBitrate": 120000000, "MaxStaticBitrate": 100000000, "MusicStreamingTranscodingBitrate": 384000, "MaxStaticMusicBitrate": null, "SonyAggregationFlags": null, "ProtocolInfo": null, "TimelineOffsetSeconds": 0, "RequiresPlainVideoItems": false, "RequiresPlainFolders": false, "EnableMSMediaReceiverRegistrar": false, "IgnoreTranscodeByteRangeRequests": false, "XmlRootAttributes": [], "DirectPlayProfiles": [{"Container": "webm", "AudioCodec": "vorbis,opus", "VideoCodec": "vp8,vp9,av1", "Type": "Video", "$type": "DirectPlayProfile"}, {"Container": "mp4,m4v", "AudioCodec": "aac,mp3,opus,flac,vorbis", "VideoCodec": "h264,vp8,vp9,av1", "Type": "Video", "$type": "DirectPlayProfile"}, {"Container": "opus", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "webm", "AudioCodec": "opus", "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "mp3", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "aac", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "m4a", "AudioCodec": "aac", "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "m4b", "AudioCodec": "aac", "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "flac", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "webma", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "webm", "AudioCodec": "webma", "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "wav", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "ogg", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}], "TranscodingProfiles": [{"Container": "ts", "Type": "Audio", "VideoCodec": null, "AudioCodec": "aac", "Protocol": "hls", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 1, "SegmentLength": 0, "BreakOnNonKeyFrames": true, "$type": "TranscodingProfile"}, {"Container": "aac", "Type": "Audio", "VideoCodec": null, "AudioCodec": "aac", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "mp3", "Type": "Audio", "VideoCodec": null, "AudioCodec": "mp3", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming",
;49m"EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "opus", "Type": "Audio", "VideoCodec": null, "AudioCodec": "opus", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "wav", "Type": "Audio", "VideoCodec": null, "AudioCodec": "wav", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "opus", "Type": "Audio", "VideoCodec": null, "AudioCodec": "opus", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "mp3", "Type": "Audio", "VideoCodec": null, "AudioCodec": "mp3", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "aac", "Type": "Audio", "VideoCodec": null, "AudioCodec": "aac", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "wav", "Type": "Audio", "VideoCodec": null, "AudioCodec": "wav", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "ts", "Type": "Video", "VideoCodec": "h264", "AudioCodec": "aac,mp3", "Protocol": "hls", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 1, "SegmentLength": 0, "BreakOnNonKeyFrames": true, "$type": "TranscodingProfile"}, {"Container": "webm", "Type": "Video", "VideoCodec": "vpx", "AudioCodec": "vorbis", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "mp4", "Type": "Video", "VideoCodec": "h264", "AudioCodec": "aac,mp3,opus,flac,vorbis", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": null, "MinSegments":
9m0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}], "ContainerProfiles": [], "CodecProfiles": [{"Type": "VideoAudio", "Conditions": [{"Condition": "Equals", "Property": "IsSecondaryAudio", "Value": "false", "IsRequired": false, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": "aac", "Container": null, "$type": "CodecProfile"}, {"Type": "VideoAudio", "Conditions": [{"Condition": "Equals", "Property": "IsSecondaryAudio", "Value": "false", "IsRequired": false, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": null, "Container": null, "$type": "CodecProfile"}, {"Type": "Video", "Conditions": [{"Condition": "NotEquals", "Property": "IsAnamorphic", "Value": "true", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "EqualsAny", "Property": "VideoProfile", "Value": "high|main|baseline|constrained baseline", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "LessThanEqual", "Property": "VideoLevel", "Value": "51", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "NotEquals", "Property": "IsInterlaced", "Value": "true", "IsRequired": false, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": "h264", "Container": null, "$type": "CodecProfile"}, {"Type": "Video", "Conditions": [{"Condition": "NotEquals", "Property": "IsAnamorphic", "Value": "true", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "EqualsAny", "Property": "VideoProfile", "Value": "main", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "LessThanEqual", "Property": "VideoLevel", "Value": "120", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "NotEquals", "Property": "IsInterlaced", "Value": "true", "IsRequired": false, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": "hevc", "Container": null, "$type": "CodecProfile"}], "ResponseProfiles": [{"Container": "m4v", "AudioCodec": null, "VideoCodec": null, "Type": "Video", "OrgPn": null, "MimeType": "video/mp4", "Conditions": [], "$type": "ResponseProfile"}], "SubtitleProfiles": [{"Format": "vtt", "Method": "External", "DidlMode": null, "Language": null, "Container": null, "$type": "SubtitleProfile"}, {"Format": "ass", "Method": "External", "DidlMode": null, "Language": null, "Container": null, "$type": "SubtitleProfile"}, {"Format": "ssa", "Method": "External", "DidlMode": null, "Language": null, "Container": null, "$type": "SubtitleProfile"}], "$type": "DeviceProfile"}
[20:25:46] [INF] [65] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for 8admin8. EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[20:25:46] [INF] [65] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, Path: /data/series/Supernatural/Supernatural - S01/Supernatural - S01E01 - 1080p.mkv, isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[20:25:46] [INF] [65] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, No video direct play profiles found for /data/series/Supernatural/Supernatural - S01/Supernatural - S01E01 - 1080p.mkv with codec hevc
[20:25:47] [INF] [66] Jellyfin.Api.Controllers.DynamicHlsController: Current HLS implementation doesn't support non-keyframe breaks but one is requested, ignoring that request
[20:25:47] [INF] [66] Jellyfin.Api.Helpers.TranscodingJobHelper: /usr/lib/jellyfin-ffmpeg/ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i file:"/data/series/Supernatural/Supernatural - S01/Supernatural - S01E01 - 1080p.mkv" -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_vaapi -b:v 7803320 -maxrate 7803320 -bufsize 15606640 -profile:v:0 high -level 41 -force_key_frames:0 "expr:gte(t,0+n_forced*3)" -vf "format=nv12|vaapi,hwupload,scale_vaapi=format=nv12" -start_at_zero -vsync -1 -codec:a:0 aac -ac 2 -ab 384000 -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 0 -hls_segment_filename "/config/data/transcodes/5289b73464b75d355642222b135eddfc%d.ts" -hls_playlist_type vod -hls_list_size 0 -y "/config/data/transcodes/5289b73464b75d355642222b135eddfc.m3u8"
[20:25:47] [ERR] [10] Jellyfin.Api.Helpers.TranscodingJobHelper: FFmpeg exited with code 1
[20:25:47] [WRN] [10] Jellyfin.Api.Controllers.DynamicHlsController: cannot serve /config/data/transcodes/5289b73464b75d355642222b135eddfc0.ts as transcoding quit before we got there
[20:25:47] [ERR] [10] Jellyfin.Server.Middleware.ExceptionMiddleware: Error processing request: Could not find file '/config/data/transcodes/5289b73464b75d355642222b135eddfc0.ts'. URL GET /videos/99e45aae-5d4e-b90a-858d-b30fc50f1f50/hls1/main/0.ts.
[20:25:47] [WRN] [10] Jellyfin.Server.Middleware.ResponseTimeMiddleware: Slow HTTP Response from http://192.168.1.80:8096/videos/99e...ioStreamCopy=false&allowAudioStreamCopy=false to 172.17.0.1 in 0:00:00.7322505 with Status Code 404
[20:25:48] [WRN] [65] Jellyfin.Server.Middleware.ResponseTimeMiddleware: Slow HTTP Response from http://192.168.1.80:8096/Sessions/Playing/Progress to 172.17.0.1 in 0:00:01.584694 with Status Code 204
[20:25:48] [INF] [48] Emby.Server.Implementations.Session.SessionManager: Playback stopped reported by app Jellyfin Web 10.7.6 playing La dame blanche. Stopped at 0 ms
[20:25:49] [WRN] [48] Jellyfin.Server.Middleware.ResponseTimeMiddleware: Slow HTTP Response from http://192.168.1.80:8096/Sessions/Playing/Stopped to 172.17.0.1 in 0:00:01.9658355 with Status Code 204
 
Je suis idiot le dossier /config est deja monté et il y a bien un dossier transcode de plus l'utilisateur y a bien accès.