#!/bin/bash

#
# $Id: aac2mp3,v 1.2 2005/08/22 15:32:34 rali Exp $
#

#
# Convert one or more AAC/M4A files to MP3.  Based on a script example
# I found at: http://gimpel.gi.funpic.de/Howtos/convert_aac/index.html
#

ME=`basename ${0}`

AAC2WAV="/usr/bin/mplayer"
WAV2MP3="/usr/bin/lame"

EXT="m4a"
BITRATE="192"

do_usage() {            # explanatory text
  echo "usage: ${ME} [-b nnn] [-e ext] [-f] [-c] [-r] [-v] [-h] [file list]"
  echo "       Convert music from AAC format to MP3"
  echo "  -l /path/app  Specify the location of lame(1)"
  echo "  -m /path/app  Specify the location of mplayer(1)"
  echo "  -b nnn        bitrate for mp3 encoder to use"
  echo "  -e ext        Use .ext rather than .m4a extension"
  echo "  -f            Force overwrite of existing file"
  echo "  -c            Delete original AAC|M4A file(s)"
  echo "  -s            Keep intermediate .wav file(s)"
  echo "  -v            Verbose output"
  echo "  -h            This information"
  exit 0
  }

do_error() {
  echo "$*"
  exit 1
  }

file_overwrite_check() {
  if [ "$FORCE" != "yes" ]
  then
    test -f "${1}" && do_error "${1} already exists."
  else
    test -f "${1}" && echo "  ${1} is being overwritten."
  fi
  }

create_wav() {  # use mplayer(1) to convert from AAC to WAV
  file_overwrite_check "${2}"

  test $VERBOSE && echo -n "Creating intermediate WAV file"

  ${AAC2WAV} -really-quiet -ao pcm "${1}" -ao pcm:file="${2}"
  if [ $? -ne 0 ]
  then
    echo ""
    echo "Conversion to WAV (${AAC2WAV}) failed."
    do_cleanup
    do_error "Exiting"
  fi

  test $VERBOSE && echo ".  OK"
  }

create_mp3() {  # use lame(1) to convert from WAV to MP3
  file_overwrite_check "${2}"

  test $VERBOSE && echo -n "Creating output MP3 file"

  ${WAV2MP3} -h -b ${BITRATE} -S "${1}" "${2}"
  if [ $? -ne 0 ]
  then
    echo ""
    echo "Conversion to MP3 (${WAV2MP3}) failed."
    do_cleanup
    do_error "Exiting"
  fi

  test $VERBOSE && echo ".  OK"
  }

do_cleanup() {  # Delete intermediate and (optionally) original file(s)
  test $VERBOSE && echo -n "Deleting intermediate file"
  test ${SAVEWAV} || rm -f "${2}"
  test ${RMM4A}   && rm -f "${1}"
  test $VERBOSE && echo ".  OK"
  }

do_set_bitrate() {
  test $VERBOSE && echo -n "Setting output bitrate to: $1 kbps"
  BITRATE=$1
  test $VERBOSE && echo ".  OK"
  }

GETOPT=`getopt -o l:m:b:e:cfhrv -n ${ME} -- "$@"`
if [ $? -ne 0 ]
then
  do_usage
fi

eval set -- "$GETOPT"

while true
do
  case "$1" in
    -l) LAME=$2 ; shift ; shift ;;
    -m) MPLAYER=$2 ; shift ; shift ;;
    -b) do_set_bitrate $2 ; shift ; shift ;;
    -e) EXT=$2 ; shift ; shift ;;
    -f) FORCE="yes" ; shift ;;
    -c) RMM4A="yes" ; shift ;;
    -s) SAVEWAV="yes" ; shift ;;
    -v) VERBOSE="yes" ; shift ;;
    -h) do_usage ;;
    --) shift ; break ;;
     *)  do_usage ;;
  esac
done

test -f $LAME    || do_error "$LAME not found. Use \"-l\" switch."
test -f $MPLAYER || do_error "$MPLAYER not found. Use \"-m\" switch."

if [ $# -eq 0 ]
then                    # Convert all files in current directory
  for IFILE in *.${EXT}
  do
    if [ "${IFILE}" == "*.${EXT}" ]
    then
      do_error "No files with extension ${EXT} in this directory."
    fi

    OUT=`echo "${IFILE}" | sed -e "s/\.${EXT}//g"`

    create_wav "${IFILE}"   "${OUT}.wav"
    create_mp3 "${OUT}.wav" "${OUT}.mp3"
    do_cleanup "${IFILE}"   "${OUT}.wav"

  done
else                    # Convert listed files
  for IFILE in "$*"
  do
    test -f "${IFILE}" || do_error "${IFILE} not found."	 

    OUT=`echo "${IFILE}" | sed -e "s/\.${EXT}//g"`	 

    create_wav "${IFILE}" "${OUT}.wav"	 
    create_mp3 "${OUT}.wav" "${OUT}.mp3"	 
    do_cleanup "${IFILE}" "${OUT}.wav"	 
  done	 
fi	 
exit 0
