#!/bin/bash
#
#Beschreibung: Konvertiert mp3-Dateien in eine niedrigere Bitrate, bearbeitet den Pfad rekursiv
#
#benötigt: usr/bin/mp3info;		usr/bin/id3v2; 			/usr/bin/recode		/usr/bin/lame
#          www.ibiblio.org/mp3info/	http://id3v2.sourceforge.net/
#Aufruf: mp3recode.sh -b Bitrate [Pfad]
#
#Hinweise und Fehler an tuxator@tuxator.de 
#
#Status: ok
################################################################################################################################
#Usage:                                                                                                                        #
#-b	Bitrate                                                                                                                #
#Pfad	zu druchsuchender Pfad                                                                                                 #
################################################################################################################################
#Variablen                                                                                                                     #
currentifs=${IFS}		#IFS sichern,wird im Script überschrieben                                                      #
commsub="recode by tuxator"     #Kommentarzusatz                                                                               #
retval=0                                                                                                                       #
################################################################################################################################
#Funktionen                                                                                                                    #
################################################################################################################################
################################################################################################################################
function varrecode()                                                                                                           #
{                                                                                                                              #
#Prüfe ob Umlaute vorhanden                                                                                                    #
if [[ ${1} == '+(ü|ä|ö|Ä|Ö|Ü|ß)' ]] && [[ ! -e /usr/bin/recode ]]; then                                                        #
	utf8=${1}                                                                                                              #
else                                                                                                                           #
	utf8=$(echo ${1} | recode "latin-1..")                                                                                 #
fi                                                                                                                             #
echo ${utf8}                                                                                                                   #
}                                                                                                                              #
################################################################################################################################
#Prüfe Voraussetzung                                                                                                           #
for cmd in /usr/bin/lame /usr/bin/mp3info /usr/bin/id3v2                                                                       #
do                                                                                                                             #
	if [[ ! -e ${cmd} ]]; then                                                                                             #
		echo "Umwandlung nicht möglich. ${cmd} nicht vorhanden"                                                        #
		retval=1                                                                                                       #
	fi                                                                                                                     #
done                                                                                                                           #
#trenne Befehlszeilenargumente                                                                                                 #
while getopts "b:" opt                                                                                                         #
	do                                                                                                                     #
	case ${opt} in                                                                                                         #
		b ) bitrate=${OPTARG} ;;                                                                                       #
		* ) retval=2 ;;                                                                                                #
	esac                                                                                                                   #
done                                                                                                                           #
shift $(($OPTIND -1 ))                                                                                                         #
################################################################################################################################
#wenn kein Verzeichnis übergeben                                                                                               #
#nimm aktuelles Verzeichnis                                                                                                    #
if [[ ${1} ]] && [[ -d ${1} ]]; then                                                                                           #
	currentpath=${1}                                                                                                       #
else                                                                                                                           #
	currentpath=${PWD}                                                                                                     #
fi                                                                                                                             #
################################################################################################################################
if [[ ${retval} == 0 ]] && [[ ${bitrate} ]]; then                                                                              #
	########################################################################################################################
	cd ${currentpath}                                                                                                      #
	#lese Verzeichnisinhalt rekursiv                                                                                       #
	#benutze auch Verzeichnisse mit Leerzeichen                                                                            #
	IFS=$'\n'                                                                                                              #
	########################################################################################################################
	#finde alle mp3 und schreibe deren Pfade in Array                                                                      #
	patharray=$(find -iname "*.mp3" -printf "%h\n" | sort | uniq)                                                          #
	if [[ ${patharray[0]} == "" ]]; then                                                                                   #
		#schreibe ursprünglichen IFS zurück                                                                            #
		IFS=${currentifs}                                                                                              #
		retval=3                                                                                                       #
	fi                                                                                                                     #
	########################################################################################################################
	########################################################################################################################
	#lese Pfade nacheinander                                                                                               #
	if [[ ${retval} == 0 ]]; then                                                                                          #
		################################################################################################################
		for pathname in ${patharray[*]}                                                                                #
		do                                                                                                             #
			#Wechsel in das Ursprungsverzeichnis                                                                   #
			cd ${currentpath}                                                                                      #
			########################################################################################################
			#neues Verzeichnis erstellen                                                                           #
			if [[ ! -d ${bitrate} ]]; then                                                                         #
				mkdir ${bitrate}                                                                               #
			fi                                                                                                     #
			#Formatiere neuen Pfad (entferne führendes ./)                                                         #
			pathname=$(echo "${pathname}" | sed -e 's/.\///')                                                      #
        		########################################################################################################
			#Wechsel nach Pfad                                                                                     #
			cd ${pathname}                                                                                         #
			########################################################################################################
			#neues Verzeichnis erstellen                                                                           #
			if [[ ! -d ${currentpath}/${bitrate}/${pathname} ]]; then                                                          #
				mkdir -p ${currentpath}/${bitrate}/$pathname                                                                  #
			fi                                                                                                     #
			########################################################################################################
			#für alle mp3 in Pfad                                                                                  #
			for filename in $(find . -maxdepth 1 -iname "*.mp3" | sort)                                            #
			do                                                                                                     #
				#Bestimme Bitrate                                                                              #
				isbr=$(mp3info -x -p %r\\n ${filename})                                                        #
				################################################################################################
				if (( ${isbr} > ${bitrate} )); then                                                            #
					########################################################################################
					#lese ID3-Tags aus                                                                     #
					#Artist, Title, Album hiolen und Zeichensatz auf Systemzeichensatz anpassen            #
					########################################################################################
					#Artist holen                                                                          #
					artist=$(id3v2 -l ${filename} | grep "TPE1" | awk -F: '{ print $2 }' | sed "1 s/ //")  #
					if [[ ${artist} == "" ]]; then                                                         #
						artist=$(mp3info -p %a ${filename})                                            #
					fi                                                                                     #
					artist=$(varrecode ${artist})                                                          #
					#Album holen                                                                           #
					########################################################################################
					album=$(id3v2 -l ${filename} | grep "TALB" | awk -F: '{ print $2 }' | sed "1 s/ //")   #
					if [[ ${album} == "" ]]; then                                                          #
						album=$(mp3info -p %l ${filename})                                             #
					fi                                                                                     #
					album=$(varrecode ${album})                                                            #
					########################################################################################
					#Song holen                                                                            #
					title=$(id3v2 -l ${filename} | grep "TIT2" | awk -F: '{ print $2 }' | sed "1 s/ //")   #
					if [[ ${title} == "" ]]; then                                                          #
						title=$(mp3info -p %t ${filename})                                             #
					fi                                                                                     #
					title=$(varrecode ${title})                                                            #
					########################################################################################
					########################################################################################
					#Track holen                                                                           #
					track=$(id3v2 -l ${filename} | grep "TRCK" | awk -F: '{ print $2 }' | sed "1 s/ //")   #
					if [[ ${track} == "" ]]; then                                                          #
						track=$(mp3info -p %n ${filename})                                             #
					fi                                                                                     #
					track=$(varrecode ${track})                                                            #
					########################################################################################
					########################################################################################
					#Jahr holen                                                                            #
					year=$(id3v2 -l ${filename} | grep "TYER" | awk -F: '{ print $2 }' | sed "1 s/ //")    #
					if [[ ${year} == "" ]]; then                                                           #
						year=$(mp3info -p %y ${filename})                                              #
					fi                                                                                     #
					year=$(varrecode ${year})                                                              #
					########################################################################################
					########################################################################################
					#Genre holen                                                                           #
					content=$(id3v2 -l ${filename} | grep "TCON" | awk -F: '{ print $2 }' | sed "1 s/ //") #
					if [[ ${content} == "" ]]; then                                                        #
						content=$(mp3info -p %G ${filename})                                           #
					fi                                                                                     #
					content=$(varrecode ${content})                                                        #
					########################################################################################
					########################################################################################
					#Kommentar holen                                                                       #
					comment=$(id3v2 -l ${filename} | grep "COMM" | awk -F: '{ print $2 }' | sed "1 s/ //") #
					if [[ ${comment} == "" ]]; then                                                        #
						comment=$(mp3info -p %c ${filename})                                           #
					fi                                                                                     #
					comment=$(varrecode ${comment})                                                        #
					comment=$(echo ${comment} ${commsub})                                                  #
					########################################################################################
					newfilename=$(echo \
					"${currentpath}/${bitrate}/${pathname}/`basename "$filename" .mp3`"${bitrate}".mp3")   #
					lame -b ${bitrate} ${filename} ${newfilename}                                          #
					#ID3-Tags schreiben                                                                    #
					id3v2 -a ${artist} -A ${album} -t ${title} -T ${track} -y ${year} \
					-g ${content} -c ${comment} ${newfilename}                                             #
				else
					newfilename=$(echo \
					"${currentpath}/${bitrate}/${pathname}/`basename "$filename" .mp3`"${bitrate}".mp3")   #
					cp ${filename} ${newfilename}                                                          #
				fi                                                                                             #
				################################################################################################
			done                                                                                                   #
			########################################################################################################
		done                                                                                                           #
		################################################################################################################
	fi                                                                                                                     #
	########################################################################################################################
else                                                                                                                           #
	if [[ ${retval} != 1 ]]; then                                                                                          #
		retval=2                                                                                                       #
	fi                                                                                                                     #
fi                                                                                                                             #
################################################################################################################################
#Rückgabewerte                                                                                                                 #
case ${retval} in                                                                                                              #
	1 )	echo "Bitte fehlende Programme installieren!"                                                                  #
		;;                                                                                                             #
	2 )	echo "fehlende oder falsche Argumente!"                                                                        #
		echo "Aufruf ${0} -b xxx [Ordner]"                                                                             #
		;;                                                                                                             #
	3 )	echo "Verzeichnis enthält keine mp3-Dateien."                                                                  #
		;;                                                                                                             #
esac                                                                                                                           #
#schreibe ursprünglichen IFS zurück                                                                                            #
IFS=${currentifs}                                                                                                              #
################################################################################################################################
exit ${retval}                                                                                                                 #
################################################################################################################################