#################################################################
#
# NAME
#
#    txt2mp3.sh
#
# AUFRUF
#
#    txt2mp3.sh <INI-Datei>
#
# PARAMETER
#
#    INI-Datei: Name der INI-Datei. Ihr Name muss auf ".ini"
#               enden
#
# TEXTDATEIEN
#
#    Es wird erwartet, dass die zu konvertierenden Text-
#    dateien heissen wie die INI-Datei, nur dass ".ini"
#    ersetzt wird durch "_##", wobei "##" eine laufende
#    Nummerierung ist, die sich in den "Title##"-
#    eintraegen in der INI-Datie wieder findet.
#
# INI-Datei
#
#    Artist    Autor
#    Album     Buch-/Texttitel
#    Title##   Eintrag fuer jede zu konvertierende Datei
#              Title01=<Titel des 1. Kapitels>
#              Title02=<Titel des 2. Kapitels>
#              Title03=<Titel des 3. Kapitels>
#              etc.
#    ID3=1     ID3-Tags sind auf 30 Zeichen beschraenkt (Default:
#              unbeschraenkt)
#    Stimme    Die von mbrola verwendete Stimmendatei (Default:
#              /opt/txt2pho/data/de6)
#    Tempo     Parameter -t fuer mbrola (Default: 1.2)
#    Frequenz  Parameter -f fuer mbrola (Default: 0.8)
#    Filter    Ein oder mehrere Filter, die txt2pho vorgeschaltet
#              werden sollen. Am Anfang und am Ende darf keine '|'
#              sein
#
#    Zeilen, die mit '#' beginnen, sind Kommentare
# 
#################################################################


# Defaults
DEFAULTSTIMME=/opt/txt2pho/data/de6 # Maennlich
DEFAULTTEMPO=1.2		# etwas langsamer
DEFAULTFREQUENZ=0.8		# etwas tiefer



# Aufruf korrekt?
if [ $# != 1 ]
then
    echo "`basename $0 .sh` <INI-Datei>"
    exit 1
fi


# Name uebernehmen
INI=$1

# INI-Datei vorhanden?
if [ ! -r $INI ]
then
    echo "$INI nicht vorhanden!"
    exit 1
fi


# Dateimuster
#PATTERN=`grep -i dateien $INI|cut -f2 -d'='`
#if [ "$PATTERN" = "" ]
#then
#    echo "$INI enthaelt kein Dateimuster! (Dateien=)"
#    ERR=1
#fi

PATTERN=`basename $INI .ini`
PATTERN=${PATTERN}_

ERR=0

# Die benoetigten Programme
MBROLA=`which mbrola 2>&1`
if [ `basename "$MBROLA"` != "mbrola" ]
then
    echo -e "\n\nmbrola nicht gefunden!\n\n"
    ERR=1
fi
TXT2PHO=`which txt2pho 2>&1`
if [ `basename "$TXT2PHO"` != "txt2pho" ]
then
    echo -e "\n\ntxt2pho nicht gefunden!\n\n"
    ERR=1
fi

# Einlesen der Parameter



# Die Nummern in den Titeln
NUMMERN=`grep -i "^title" $INI|cut -f1 -d'='|cut -c6-|xargs`


echo -e "\n\n"

# ID3 v1?
grep -i "^id3=1" $INI > /dev/null
if [ $? = 0 ]
then
    # ID3-Tags V.1 gewuenscht; die duerfen nur
    # 30 Zeichen lang sein
    ID3LEN=30
    echo "ID3-Tags: V.1 (max. $ID3LEN Zeichen)"
else
    ID3LEN=3000
    echo "ID3-Tags: V.2"
fi

# Artist
ARTIST=`grep -i artist $INI|cut -f2 -d'='`
if [ "$ARTIST" != "" ]
then
    LEN=`expr "$ARTIST" : '.*'`
    if [ $LEN  -gt $ID3LEN ]
	then
	echo "$INI: 'Artist' zu lang (max. $ID3LEN)!"
	ERR=1
    else
	echo "Artist: $ARTIST"
	#ARTIST="--ta \"$ARTIST\""
    fi
else
    echo "$INI: kein 'Artist'"
fi

# Album
ALBUM=`grep -i album $INI|cut -f2 -d'='`
if [ "$ALBUM" != "" ]
then
    LEN=`expr "$ALBUM" : '.*'`
    if [ $LEN  -gt $ID3LEN ]
	then
	echo "$INI: 'Album' zu lang (max. $ID3LEN)!"
	ERR=1
    else
	echo "Album: $ALBUM"
	#ALBUM="--tl \"$ALBUM\\\""
    fi
else
    echo "$INI: kein 'Album'"
fi


# Year
YEAR=`grep -i year $INI|cut -f2 -d'='`
if [ "$YEAR" != "" ]
then
    LEN=`expr "$YEAR" : '.*'`
    if [ $LEN  -gt $ID3LEN ]
	then
	echo "$INI: 'Year' zu lang (max. $ID3LEN)!"
	ERR=1
    else
	echo "Year: $YEAR"
    fi
else
    echo "Year: -"
fi


# Titel verifizieren
echo -e "\n"
for i in $NUMMERN
do

  TITLE=`grep -i "^title" $INI|grep $i |cut -f2 -d'='`
  if [ "$TITLE" != "" ]
      then
      LEN=`expr "$TITLE" : '.*'`
      if [ $LEN  -gt $ID3LEN ]
	  then
	  echo "$INI: 'Title$i' zu lang)!"
	  ERR=1
      else
	  echo "Title: $TITLE"
	  # Kleiner Trick, damit 08 und hoeher nicht
	  # als ungueltige Oktalzahlen bemaengelt werden
	  TITLES[`expr $i + 0`]=$TITLE
      fi
  else
      echo "$INI: 'Title$i' fehlt!"
      ERR=1
  fi
  
done


# Stimme
STIMME=`grep -i "^stimme" $INI|cut -f2 -d'='`
if [ "$STIMME" = "" ]
then
    STIMME=$DEFAULTSTIMME
fi
if [ -r $STIMME ]
then
    echo -e "\nStimme: $STIMME"
else
    echo -e "\nStimme $STIMME existiert nicht!"
    ERR=1
fi

# Es hat sich gezeigt, dass die Qualitaet besser wird, wenn
# man txt2pho den Typ explizit mitgibt
case $STIMME in
    de5) MF=-f;;
    de6) MF=-m;;
    de7) MF=-f;;
    *) MF=-m;;
esac

# Tempo
TEMPO=`grep -i "^tempo" $INI|cut -f2 -d'='`
if [ "$TEMPO" = "" ]
then
    TEMPO=$DEFAULTTEMPO
fi

echo "Tempo: $TEMPO"

# Frequenz
FREQUENZ=`grep -i "^frequenz" $INI|cut -f2 -d'='`
if [ "$FREQUENZ" = "" ]
then
    FREQUENZ=$DEFAULTFREQUENZ
fi

echo "Frequenz: $FREQUENZ"

# Filter
grep -i "^filter=" $INI > /dev/null
if [ $? = 0 ]
then
    FILTER=`grep -i "^filter=" $INI|cut -f2 -d'='|sed 's/|/ | /g'`
    echo "Filter: $FILTER"
else
    FILTER=cat
fi



# Abbruch bei Fehlern
if [ "$ERR" != "0" ]
then
    exit 1
fi



echo -e "\n\nAbbruch mit ^C, weiter mit RETURN \c"
read OK

for i in $NUMMERN
do


  # Der Basisname
  BASE=${PATTERN}${i}

  # Davon abgeleitet: der Name der Textdatei
  FILE=${BASE}.txt
  WAV=${BASE}.wav
  MP3=${BASE}.mp3

  if [ ! -r $FILE ]
  then
      echo -e "\n\n$FILE nicht vorhanden!\n\n"
      continue
  else
      echo -e "\n\nKonvertiere $FILE"
  fi
  
  cat $FILE | \
  $FILTER | \
  txt2pho $MF | \
  mbrola -e -t $TEMPO -f $FREQUENZ $STIMME - -.wav | \
  lame -h \
      --ta "$ARTIST" \
      --tl "$ALBUM" \
      --tt "${TITLES[`expr $i + 0`]}" \
      --ty "$YEAR" \
      --tn $i \
      --tg "speech" \
      --tc "Synthese: txt2pho/mbrola" \
      --add-id3v2 - $MP3
done

