#! /bin/bash
#*********************************************************************
#    the audio converter
#    author         Norman Krebs, norman.krebs@kohnos.net
#    created        Sat Dec 05 2009 09:30:19
#    last change    Sun Dec 06 2009 21:18:46
#*********************************************************************

SCN=${0##*/}

VERSION=0.02

CDBR=44100
MP3BR=320
OGGBR=320
MODE=void

SRC="void"
TGT="void"

function usage {
cat <<EOF
${0##*/} - the audio converter
           version   ${VERSION}
Usage:
      ${0##*/} <MODE> src=<dir>

               MODE
               WM    wav -> mp3
               MW    mp3 -> wav
               WW    wma -> wav
               WO    wav -> ogg
               OW    ogg -> wav

EOF
}

function chkres {
    case "${2}" in
        dirc) case ${1} in
                  0) echo "${SCN}: directory [${3}] created" ;;
                  *) echo "${SCN}: directory [${3}] NOT created" ;;
              esac
              ;;
        dire) case ${1} in
                  0) echo "${SCN}: directory [${3}] exists" ;;
                  *) echo "${SCN}: directory [${3}] NOT exists" ;;
              esac
              ;;
        filec) : ;;
    esac
    [ ${1} -ne 0 ] && exit ${1}
}

function getfiles {
    local FEXT="${1}"
    find . -maxdepth 1 -mindepth 1 -type f -iname "*.${FEXT}" -printf "%f\n"
}

function mktgt {
    export FEXT=${1}
    export TGT
    local EXTD="${2}"
    [ "${TGT}" = "void" ] && TGT="${SRC}/${EXTD}"
    echo "${SCN}: [${TGT}]"
    if [ ! -d "${TGT}" ] ; then
        mkdir -p ${TGT} ; chkres ${?} dirc "${TGT}"
    else
        chkres 0 dire "${TGT}"
    fi
}

function chkresults {
    echo "${SCN}: [${NA}/${NX}] converted, [${NF}] failures."
    echo "${SCN}: [${CA}/${NX}] moved,     [${CF}] failures."
}

# ==== MAIN ==========================================================

case "${1}" in
    mp3-wav|MW) MODE=MW ; shift ;;
    wav-mp3|WM) MODE=WM ; shift ;;
    wma-wav|WW) MODE=WW ; shift ;;
    wav-ogg|WO) MODE=WO ; shift ;;
    ogg-wav|WO) MODE=OW ; shift ;;
    *) usage ; exit 1 ;;
esac

TGT="void"
for i ; do
    case "${i}" in
        src=*)
            SRC="${i#*=}"
            cd "${SRC}"
            SRC=$(pwd)
            cd -
            ;;
        tgt=*)
            TGT="${i#*=}"
            cd "${TGT}"
            TGT=$(pwd)
            cd -
            ;;
    esac
done

[ "${SRC}" = "void" ] && SRC="$(pwd)"

if [ ! -d "${SRC}" ] ; then
    usage
    exit 1
fi

echo "${SCN}: [$(pwd)]"

typeset -i NA=0     # convert succeeded
typeset -i NF=0     # convert failed
typeset -i NX=0     # convert: all files
typeset -i CA=0     # copy succeeded
typeset -i CF=0     # copy failed

case "${MODE}" in
    WM) mktgt wav mp3s
        cd "${SRC}"
        while read a ; do
            echo "${SCN}: lame -h -b ${MP3BR} \"${a}\" \"${a%.*}.mp3\""
            ((NX++))
            lame -h -b ${MP3BR} "${a}" "${a%.*}.mp3" && NA=NA+1 || NF=NF+1
            mv "${SRC}/${a%.*}.mp3" "${TGT}/" && CA=CA+1 || CF=CF+1
        done < <(getfiles ${FEXT})
        chkresults
        ;;
    MW) mktgt mp3 wavs
        cd "${SRC}"
        while read a ; do
            echo "${SCN}: mpg123 -r ${CDBR} -w \"${a%.*}.wav\" \"${a}\""
            ((NX++))
            mpg123 -r ${CDBR} -w "${a%.*}.wav" "${a}" && NA=NA+1 || NF=NF+1
            mv "${SRC}/${a%.*}.wav" "${TGT}/" && CA=CA+1 || CF=CF+1
        done < <(getfiles ${FEXT})
        chkresults
        ;;
    WW) mktgt wma wavs
        cd "${SRC}"
        while read a ; do
            echo "${SCN}: mplayer -vo null -vc dummy -af resample=44100 -ao pcm:waveheader:file=\"${a%.*}.wav\" \"${a}\""
            ((NX++))
            mplayer -vo null -vc dummy -af resample=44100 -ao pcm:waveheader:file=${a%.*}.wav ${a} && NA=NA+1 || NF=NF+1
            mv "${SRC}/${a%.*}.wav" "${TGT}/" && CA=CA+1 || CF=CF+1
        done < <(getfiles ${FEXT})
        chkresults
        ;;
    WO) mktgt wav oggs
        cd "${SRC}"
        while read a ; do
            echo "${SCN}: oggenc -b ${OGGBR} \"${a}\""
            ((NX++))
            oggenc -b ${OGGBR} "${a}" && NA=NA+1 || NF=NF+1
            mv "${SRC}/${a%.*}.ogg" "${TGT}/" && CA=CA+1 || CF=CF+1
        done < <(getfiles ${FEXT})
        chkresults
        ;;
    OW) mktgt ogg wavs
        cd "${SRC}"
        while read a ; do
            echo "${SCN}: oggdec \"${a}\""
            ((NX++))
            oggdec "${a}" && NA=NA+1 || NF=NF+1
            mv "${SRC}/${a%.*}.wav" "${TGT}/" && CA=CA+1 || CF=CF+1
        done < <(getfiles ${FEXT})
        chkresults
        ;;
esac


exit 0

