dotfiles/.local/bin/music-convert

100 lines
2.1 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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
# Sil sagit de FLAC ou dune 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"
# Sil 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