#!/bin/sh
PROGNAME="$(basename "$0")"

#OUTFMT_EXT=".mp3";OUTFMT_CODEC="libmp3lame";OUTFMT_Q="-b:a 192k"
OUTFMT_EXT=".ogg";OUTFMT_CODEC="libvorbis";OUTFMT_Q="-q:a 7"
#OUTFMT_EXT=".m4a";OUTFMT_CODEC="libfdk_aac";OUTFMT_Q="-q:a 10"


fatal()
{
  echo "ERROR: $@"
  exit 1
}


do_clean_up()
{
  if test -e "$TMPFILE"; then
    echo "Deleting temporary file $TMPFILE"
    rm -f "$TMPFILE"
  fi
}


###
### Check commandline arguments
###
if test $# -eq 0; then
  echo "Usage: ${PROGNAME} <infile.module> [extra openmpt123 args]"
  do_clean_up
  exit 0
fi

trap do_clean_up TERM


INFILE="$1"; shift
OUTFILE="$(basename "$INFILE"|sed "s/\.[A-Za-z0-9]*$/$OUTFMT_EXT/")"


###
### Render the module to wav file and compress to target format
###
test -e "$INFILE" || fatal "Input file '${INFILE}' does not exist."

TMPFILE="$(mktemp "/tmp/mod2stream.XXXXXX.wav")"
echo "Rendering ${INFILE} -> ${TMPFILE} -- $@ ..."
openmpt123 --quiet --force --banner 0 --output "$TMPFILE" "$INFILE" "$@" || fatal "Error running openmpt."

if test -e "$TMPFILE"; then
  echo "Compressing to '${OUTFILE}' ..."

  # Use a trick here to create metadata .. we quotemeta()
  # via the Perl oneliner here, so it should be safe.
  METADATA="$(openmpt123 --banner 0 --info --details "$INFILE" | perl -ne 'if (/^([A-Za-z ]+?)\.*:\s(.*)$/) { print "-metadata ".quotemeta(lc($1))."=".quotemeta($2)." "; }')"

  eval ffmpeg -v 0 -hide_banner -y \
  	-i "\$TMPFILE" \
  	-map_metadata 0 \
  	$METADATA \
  	-c:a $OUTFMT_CODEC $OUTFMT_Q \
  	"\$OUTFILE"
fi

do_clean_up
