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.