#!/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}" ]]
	then
		continue
	fi

	# Répertoire de destination
	dstdir="/mnt/data/breizh/Musique.opus/${dir}"

	# Création du répertoire de destination
	mkdir -p "${dstdir}"

	# On entre dans le répertoire à traiter
	cd "${rootdir}/${dir}"

	togain=false

	# Pour chaque fichier
	for file in *
	do
                # On ignore les dossiers
                if [[ -d "${file}" ]]
                then
                        continue
                fi
		
		# Définition du fichier de destination
		dstfile="${file%.*}.opus"
			
		# Passe les fichiers déjà traités
		if [[ "${dstdir}${dstfile}" -nt "${file}" || "${dstdir}${file}" -nt "${file}" ]]
		then
			echo "[${blue}SKIP${reset}] ${dir#./}$file"
			continue
		fi
		
		# Converti uniquement les flacs
		if [[ "$file" =~ \.flac$ ]]
		then
			togain=true

			# Parallélisation des conversions
			declare -a running

			mapfile -t running < <(jobs -p)
			if [[ "${#running[@]}" -ge 6 ]]
			then
				wait -n
			fi

			(
				echo "       ${dir#./}$file"
				ffmpeg -n -loglevel error -i "file:$file" -c:a libopus -b:a 128K "file:${dstdir}${dstfile}" && \
					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}/"
		fi
	done
	wait
	
	if ${togain}
	then
		(
			cd "${dstdir}"
			shopt -s nullglob
			echo "[${blue}GAIN${reset}] $dir"
			loudgain -q -S -a -k -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
