Je vais présenter ici les scripts que j’utilise pour encoder des séries, pour pouvoir les stocker et les regarder sur PC sans avoir à changer de DVD au bout de 4-5 épisodes. Pour cela j’ai un script qui copie le DVD sur le disque dur, un autre qui m’affiche ses infos et enfin 2 script pour l’encodage suivant la façon dont les épisodes sont découpés (par chapitres ou par titres).

Pour l’encodage j’utilise un « PC » Quad core mais avec pour sortie vidéo une liaison série, il faut donc que tout se passe en console.

Les logiciels utilisés sont ddrescue pour copier le DVD et essayer de corriger les erreurs s’il est rayé, mplayer pour acquérir les infos sur le DVD et HandBrakeCLI pour l’encodage.

Prérequis

Installer le ppa pour handbrake
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:stebbins/handbrake-releases

Installer les différents paquets :
sudo apt-get install mplayer gddrescue handbrake-cli

Activer la lecture des dvds protégés :
sudo /usr/share/doc/libdvdread4/install-css.sh

Scripts utilisés

Le premier script copie donc le DVD sur le disque dur :

[bash]#!/bin/bash

INPUT="/dev/dvd"

if [ -z "$1" ]
then
NOM_DVD=`mplayer -dvd-device "$INPUT" dvd:// -frames 0 -msglevel identify=6 2>>/dev/null |grep "ID_DVD_VOLUME_ID"| sed "s/ID_DVD_VOLUME_ID=//"`
else
NOM_DVD="$1"
fi
echo "Sauvegarde du dvd : $NOM_DVD"

ddrescue -B -n -b2048 "$INPUT" "$NOM_DVD.iso" "ddrescue.log" 2>>/dev/null
ddrescue -B -d -r 0 -b2048 "$INPUT" "$NOM_DVD.iso" "ddrescue.log" 2>>/dev/null
ddrescue -B -d -r 0 -R -b2048 "$INPUT" "$NOM_DVD.iso" "ddrescue.log" 2>>/dev/null

rm ddrescue.log

[/bash]

Ensuite le script qui affiche les informations sur le dvd :

[bash]#!/bin/bash
mplayer -dvd-device "$1" dvd:// -frames 0 -msglevel identify=6 2>>/dev/null|grep "ID_DVD"

[/bash]

Ensuite un script d’encodage permettant de découper les épisodes lorsqu’ils sont tous dans le même titre, le script détecte le titre le plus long et découpe les épisode en fonction de la configuration #Config qui indique l’index de départ ainsi que le modulo, par exemple pour un épisode contenant 4 chapitres (intro,1ere partie,2e partie, fin) le modulo est de 4, pour une suite d’épisode complet ce sera 1.

[bash]
#!/bin/bash

#Utilisation :
#encode_dvd_modulo.sh nom_du_fichier.iso

NOM_DU_FICHIER_ISO=$1
NOM_DU_FICHIER_RIP="${NOM_DU_FICHIER_ISO%.*}_Ep"

echo "*******************************"
echo NOM_DU_FICHIER_ISO : $NOM_DU_FICHIER_ISO
echo "*******************************"

#Config
START=1
MODULO=4
PISTE_AUDIO=2

#Nombre de Titres
TITRE_LONG=0
TITRE_A_RIP=0
TITRE_TOTAL=`mplayer -dvd-device "$NOM_DU_FICHIER_ISO" dvd:// -frames 0 -msglevel identify=6 -lavdopts threads=4 2>>/dev/null |grep "ID_DVD_TITLES"| sed -r "s/ID_DVD_TITLES=([0-9]+)/\\1/"`
echo "*******************************"
echo Titre total : $TITRE_TOTAL
echo "*******************************"
#nombre de chapitres du titre 2 :
for IX in `seq 1 $TITRE_TOTAL`;do
echo "*******************************"
echo IX : $IX
echo "*******************************"
LONGUEUR=`mplayer -dvd-device "$NOM_DU_FICHIER_ISO" dvd:// -frames 0 -msglevel identify=6 -lavdopts threads=4 2>>/dev/null |grep "ID_DVD_TITLE_"$IX"_LENGTH"| sed -r "s/ID_DVD_TITLE_"$IX"_LENGTH=([0-9]+)(\\..*)?/\\1/"`
if [ $LONGUEUR -gt $TITRE_LONG ]; then
echo "*******************************"
echo "if [ $LONGUEUR -gt $TITRE_LONG ]; then" $LONGUEUR $TITRE_LONG
echo "*******************************"
NOMBRE_DE_CHAPITRES=`mplayer -dvd-device "$NOM_DU_FICHIER_ISO" dvd:// -frames 0 -msglevel identify=6 -lavdopts threads=4 2>>/dev/null |grep "ID_DVD_TITLE_"$IX"_CHAPTERS"| sed -r "s/ID_DVD_TITLE_"$IX"_CHAPTERS=([0-9]+)/\\1/"`
TITRE_A_RIP=$IX
TITRE_LONG=$LONGUEUR
fi
done
echo "*******************************"
echo titre : $TITRE_A_RIP chapitres : $NOMBRE_DE_CHAPITRES
echo "*******************************"

for IX in `seq $START $NOMBRE_DE_CHAPITRES`;do
if [ `expr $(($IX + 1 – $START)) % $MODULO` -eq 0 ];then
if [ $MODULO -eq 1 ];then
CHAPITRES_A_RIP=$IX
else
CHAPITRES_A_RIP=`expr $IX + 1 – $MODULO`-$IX
fi

HandBrakeCLI -i "$NOM_DU_FICHIER_ISO" -o "$NOM_DU_FICHIER_RIP"$(printf "%02d" $IX).mkv -t $TITRE_A_RIP -c $CHAPITRES_A_RIP -e x264 –x264-tune animation -q 20.0 -a $PISTE_AUDIO -E lame -B 160 -f mkv –detelecine –decomb -m -2
fi

done

[/bash]

Le second script permet l’encodage de plusieurs titres sur un même DVD.

[bash]#!/bin/bash

#Utilisation :
#encode_dvd_multi_titles.sh nom_du_fichier.iso titre1,titre2,titreX numero_de_depart_du_titre_pour_nomage

NOM_DU_FICHIER_ISO=$1
NOM_DU_FICHIER_RIP=`echo "${NOM_DU_FICHIER_ISO%.*}_Ep" | tr " " "_"`

LISTE=`echo "$2" | tr "," " "`

echo "*******************************"
echo NOM_DU_FICHIER_ISO : $NOM_DU_FICHIER_ISO
echo "*******************************"

for IX in $LISTE;do
echo "*******************************"
echo Encodage du fichier $NOM_DU_FICHIER_RIP$(printf "%02d" $(($IX + $3))).mkv
echo "*******************************"
HandBrakeCLI -i "$NOM_DU_FICHIER_ISO" -o $NOM_DU_FICHIER_RIP$(printf "%02d" $(($IX + $3))).mkv -t $IX -e x264 –x264-tune animation -q 20.0 -a 3 -E lame -B 160 -f mkv –detelecine –decomb -m -2
done
[/bash]

Exemple d’utilisation des scripts

Encodage d’une serie

Pour cette série j’encode les 2 pistes audio, et les 2 pistes de sous-titres, par défaut je mets la langue française et les sous-titres forcées pour cette langue (c’est une série d’animation avec certains passages censurés dans sa version française)
La config handbrake du script :
HandBrakeCLI -i "$NOM_DU_FICHIER_ISO" -o $NOM_DU_FICHIER_RIP$(printf "%02d" $(($IX + $3))).mkv -t $IX -s 2,1 --subtitle-default 1 -e x264 --x264-tune animation -q 20.0 -a 1,2 -E lame -B 160 -f mkv --detelecine --decomb -m -2 -T
La commande utilisée avec le script
./encode_dvd_multi_titles.sh RANMA_KOL_19_SCN.iso 2,3,4,5,7,8 96

Script complémentaire

Changement des pistes audio et sous-titres par défaut

Le script suivant permet de modifier les pistes lues par défaut pour par exemple passer d’une langue française avec les sous-titres pour cette langue à une langue japonaise avec sous-titres français.
[bash]
#!/bin/bash
for FILE in *.mkv
do
#mkvpropedit $FILE –edit track:a1 –set flag-default=1 –edit track:a2 –set flag-default=0 –edit track:s1 –set flag-default=1 –edit track:s2 –set flag-default=0
mkvpropedit $FILE –edit track:a1 –set flag-default=0 –edit track:a2 –set flag-default=1 –edit track:s1 –set flag-default=0 –edit track:s2 –set flag-default=1
done
[/bash]