#!/bin/bash
#Version 1.3
#------------------------------------#
#  Umwandeln von Text in Sprache     #
#------------------------------------#
#
#Name des Buches
NAMEOF=""
#Graphischer- oder Konsolenmodus (-n)
GRAPHIC=true
TXT=
MP3=true
#------------------------------------#
#  Anzeige des Fortschrittbalkens    #
#------------------------------------#
spanner(){
#Starten nach Beginn der Umwandlung
while [ "`pidof mbrola`" = "" ]; do
  sleep 2.0
done
#Berechnen der wahrscheinlichen Größe
ANZW=$(cat spc.txt | wc -w)
echo "Anzahl der Wörter (word count)   : $ANZW Wörter"
BEGR=$(echo "scale=5 ; $ANZW*3.5" | bc)
PROC=$1;COUNT=0
DGR2=0
#Graphischer Fortschrittsbalken
if [ $MP3 ]; then
  BEGR=$(echo "scale=5 ; $ANZW*3.36" | bc)
  echo "Geschätzte Größe  (mp3 size)     : $BEGR kB"
  ENDUNG="mp3"
else
  BEGR=$(echo "scale=5 ; $ANZW*1.92" | bc)
  echo "Geschätzte Größe  (ogg size)     : $BEGR kB"
  ENDUNG="ogg"
fi
if [ $GRAPHIC ]; then
  (
  while ([ "`pidof mbrola`" != "" ] && [ $COUNT -le 2 ]);do
    if [ -f "$SOURCE.$ENDUNG" ]; then
      DGR=$(du "$SOURCE.$ENDUNG" | cut -f 1)
      sleep 3
      if [ $DGR2 -ge $DGR ]; then
        COUNT=3
      else
        PROZ=$(echo "scale=0 ; $DGR*100/$BEGR" | bc)
        echo "$PROZ"
        echo "# Hörbuch wird erzeugt: $PROZ%"
      fi
      DGR2=$DGR
    else
      COUNT=3
    fi
  done  
  ) | zenity --progress --text "Hörbuch wird erzeugt"\
   --title  "$NAMEOF" --auto-close --no-cancel --percentage=0
#Text Fortschrittsbalken
else
  echo -n "      "
  while ([ "`pidof mbrola`" != "" ] && [ $COUNT -le 2 ]);do
    if [ -f "$SOURCE.$ENDUNG" ]; then
      DGR=$(du "$SOURCE.$ENDUNG" | cut -f 1)
      sleep 3
      if [ $DGR2 -ge $DGR ]; then
        COUNT=3
      else
        PROZ=$(echo "scale=0 ; $DGR*100/$BEGR" | bc)
        echo -n -e "\010\010\010\010\010\010\010\010\010\010\010\010\010"
        echo -n -e "\010\010\010\010\010\010\010\010\010\010\010\010\010"
        echo -n "$PROZ %     "
      fi
    DGR2=$DGR
    else
      COUNT=3
    fi
  done
fi
}
#------------------------------------#
#  Überprüfen der ext. Anwendunggen  #
#------------------------------------#
CHECK=
checkdep(){
  for QUELLE in $*; do
    if [ "`whereis $QUELLE | grep /`" = "" ]; then
      CHECK=true
    fi
  done
}
#------------------------------------#
# Installiert externe Abhängigkeiten #
#------------------------------------#
instdep(){
  checkdep "`echo $* | sed 's/mbrola-de6 mbrola-en1//g'`"
  if [ $CHECK ]; then
    PAKETE=`echo $* | sed 's/pdftotext/poppler-utils/g' | sed 's/clit/convlit/g' | sed \
     's/oggenc/vorbis-tools/g'`
    if [ $GRAPHIC ]; then
      if [ "`whereis gksudo | grep /`" != "" ]; then
        gksudo apt-get -y install $PAKETE | zenity --progress  --pulsate \
         --auto-close --no-cancel \
         --text "Zusätzliche Quellen installieren:\n $PAKETE" --title  "$NAMEOF"
      else
        if [ "`whereis kdesudo | grep /`" != "" ]; then
          kdesudo apt-get -y install $PAKETE | zenity --progress \
           --pulsate --auto-close --no-cancel \
           --text "Zusätzliche Quellen installieren:\n $PAKETE" --title  "$NAMEOF"
        else 
          zenity --warning --text "gksudo und kdesudo nicht gefunden\
           Bitte ext. Quellen manuell intallieren oder \"book2mp3 -n\" (Konsole) verwenden"
          exit 1
        fi
      fi
    else
      sudo apt-get install $PAKETE
    fi
  fi
  CHECK=
  checkdep "`echo $* | sed 's/mbrola-de6 mbrola-en1//g'`"
  if [ $CHECK ]; then
    if [ $GRAPHIC ]; then
      zenity --warning --text "Bitte ext. Quellen: $* \n manuell intallieren"
    else
      echo "Bitte ext. Quellen: $* \n manuell intallieren"
    fi
    exit 1
  else
    #Prüfen ob mbrola Stimmen installiert sind
    if ( [ ! -f "/usr/share/mbrola/de6" ] \
     && [ ! -f "/usr/share/mbrola/de6/de6" ] )
    then
      if [ $GRAPHIC ]; then
        zenity --warning --text "/usr/share/mbrola/ Deutsche Stimmen nicht gefunden"
      else 
        echo "/usr/share/mbrola/ Deutsche Stimmen nicht gefunden"
      fi
      exit 1
    fi
    if ( [ ! -f "/usr/share/mbrola/en1" ] \
     && [ ! -f "/usr/share/mbrola/en1/en1" ] )
    then
      if [ $GRAPHIC ]; then
        zenity --warning --text "/usr/share/mbrola/ Englische Stimmen nicht gefunden"
      else 
        echo "/usr/share/mbrola/ Englische Stimmen nicht gefunden"
      fi
      exit 1
    fi    
  fi  
  CHECK=
}
#------------------------------------#
#  Parameter Behandlung              #
#------------------------------------#
while getopts hntTo opt
do
  case "$opt" in
    h)            echo "book2mp3 -n -o -t -T <pdf, doc, html, htm, rtf, txt or lit file>";\
    echo "-n nur console modus" ;echo "-t txt Datei erzeugen" ;echo "-T nur die txt Datei\
     erzeugen" ;echo "-o ogg statt mp3 ausgeben erzeugen" ;exit 1;;
    n)            GRAPHIC=;;
    t)            TXT=true;;
    T)            TXT="only";;
    o)            MP3=;;
    \?) exit 1;;
  esac
done
shift $(($OPTIND - 1))
if [ "$1" ]; then
  SOURCE="$*"
  shift
fi
if [ $MP3 ]; then
  instdep lame espeak mbrola mp3splt mbrola-de6 mbrola-en1
else
  instdep oggenc espeak mbrola mp3splt mbrola-de6 mbrola-en1
fi
#Hauptabhängigkeiten prüfen
#------------------------------------#
#  Parameter Behandlung Dateiauswahl #
#------------------------------------#
if [ $GRAPHIC ]; then
  if [ "$SOURCE" =  "" ]; then
    if ! NAME=$(zenity --file-selection --file-filter="Buecher | *.pdf *.doc *.html \
    *.htm *.rtf *.txt *.lit *.epub" --text "Bitte geben Sie den Dateipfad des Buches\
     ein:" --title "Bitte eBook auswählen"); then
      exit
    fi
    SOURCE="$NAME"
  fi
else  
  if [ "$SOURCE" =  "" ]; then
    exit 1
  fi
fi
#------------------------------------#
#  spez. Buchtyp in Text umwandeln   #
#------------------------------------#
ENDOFF=${SOURCE##*.}
DIROF=$(dirname "$SOURCE")
if [ "$DIROF" = "." ];then
  DIROF="`pwd`"
fi
NAMEOF=$( basename "$SOURCE" | sed 's/\.[^\.]\{1,\}$//g' )
echo -e "\033\01330;34m------------------------------------------------------------\033\01330m"
SOURCE="`echo "$DIROF/$NAMEOF.$ENDOFF"`"
if [ -f "$SOURCE" ]; then
  cd "$DIROF"
  mkdir tmp
  cd tmp
  ENDOFFLOW=$( echo $ENDOFF | tr "'[:upper:]'" "'[:lower:]'" )
  echo "Dateityp: $ENDOFFLOW umwandeln."
else
  echo keine Datei
  exit 1
fi
echo -e "\033\01330;34m------------------------------------------------------------\033\01330m"
case $ENDOFFLOW in
  pdf)            instdep pdftotext;pdftotext "$SOURCE" sp.txt;;
  lit)            instdep clit;clit "$SOURCE" .;html2text -utf8 *.htm* > sp.txt;;
  txt)            cp "$SOURCE" sp.txt;;
  htm)            instdep ;html2text -utf8 "$SOURCE" > sp.txt;;
  html)           instdep ;html2text -utf8 "$SOURCE" > sp.txt;;
  rtf)            instdep catdoc;catdoc "$SOURCE" > sp.txt;;
  doc)            instdep catdoc;catdoc "$SOURCE" > sp.txt;;
  epub)           instdep unzip;unzip -qq -j "$SOURCE";html2text -utf8 *.htm* > sp.txt;;
  \?) echo "Dateityp $ENDOFFLOW unbekannt. Beende Verarbeitung.";exit 1;;
esac
#-------------------------------------------#
#  Formatierung und Filter von Rückständen  #
#-------------------------------------------#
echo "Löschen der Seitennummern und Formatierung des Textes"
echo -e "\033\01330;34m------------------------------------------------------------\033\01330m"
# löschen von Seitennummern
sed -e 's/^[ »«\.,":\!\?+-0123456789]*$|^[ »«\.,":\!\?+-0123456789]*[Ss]eite[ »«\.,":\!\?+-0123456789]*$|^[ »«\.,":\!\?+-0123456789]*[Pp]age[ »«\.,":\!\?+-0123456789]*$//g' sp.txt > spc.txt
sed -e 's/[^ A-Za-z0-9!@&\(\)\\\/\.\,\<\>\?+=-]//g' spc.txt > sp.txt
#reste von xml entfernen
sed -e 's/<?.*?>//g' sp.txt > spc.txt
sed -e 's/<?.*$//g' spc.txt > sp.txt
sed -e 's/^.*?>//g' sp.txt > spc.txt
#url entfernen
sed -e 's/\(http\|https\|ftp\)\{0,1\}:\{0,1\}\(\/\)\{0,2\}\(www\)\{0,1\}\.\{0,1\}[A-Za-z0-9!@&\.\?+=-]\{1,\}\.\(HTM\|HTML\|htm\|html\|com\|org\|net\|mil\|edu\|COM\|ORG\|NET\|MIL\|EDU\|de\|DE\|org\|ORG\)\{1,1\}[A-Za-z0-9!@&\(\)\\\/\.\,\<\>\?+=-]\{0,\}//g' spc.txt > sp.txt
#zeilen mit zahlen entfernen
sed -e 's/^[ 0-9!@&\(\)\\\/\.\,\<\>\?+=-]\{0,\}$//g' sp.txt > spc.txt

#cat sp1.txt | tr -c '[:alnum:].,!?äöüÄÖÜß\n' ' ' > spc.txt
#exit
#------------------------------------#
#  ermitteln der Sprache des Buches  #
#------------------------------------#
if [ $TXT ]; then
  cp spc.txt "$SOURCE.txt"
  if [ $TXT = "only" ]; then
    cd ..
    rm tmp/*
    rmdir tmp
    exit 1
  fi
fi
ENTXT=$(cat spc.txt | grep -c " the ")
DETXT=$(cat spc.txt | grep -c " der ")
echo "Artikelzahl (article count):       en $ENTXT : de $DETXT"
echo -e "\033\01330;34m------------------------------------------------------------\033\01330m"
spanner &
#------------------------------------#
#  Umwandlung:   Text in Sprache     #
#------------------------------------#
if [ $ENTXT -le $DETXT ]; then
  if [ $MP3 ]; then
    espeak -p 42 -s 150 -v mb-de6 -f spc.txt --stdout | lame --tt "$NAMEOF"\
     --ta Hoerbuch -b 16 -h -V2 - "$SOURCE.mp3"
  else
    espeak -p 42 -s 150 -v mb-de6 -f spc.txt --stdout | oggenc -t "$NAMEOF"\
     -a Hoerbuch -q 3 -o "$SOURCE.ogg" -
  fi
else
  if [ $MP3 ]; then
    espeak -p 42 -s 130 -v mb-en1 -f spc.txt --stdout | lame --tt "$NAMEOF"\
     --ta Audiobook -b 16 -h -V2 - "$SOURCE.mp3"
  else
    espeak -p 42 -s 150 -v mb-de6 -f spc.txt --stdout | oggenc -t "$NAMEOF"\
     -a Hoerbuch -q 3 -o "$SOURCE.ogg" -
  fi
fi
cd ..
rm tmp/*
rmdir tmp
#------------------------------------#
#  Aufteilen der MP3/OGG-Datei           #
#------------------------------------#
echo -e "\033\01330;34m------------------------------------------------------------\033\01330m"
BNR=$( echo "$SOURCE" | sed 's/[^0123456789]*//g' )
echo "Starten des audio-Splittens"

if [ $GRAPHIC ]; then
  if ! zenity --question --text "Hörbuch in 15 min Teile\naufsplitten?"; then
    exit;
  else
    if [ $MP3 ]; then
      mp3splt -q -O 0.4 -t 15.0 -d "$NAMEOF" -o track_"$(date +%s)_$BNR"_@N \
       "$SOURCE.mp3" | zenity --progress  --pulsate --auto-close --no-cancel \
       --text "Hörbuch splitten ..." --title  "$NAMEOF"
       rm "$SOURCE.mp3"
    else
      oggsplt -q -O 0.4 -t 15.0 -d "$NAMEOF" -o track_"$(date +%s)_$BNR"_@N \
       "$SOURCE.ogg" | zenity --progress  --pulsate --auto-close --no-cancel \
       --text "Hörbuch splitten ..." --title  "$NAMEOF"
       rm "$SOURCE.ogg"
    fi
  fi
else
  # nachfolgende Zeilen auskommentieren falls nur eine große mp3-Datei erwünscht ist
  if [ $MP3 ]; then
    mp3splt -q -O 0.4 -t 15.0 -d "$NAMEOF" -o track_"$(date +%s)_$BNR"_@N "$SOURCE.mp3"
    # auskommentieren falls auch eine große mp3-Datei erwünscht ist
    rm "$SOURCE.mp3"
  else
    oggsplt -q -O 0.4 -t 15.0 -d "$NAMEOF" -o track_"$(date +%s)_$BNR"_@N "$SOURCE.ogg"
    # auskommentieren falls auch eine große mp3-Datei erwünscht ist
    rm "$SOURCE.ogg"
  fi 
fi
echo -e "\033\01330;34m------------------------------------------------------------\033\01330m"
echo Fertig.
exit 0
