#!/bin/bash # Sortie à la moindre erreur set -e shopt -s globstar # Initialisation de la mise en forme blue=$(tput setaf 4) green=$(tput setaf 2) red=$(tput setaf 1) reset=$(tput sgr0) bold=$(tput bold) # Répertoire source rootdir="${HOME}/Vidéos/Musique" cd "$rootdir" # Pour tous les sous-répertoires, à tous les niveaux for dir in **/ ./ do # Ignorer les liens symboliques if [[ -h "${rootdir}/${dir::-1}" ]] then continue fi # Répertoire de destination dstdir="${HOME}/Musique/Vidéos/${dir}" # Création du répertoire de destination mkdir -p "${dstdir}" # On entre dans le répertoire à traiter cd "${rootdir}/${dir}" # Pour chaque fichier for file in * do # On ignore les dossiers if [[ -d "${file}" ]] then continue fi # Converti uniquement les vidéos if [[ "$(file --mime-type -b -e ascii -e compress -e tar -e cdf "$file")" =~ video/ ]] then # Définition du fichier de destination dstfile="${file%.*}.opus" # Passe les fichiers déjà traités if [[ "${dstdir}${dstfile}" -nt "${file}" ]] then echo "[${blue}SKIP${reset}] ${dir#./}$file" continue fi # Parallélisation des conversions declare -a running mapfile -t running < <(jobs -p) if [[ "${#running[@]}" -ge 12 ]] then wait -n fi ( echo " ${dir#./}$file" ffmpeg -n -loglevel error -i "file:$file" -c:a libopus -b:a 256K "file:${dstdir}${dstfile}" && \ loudgain -S -r -k -q -s e "${dstdir}${dstfile}" &>/dev/null && \ echo "[${green} OK ${reset}] ${dir#./}$file" || \ echo "[${red}FAIL${reset}] ${dir#./}$file" ) & else # Copie les autres types de fichiers echo "[${green}COPY${reset}] ${dir#./}$file" cp -n --reflink=auto "${file}" "${dstdir}/" || true fi done done wait