106 lines
2.2 KiB
Bash
Executable file
106 lines
2.2 KiB
Bash
Executable file
#!/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
|
||
# Ignorer les liens symboliques
|
||
if [[ -h "${rootdir}/${dir::-1}" && "${dir}" != "Vidéos/" ]]
|
||
then
|
||
continue
|
||
fi
|
||
|
||
# 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
|
||
|
||
mapfile -t running < <(jobs -p)
|
||
if [[ "${#running[@]}" -ge 12 ]]
|
||
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
|