#!/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}/Musique/" cd "$rootdir" # Pour tous les sous-répertoires, à tous les niveaux for dir in **/ . do # Affichage du répertoire en cours de traitement echo "$bold$dir$reset" # Définition du répertoire de destination dstdir="${HOME}/Musique.opus/${dir}" # Création de la 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 # S’il s’agit de FLAC ou d’une vidéo if [[ "${file}" =~ .flac$ ]] || [[ "${dir}" == "Vidéos/" && "$(file --mime-type -b -e ascii -e compress -e tar -e cdf "$file")" =~ video/ ]] then # Définition du fichier de destination dstfile="$(basename -s .flac "$file").opus" # S’il a déjà été traité on passe, pour gagner du # temps. if [[ -f "${dstdir}${dstfile}" ]] then echo "[${blue}SKIP${reset}] $file" continue fi # Parrallélisation des conversions declare -a running running=($(jobs -p)) if [[ "${#running[@]}" -ge 10 ]] then wait -n fi togain="true" ( echo " $file" ffmpeg -n -loglevel error -i "file:$file" -c:a libopus -b:a 256K "file:${dstdir}${dstfile}" echo "[${green} OK ${reset}] $file" ) & else # Pour les autres fichiers, les copier tel quels echo "[${green}COPY${reset}] $file" cp -n --reflink=auto "${file}" "${dstdir}/" fi done wait # Si le moindre fichier a été converti, on refait les tags replay gain if ${togain} && [[ "${dir}" != "Vidéos/" ]] then ( cd "${dstdir}" shopt -s nullglob echo "[${blue}GAIN${reset}] $dir" loudgain -S -a -k -q -s e *.opus &>/dev/null && \ echo "[${green}GAIN${reset}] $dir" || \ echo "[${red}GAIN${reset}] $dir" shopt -u nullglob ) & disown $! # Réinitialise le tag togain togain="false" fi done wait