[Contribution] boxIT : Un fichier HD MKV pour votre Freebox

Autres projets et contributions
Avatar de l’utilisateur
Feng
yeomen
Messages : 273
Inscription : mer. 07 avr. 2010, 20:19

[Contribution] boxIT : Un fichier HD MKV pour votre Freebox

Message par Feng » dim. 25 avr. 2010, 20:48

Bonjour,

Après avoir essayé de lire un fichier mkv HD sur la freebox HD, j'ai été confronté à des sacades, du à l'encodage audio du mkv. J'ai donc créé un script permettant de :

- Supprimer un ou tous les sous-titres dans le fichier mkv
- Supprimer une ou toutes les pistes DTS dans le fichier mkv (les canaux DTS ne pouvant être lus par la Freebox HD)
- Convertir une ou toutes les pistes DTS en son AC3

Pour fonctionner, ce script a besoin des paquets suivants :

zenity , mkvtoolnix , libdca , aften

Le script ( Fichier boxit à placer dans /usr/local/bin et à chmod 755) :

Code : Tout sélectionner

#!/bin/sh
# boxIT : Convertisseur de fichier MKV pour la Freebox HD
# Script développé par MASSUCHETTI Jonathan
# Si vous améliorez ce script, merci de m'en faire pars : jonathan.massuchetti@gmail.com
# Si vous redistribuez ce script, ne supprimez pas ces informations, et ajoutez les votres

FILE=$1

if [[ $FILE == "" ]]
then
    FILE=`zenity --file-selection --title="Sélectionnez le fichier à traiter"`
fi

if [[ $? -eq 1 ]]
then
	kill $$
fi

info=`mkvmerge -i $FILE | grep audio | grep DTS`

if [ -z $info ]
then
    zenity --info --title="boxIT" --text="Aucun canal DTS détecté" ; exit 1
fi

base=`basename $FILE`
TMP=`zenity --file-selection --directory --title="Sélectionnez le répertoire de destination"`

if [[ $? -eq 1 ]]
then
	kill $$
fi

#### Options d'empaquetage

## Sous-titres

list=`mkvmerge -i $FILE | grep subtitles`
list=$(echo "$list ")
echo "100" |
zenity --progress \
	   --title="boxIT" \
	   --text="Analyse du fichier en cours" \
	   --pulsate \
	   --auto-close
   
sub=$(echo $list | sed 's/\(Track ID \([1-9]\+\): \(\([a-zA-Z0-9_-]\+ *\) ([a-zA-Z0-9_-/]\+)\)\)\+/'TRUE' \2 "\3"/g' | 
	  xargs zenity --list \
		   --checklist \
		   --separator="," \
		   --title="boxIT" \
		   --text="Quels sous-titres voulez-vous empaqueter ?" \
		   --column="" \
		   --column="ID" \
		   --column="Nom de la piste de sous-titres")

if [ -z $sub ]
then
	OPT_S="-S"
else
	OPT_S="-s $sub"
fi

## DTS à Conserver

list=`mkvmerge -i $FILE | grep audio | grep DTS`
list=$(echo "$list ")
echo "100" |
zenity --progress \
	   --title="boxIT" \
	   --text="Analyse du fichier en cours" \
	   --pulsate \
	   --auto-close
   
dts=$(echo $list | sed 's/\(Track ID \([1-9]\+\): \(\([a-zA-Z0-9_-]\+ *\) ([a-zA-Z0-9_-/]\+)\)\)\+/'TRUE' \2 "\3"/g' | 
	  xargs zenity --list \
		   --checklist \
		   --separator="," \
		   --title="boxIT" \
		   --text="Quelles pistes audios DTS voulez-vous empaqueter ?" \
		   --column="" \
		   --column="ID" \
		   --column="Nom de la piste de sous-titres")

if [ -z $dts ]
then
	OPT_A="-A"
else
	OPT_A="-a $dts"
fi

#### Choix des Canaux DTS à Convertir

	list=`mkvmerge -i $FILE | grep audio | grep DTS`
	list=$(echo "$list ")
	echo "100" |
	zenity --progress \
		   --title="boxIT" \
		   --text="Analyse du fichier en cours" \
		   --pulsate \
		   --auto-close
   
dts=$(echo $list | sed 's/\(Track ID \([1-9]\+\): \(\([a-zA-Z0-9_-]\+ *\) ([a-zA-Z0-9_-/]\+)\)\)\+/'TRUE' \2 "\3"/g' | 
	  xargs zenity --list \
		   --checklist \
		   --separator=" " \
		   --title="boxIT" \
		   --text="Choisissez les pistes audios à convertir" \
		   --column="" \
		   --column="ID" \
		   --column="Nom du canal Audio")

for id in $dts
do
	(
	mkvextract tracks $FILE $id:"$TMP/$base-$id.dts" &
	pid=$!
	kill -0 $pid
	while [[ $? -eq 0 ]]
	do
		size=`stat -c %s $TMP/$base-$id.dts`
		let "mo = $size / 1048576 "
		echo "# Extraction du canal DTS #$id vers $TMP/$base-$id.dts\nCela prend environ 5 minutes\nTaille du fichier : $mo Mo / ~ 1000 Mo" ; sleep 2 ; kill -0 $pid
	done
	) | 	
	zenity --progress \
		   --title="boxIT" \
		   --text="Extraction du canal DTS #$id vers $TMP/$base-$id.dts\nCela prend environ 5 minutes" \
		   --pulsate \
		   --auto-close
		   
	if [[ $? -eq 1 ]]
	then
		kill $pid ; kill $$
	fi
done

zenity --info --title="boxIT" --timeout="3" --text="L'extraction des canaux DTS est maintenant terminée"

for id in $dts
do
	(
	dcadec -o wavall $TMP/$base-$id.dts | aften -b 640 - $TMP/$base-$id.ac3 &
	pid=$!
	kill -0 $pid
	while [[ $? -eq 0 ]]
	do
		size=`stat -c %s $TMP/$base-$id.ac3`
		let "mo = $size / 1048576 "
		echo "# Convertion du canal DTS #$id vers $TMP/$base-$id.ac3\nCela prend environ 15 minutes\nTaille du fichier : $mo Mo / ~ 750 Mo" ; sleep 2 ; kill -0 $pid
	done
	) | 	
	zenity --progress \
		   --title="boxIT" \
		   --text="Convertion du canal DTS $id vers $TMP/$base-$id.ac3\nCela prend environ 15 minutes" \
		   --pulsate \
		   --auto-close
	
	if [[ $? -eq 1 ]]
	then
		kill $pid ; kill $$
	fi
	AC3_FILES=$(echo "$AC3_FILES $TMP/$base-$id.ac3")
done

zenity --info --title="boxIT" --timeout="3" --text="La convertion des canaux DTS est maintenant terminée"
zenity --info --title="boxIT" --timeout="3" --text="Nous allons maintenant procéder à l'empaquetage du nouveau fichier MKV.
Les pistes précédemments converties seront automatiquement ajoutées au paquetage"

##### Empaquetage Final
(
mkvmerge -o $TMP/$base-BOXED.mkv $OPT_A $OPT_S $FILE $AC3_FILES &
pid=$!
kill -0 $pid
while [[ $? -eq 0 ]]
do
	size=`stat -c %s $TMP/$base-BOXED.mkv`
	let "mo = $size / 1048576 "
	echo "# Empaquetage du fichier final : $TMP/$base-BOXED.mkv\nCela prend environ 15 minutes\nTaille du fichier : $mo Mo" ; sleep 2 ; kill -0 $pid
done
) | 	
zenity --progress \
	   --title="boxIT" \
	   --text="Empaquetage du fichier final : $TMP/$base-BOXED.mkv\nCela prend environ 15 minutes" \
	   --pulsate \
	   --auto-close
		   
	if [[ $? -eq 1 ]]
	then
		kill $pid ; kill $$
	fi
	
zenity --info --title="boxIT" --text="L'empaquetage est terminé"
zenity --question --title="boxIT" --text="Effacer les fichiers temporaires ?"
if [[ $? -eq 0 ]]
then
	rm -f $TMP/$base-*.ac3
	rm -f $TMP/$base-*.dts
fi

exit 0;
Le menu service Dolphin ( boxIT.desktop à placer dans /usr/share/kde4/services/ServiceMenus/ ou ~/.kde4/share/kde4/services/ServiceMenus )

L'icône pour le menu : http://pix.toile-libre.org/upload/origi ... 241805.png
A placer dans /usr/share/icons ou dans ~/.icons

Le chemin donné dans le script est /usr/share/icons/free.png , si vous n'utilisez pas ce chemin pour votre icône, pensez à le changer.

Code : Tout sélectionner

[Desktop Action boxIT]
Exec=boxit %u
Icon=/usr/share/icons/free.png
Name=Convertir pour la FreeBox HD

[Desktop Entry]
Actions=boxIT;
MimeType=
ServiceTypes=
Type=Service
X-KDE-ServiceTypes=KonqPopupMenu/Plugin,,video/x-matroska
X-KDE-Submenu=
Edit 30/04/2010 à 23h00 : Avertissement et fin de programme en cas d'absence de canal DTS (le fichier peut donc être lu sur la freebox)
Edit 07/05/2010 à 15h30 : Le fichier peut désormais être passé au script comme premier argument
Edit 07/05/2010 à 16h07 : Ajout du menu service pour KDE4.

Répondre