Le script analysera tous les fichiers AVI et MP4 du dossier courant, puis créera un fichier MKV pour chacun contenant la vidéo et les éventuels fichiers SRT (sous-titres).
S'il y a seulement un .srt
, on le prend, sinon on prend .en.srt
, .fr.srt
, ...
#!/bin/sh
#
# File: $HOME/.local/bin/mkv-merge
# Requiert recode et mkvtoolnix.
#
reencode() {
# Réencodage des sous-titres, si nécessaire
local name="${1}"
[ "$(file "${name}" | grep -o ISO-8859)-prout" = "ISO-8859-prout" ]
&& recode 'l1..u8' "${name}"
[ "$(file "${name}" | grep -o Non-ISO)-prout" = "Non-ISO-prout" ]
&& recode 'l1..u8' "${name}"
[ "$(file "${name}" | grep -o 'with BOM')-prout" = "with BOM-prout" ]
&& tail --bytes=+4 "${name}" >"${name}.ok"
&& rm "${name}"
&& mv "${name}.ok" "${name}"
}
mkv() {
# Créer le fichier MKV
local name=$(echo "${1}" | sed "s/.$2$//")
local subs=""
local args="--subtitle-tracks 0 --no-video --no-audio"
if test -f "${name}.srt"; then
reencode "${name}.srt"
subs="--language 0:fre ${args} "${name}.srt""
else
if test -f "${name}.en.srt"; then
reencode "${name}.en.srt"
subs="${subs} --language 0:eng ${args} ${name}.en.srt"
fi
if test -f "${name}.fr.srt"; then
reencode "${name}.fr.srt"
subs="${subs} --language 0:fre ${args} ${name}.fr.srt"
fi
fi
echo -n "${name}.${2} -> ${name}.mkv … "
mkvmerge -q -o "${name}.mkv" "${name}.${2}" ${subs}
echo "\33[92mOK\33[00m"
}
# Conversion des fichiers MP4 en MKV avec leurs sous-titres respectifs
for movie in *.mp4; do
[ -f "${movie}" ] && mkv "${movie}" mp4
done
Historique
- 2022-11-29 : suppression de l'utilisation d'un fichier intermédiaire et revue de code.