Skip to content

Latest commit

Β 

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🎬 Tdarr Custom JS

Un script Custom JS Function pour Tdarr qui nettoie intelligemment les pistes avant FFmpeg : audio, sous-titres, covers, attachments et metadata parasites.

L'objectif principal n'est pas le flow fourni, mais le moteur de decision contenu dans Custom JS. Les flows JSON sont seulement des exemples adaptes a un setup AV1 personnel.

Fichier source MKV
   β”‚
   β”œβ”€ πŸŽ₯ Video principale          -> conservee pour encodage AV1
   β”œβ”€ πŸ”Š Audios multiples          -> analyse, tri, nettoyage, AC3 propre
   β”œβ”€ πŸ’¬ Sous-titres valides       -> conserves en copy
   β”œβ”€ ⚠️ Sous-titres non fiables   -> supprimes avant FFmpeg
   β”œβ”€ πŸ–ΌοΈ Covers / attached pictures -> supprimees
   └─ πŸ“Ž Attachments utiles         -> polices conservees, parasites retires

✨ Ce Que Fait Le Script

🧠 Nettoyage Intelligent Avant FFmpeg

Le script agit sur args.variables.ffmpegCommand.streams juste avant ffmpegCommandExecute.

Il ne lance pas FFmpeg lui-meme. Il modifie la commande que Tdarr va construire :

Tdarr detecte les streams
        ↓
Custom JS analyse chaque piste
        ↓
Custom JS marque quoi garder / supprimer / encoder
        ↓
Tdarr genere la commande FFmpeg finale

RΓ©sultat : FFmpeg recoit une commande plus propre, avec moins de risques de crash.

πŸ”Š Gestion Audio

🎯 Objectif

Garder une selection audio utile, lisible, ordonnee, puis encoder les pistes conservees en AC3 256k.

Audios source
   β”œβ”€ πŸ‡«πŸ‡· VFF fiable       -> prioritaire
   β”œβ”€ πŸ‡¨πŸ‡¦ VFQ              -> supprimee si VFF fiable existe
   β”œβ”€ πŸ‡¬πŸ‡§ VO anglaise       -> conservee si pertinente
   β”œβ”€ πŸ‡―πŸ‡΅ japonais          -> conserve si present
   β”œβ”€ 🌍 langue originale  -> conservee si pertinente
   β”œβ”€ πŸ‘‚ audio-description -> supprimee
   β”œβ”€ πŸŽ™οΈ commentaire       -> supprime
   └─ 🎼 music only        -> supprime

βœ… Pistes Audio Favorisees

Le script favorise :

  • les pistes francaises fiables (fr, fra, fre, marqueurs VFF, VFI, etc.)
  • les pistes anglaises
  • les pistes japonaises
  • une langue originale pertinente si elle sort des langues principales
  • les pistes non taguees protegees quand les metadata sont trop pauvres pour les supprimer sans risque

❌ Pistes Audio Supprimees

Le script supprime notamment :

  • audio-description
  • commentary / commentaire audio
  • music only / isolated score
  • doublons moins bons dans une meme langue
  • VFQ si une VFF fiable existe
  • langues hors cible quand une langue originale pertinente a deja ete choisie

🏷️ Titres Audio Generes

Les pistes conservees sont renommees proprement :

VFF - AC3 5.1
VO - AC3 5.1
JA - AC3 2.0
Unknown - AC3 unknown

πŸ” Encodage Audio

Chaque audio conservee recoit :

-c:{outputIndex} ac3 -b:{outputIndex} 256k

La piste par defaut est choisie en priorite :

VFF fiable standard
  > francais fiable
  > francais detecte
  > anglais standard
  > autre piste standard

πŸ’¬ Gestion Sous-Titres

🎯 Objectif

Conserver les sous-titres utiles sans conversion, mais supprimer les pistes dangereuses qui peuvent faire planter FFmpeg.

Le script ne fait pas :

-c:s copy

Il applique un copy piste par piste uniquement aux codecs valides.

βœ… Sous-Titres Conserves

Whitelist actuelle :

Codec Usage typique Action
subrip / srt SRT texte βœ… copy
ass / ssa sous-titres styles βœ… copy
hdmv_pgs_subtitle / pgssub PGS Blu-ray βœ… copy en passe normale
dvd_subtitle DVD/VobSub βœ… copy
dvb_subtitle DVB βœ… copy
xsub DivX/XSUB βœ… copy

Commande appliquee :

-c:{outputIndex} copy

πŸ›‘ Sous-Titres Supprimes

Le script supprime :

Codec / etat Pourquoi
none FFmpeg ne sait pas quel codec ecrire
unknown risque de mux impossible
webvtt cas observe : S_TEXT/WEBVTT non supporte par le FFmpeg utilise
hdmv_pgs_subtitle / pgssub supprime seulement en fallback si la premiere passe FFmpeg echoue
codec vide piste incomplete ou mal detectee
codec absent de la whitelist approche defensive anti-crash

πŸ” Fallback Deux Passes

Les flows fournis utilisent une strategie conservatrice :

Passe 1 : garder les sous-titres valides, y compris PGS
   └─ si FFmpeg reussit : fichier conserve au maximum
   └─ si FFmpeg echoue : fallback automatique

Passe 2 : retirer les sous-titres image-based
   └─ PGS / DVD / DVB / XSUB retires
   └─ SRT / ASS / SSA conserves

Cela evite de supprimer inutilement un sous-titre PGS force sain, tout en empechant un PGS casse de faire echouer definitivement le job.

🧯 Crashs Corriges

Le script vise directement ces erreurs :

Unknown/unsupported AVCodecID S_TEXT/WEBVTT
Could not find codec parameters for stream X (Subtitle: none)
Subtitle codec 0 is not supported
Multiple -codec options specified

Illustration :

Avant
  -map 0:3 -c:2 copy       βœ… SRT
  -map 0:4 -c:3 copy       ❌ WebVTT detecte comme none
  -c:s copy                ❌ double regle globale
  => crash possible

Apres
  -map 0:3 -c:2 copy       βœ… SRT seulement
  0:4 supprime             βœ… pas de crash codec 0
  pas de -c:s copy         βœ… pas de conflit

πŸ“Ž Gestion Attachments

βœ… Attachments Conserves

Les polices sont conservees pour ne pas casser les sous-titres ASS/SSA :

  • .ttf
  • .otf
  • .woff
  • .woff2
  • mimetypes de police connus

🧹 Attachments Supprimes

Le script retire :

  • covers image
  • attachments none
  • attachments unknown
  • attachments sans nom et sans mimetype
  • images integrees exposees comme attachments
πŸ“Ž Fonts utiles     -> conservees
πŸ–ΌοΈ Cover.jpg        -> supprimee
❓ Attachment none  -> supprime

πŸ–ΌοΈ Covers Exposees Comme Video

Certains MKV exposent les covers comme de faux streams video :

Stream #0:5: Video: mjpeg ... (attached pic)

Le script les detecte et les supprime :

πŸŽ₯ vraie video HEVC/H264 -> conservee
πŸ–ΌοΈ cover MJPEG/PNG      -> supprimee

Cela evite qu'une image de jaquette soit mappee comme une piste video utile.

🧾 Logs Produits

Le script log ses decisions principales :

Removed audio stream indexes: 2
Remaining audio stream indexes: 1
Preserved subtitle stream indexes unchanged: 3, 5
Removed unsupported subtitle stream indexes: 4
Removed attachment-like stream indexes: 9
Removed attached-picture video stream indexes: 6
Default audio stream index: 1 (VFF - AC3 5.1)
Audio display order: 1:fr

Lecture rapide :

Log Signification
Removed audio stream indexes audios nettoyees
Remaining audio stream indexes audios encodees en sortie
Preserved subtitle... sous-titres copies tels quels
Removed unsupported subtitle... sous-titres dangereux retires
Removed attachment-like... covers/attachments parasites retires
Default audio stream... piste audio par defaut

πŸ›‘οΈ Philosophie De Fiabilite

Le script est volontairement defensif.

Pour les sous-titres, il prefere :

supprimer une piste douteuse
plutot que faire planter tout l'encodage

Pour l'audio, il prefere :

garder une piste non taguee si elle est impossible a classifier
plutot que supprimer une piste potentiellement importante

Pour les attachments, il prefere :

conserver les polices utiles
supprimer les images/covers parasites

πŸ“ Fichiers Fournis

Fichier Role
Custom JS source principale du script
Flow/FILMS - AV1.json exemple de flow Films adapte a mon setup
Flow/SERIES - AV1.json exemple de flow Series adapte a mon setup

Les flows sont secondaires : ils montrent une integration possible, mais le coeur du projet est le fichier Custom JS.

⚠️ Limites Connues

Le script ne repare pas un flux physiquement corrompu.

En passe normale, les PGS sont conserves. Dans les flows fournis, si FFmpeg echoue, une seconde passe retire les sous-titres image-based pour sauver le transcode. Si le fichier echoue encore apres cette seconde passe, il faut probablement remuxer/reparer le fichier source avec MKVToolNix avant Tdarr.

πŸ§ͺ Debug Avance

Pour obtenir plus de logs audio, passer :

const VERBOSE_AUDIO_LOGS = false;

a :

const VERBOSE_AUDIO_LOGS = true;

Puis remettre false apres analyse.

πŸš€ Mini Tuto Installation

Methode recommandee : coller seulement le JS

  1. Ouvrir ton flow Tdarr.
  2. Placer Custom JS Function juste avant ffmpegCommandExecute.
  3. Coller tout le contenu de Custom JS.
  4. Dans tes ffmpegCommandCustomArguments, retirer :
-c:s copy
  1. Verifier que le chemin logique reste :
ffmpegCommandCustomArguments -> Custom JS Function -> Execute

Importer Les Flows Fournis

Tu peux aussi importer :

  • Flow/FILMS - AV1.json
  • Flow/SERIES - AV1.json

Mais ces flows sont adaptes a un setup personnel :

  • sortie Radarr : /mnt/media/tdarr/watch/radarr
  • sortie Sonarr : /mnt/media/tdarr/watch/sonarr
  • profils AV1 NVENC personnels

βœ… Verification Rapide

Depuis ce dossier :

node --check "Custom JS"

Verifier les JSON :

node -e "for (const f of ['Flow/FILMS - AV1.json','Flow/SERIES - AV1.json']) JSON.parse(require('fs').readFileSync(f,'utf8')); console.log('JSON OK')"

Verifier que les flows n'ont plus -c:s copy :

node -e "for (const f of ['Flow/FILMS - AV1.json','Flow/SERIES - AV1.json']) console.log(f, !require('fs').readFileSync(f,'utf8').includes('-c:s copy'))"

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors