#!/bin/bash

# soittimeen.sh – a script to convert mp3, ogg and flac files into
# a m4a file. Preserves metadata and supports converting many files at once.
# ideal for Nokia music phones or Apple iPod.
# Usage: soittimeen.sh <paths to tracks>

# made by Antti Laiti <laiti@iki.fi>

# Required utilities: faac, metaflac, id3, ogginfo, flac123, mpg321, ogg123

# exit on errors
set -e

PATH=/bin:/usr/bin

# parameters for output files
OUTDIR="/home/files/nobackup/nokia/poppi"
EXTENSION="m4a"
QUALITY=100

# options for metaflac utility
METAFLAC="metaflac --no-utf8-convert --no-filename"

for FROMFILE in $*; do

OUTFILE=`basename $FROMFILE|sed 's/\..*//'`
FILETYPE=null

# get the file type
file $FROMFILE | grep "MP3 file" > /dev/null && FILETYPE=mp3
file $FROMFILE | grep "MP3 encoding" > /dev/null && FILETYPE=mp3
file $FROMFILE | grep "MPEG ADTS, layer III" > /dev/null && FILETYPE=mp3
file $FROMFILE | grep "Vorbis audio" > /dev/null && FILETYPE=ogg
file $FROMFILE | grep "FLAC audio" > /dev/null && FILETYPE=flac

# some sed magic for mp3 file to get tags correctly – I should implement these more clearly.
if [ "$FILETYPE" = "mp3" ]; then
	TITLE=`id3 -R -l $FROMFILE|grep "Title:"|sed 's/^Title:[ ]//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	ARTIST=`id3 -R -l $FROMFILE|grep "Artist:"|sed 's/^Artist:[ ]//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	ALBUM=`id3 -R -l $FROMFILE|grep "Album:"|sed 's/^Album:[ ]//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	YEAR=`id3 -R -l $FROMFILE|grep "Year:"|sed 's/^Year:[ ]//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	GENRE=`id3 -R -l $FROMFILE|grep "Genre:"|sed 's/^Genre:[ ]//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	DECODER="mpg321 -q --wav -"	

# same for ogg files
elif [ "$FILETYPE" = "ogg" ]; then
	TITLE=`ogginfo $FROMFILE|grep "TITLE="|sed 's/.TITLE=//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	ARTIST=`ogginfo $FROMFILE|grep "ARTIST="|sed 's/.ARTIST=//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	ALBUM=`ogginfo $FROMFILE|grep "ALBUM="|sed 's/.ALBUM=//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	YEAR=`ogginfo $FROMFILE|grep "DATE="|sed 's/.DATE=//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	GENRE=`ogginfo $FROMFILE|grep "GENRE="|sed 's/.GENRE=//'|sed 's/^[ ]*//'|sed 's/[ ]*$//'`
	DECODER="ogg123 -q -d wav -f -"

# and flac files
elif [ "$FILETYPE" = "flac" ]; then
	TITLE=`$METAFLAC --show-tag=TITLE $FROMFILE|sed 's/Title=//'|sed 's/TITLE=//'`
	ARTIST=`$METAFLAC --show-tag=ARTIST $FROMFILE|sed 's/Artist=//'|sed 's/ARTIST=//'`
	ALBUM=`$METAFLAC --show-tag=ALBUM $FROMFILE|sed 's/Album=//'|sed 's/ALBUM=//'`
	GENRE=`$METAFLAC --show-tag=GENRE $FROMFILE|sed 's/Genre=//'|sed 's/GENRE=//'`
	YEAR=`$METAFLAC --show-tag=DATE $FROMFILE|sed 's/Date=//'|sed 's/DATE=//'`
	DECODER="flac123 --wav=- -q"	

else echo "$FROMFILE: Filetype $FILETYPE not supported."; exit 1

fi

# for debugging purposes
#echo "TAG METADATA:"

#echo "TITLE:  $TITLE"
#echo "ARTIST: $ARTIST"
#echo "ALBUM:  $ALBUM"
#echo "GENRE:  $GENRE"
#echo "YEAR:   $YEAR"

# decode the track and set the tags
$DECODER $FROMFILE |faac -q $QUALITY -o $OUTDIR/$OUTFILE.$EXTENSION -w --artist "$ARTIST" --title "$TITLE" --genre "$GENRE" --album "$ALBUM" --year "$YEAR" -c "soittimeen.sh" -

done

exit 0

