#!/bin/bash

#### VDR-Aufnahmen rekursiv suchen, Filminfos auslesen und Videos in x264 umwandeln
###Author: Photon  2015     basierend auf vdr2x264 von
###
###
#####Funktionen
#  
## Aufruf mit Parameter -l
#Es werden 2 Listen erstellt. tracklist.lst mit den Verzeichnisnamen welche VDR 1.6 Aufnahmen
#enthalten. filmInfo.txt mit dem Namen des Films, dem Sender, dem Aspekt und der Bezeichnung der Tonspuren
#
#
## Aufruf mit Parameter -b
#
#Es werden die Listen wie mit -l erstellt. Sobald ein Film gefunden wird, wird dieser
#direkt transkodiert und nach SAVEDIR verschoben. Anschliessend wird der nächste
#Film gesucht
#
#
## Aufruf mit einer Pfadangabe
#
#Es wird nur der Film im übergebenen Verzeichnis transkodiert
#
## Aufruf ohne Parameter
#
#Dieser Text...


##Voreinstellungen

#Muxer festlegen (gewünschter auskommentieren)

  #MUXER=replex          # nur ein von beiden
  MUXER=projectx        # nur ein von beiden

#### variablen
##verzeichnisse (müssen vorhanden sein)
OUTPUTDIR=/home/photon/Rip/vdrConv/
SAVEDIR=/home/photon/Rip/fertig/
LOGDIR=/home/photon/Rip/logs/
STARTVERZ=/home/photon/Rip/vdr/        #oberstes Verzeichnis mit Aufnahmen
ROOTVERZ=`pwd`"/"


##dateinamen
INFO="info.vdr"

##parameter einlesen
OPT="$1""$2"

FILMDIR="$2"

##Fehlerumleitung in error.log im Log-Verzeichnis
exec 2>$LOGDIR"errors.log"


###funktionen
##allgemeine
green() { 
	echo -e "\e[1;32m$1\e[0;39;49m" 
        echo $1 >> $LOGDIR"converter.log"
        }

error() { 
	echo -e "\e[1;31m$1\e[0;39;49m"
	echo $1 >> $LOGDIR"errors.log"
	}  

rm_temp() {
  rm -f "$OUTPUTDIR"*.*
}

abbruch() {
  echo
  error "  ABBRUCH... lösche temporäre Dateien."
  echo
  rm_temp
  exit 1
}
 
trap 'abbruch' SIGHUP SIGINT SIGQUIT SIGKILL SIGABRT SIGFPE SIGSEGV SIGTERM SIGPIPE SIGIO


### Einstellungen nach converter.log schreiben
green "Aktuelle Parameter"
green "MUXER: ""$MUXER"
green "OUTPUTDIR ""$OUTPUTDIR"
green "SAVEDIR ""$SAVEDIR"
green "LOGDIR ""$LOGDIR"
green "STARTVERZ ""$STARTVERZ"
green "Parameter 1: ""$1"
green "Parameter 2 ""$2"
green ""



####vdrFindMovie
###
###  Sucht im STARTVERZ rekursiv nach vdr-Aufnahmen, erstellt 'tracklist.lst' mit den 
###  Verzeichnissen mit 001.vdr und 'filmInfo.txt' mit dem Titel, Kanal, Aspekt und Audiospuren
###

vdrFindMovie(){
	cd $STARTVERZ

	typeset -i anzahlFilme=0
	typeset -i anzahlDirs=0
	shallI="$1"
	
	##Alte Listen entfernen. error.log behalten
	
	if [ -e "$LOGDIR"tracklist.lst ];then
	     rm "$LOGDIR"tracklist.lst
	fi
	
	if [ -e "$LOGDIR"filmInfo.txt ];then
	     rm "$LOGDIR"filmInfo.txt
	fi
	
		leseInfo(){

	    filmInfo=""

		if [ ! -f info.vdr ]; then
		  echo
		    error "$movieDir"": Keine info-Datei!" >> "$LOGDIR"errors.log
		else

		  # info datei auslesen
		  
		  #Metadaten
		  CHANNEL=$(grep -m 1 ^C info.vdr | tr -s " " | cut -d " " -f 3)
		  NAME=$(grep -m 1 ^T info.vdr | tr -s " " | cut -d " " -f 2- | sed 's/ //g')
		  SUBNAME=$(grep -m 1 ^S info.vdr | tr -s " " | cut -d " " -f 2- | sed 's/ //g')

		  # falls SUBTITLE leer ist

		  if [ "$SUBNAME" = "" ]
		   then
		    OUTPUT="$NAME"
		        echo "output-Name: ""$OUTPUT"
		  else
		    OUTPUT="$NAME"-"$SUBNAME"
		        echo "output-Name(mitSub): ""$OUTPUT"
		  fi
		  
		  filmInfo+="$OUTPUT"
		  filmInfo+=" ""Sender: ""$CHANNEL"
		  
		  ### codec infos
		  
		  # Video-Track  info.vdr
		  
		  VTRACK=$(grep -m 1 ^'X 1' info.vdr | tr -s " " | cut -d " " -f 3)
		  VASPECT=""
		    case "$VTRACK" in
		  	01 ) VASPECT="4:3";;
		  	05 ) VASPECT="4:3";;
			02 ) VASPECT="16:9";;
			03 ) VASPECT="16:9";;
			06 ) VASPECT="16:9";;
			07 ) VASPECT="16:9";;
			*  ) VASPECT="unbekannt";;
		  esac
		  
		  filmInfo+=" ASPECT: ""$VASPECT"
		  
		  # Audio-Tracks 
		  
		   local -i anzahlAudioSpuren=0
		   local -i totalSpuren=$(grep -c ^'X 2' info.vdr)
		   
		   echo "anzahlAudioSpuren= ""$anzahlAudioSpuren"
		   echo "totalSpuren= ""$totalSpuren"
		   
		   filmInfo+=" ""Audiotracks ""$totalSpuren"
		      	   
		   while read line; do 
		        TRACKLINE=$(echo "$line" | sed -n '/^X 2/p')
		        if [ "$TRACKLINE" != "" ]; then 
			        tempSpurBEZ="$(echo $TRACKLINE | cut -d " " -f 4,5)"
			        tempSpurName=ATRACK"$anzahlAudioSpuren"	   
		                filmInfo+=" ""$tempSpurName"" ""$tempSpurBEZ"
			  	anzahlAudioSpuren+=1
		  	fi

		   done < info.vdr
		        echo "$filmInfo" >> "$LOGDIR"filmInfo.txt
		        green "Filminfo: ""$filmInfo"
		 fi
		}	
	
	##Function:subDirArray:
	## 
	##             Durchsucht die Ordner rekursiv auf VDR-Aufnahmen
	##             und legt die Pfade der einzelnen Datein in der
	##             Datei $LOGDIR/tracklist.lst ab. Bei "-b" wird der
	##	       Film jeweils direkt transkodiert
	
	subDirArray() {
	 verzString=""
	 local anzahlItem=`ls |wc -l`
	 local -i itemRun=0

	 for DIR in *    #`ls --group-directories-first --show-control-chars -1b`"
	   do
	        DTest=""
		DTest+=`pwd`
		DTest+="/"
		DTest+=$DIR

	     if [ -d "$DTest" ]
	       then
		cd "$DIR" 
	 	subDirArray
		verzString=""
		verzString+=`pwd`
		itemRun+=1
		anzahlDirs+=1

	     elif [[ $DIR == 001.vdr ]]; then
		movieDir=""
		movieDir=`pwd`
		movieDir+="/"

		echo "Filmverzeichnis gefunden: "$movieDir
		
		#### Aufruf leseInfo()
		leseInfo
		     ####Konvertier-Modus?
		     if [ "$shallI" = "-b" ]; then
		     vdrMovieConvert "$movieDir"
		      fi
	      
	            echo $movieDir >> "$LOGDIR"tracklist.lst
			verzString=""
			itemRun+=1
			anzahlFilme+=1

		     else
			 itemRun+=1
		fi		     		  
		     if (($itemRun==$anzahlItem)); then
			    cd ..
		     fi
	
	 done
	}

	##weitersuchen, hier wirds rekursiv
	subDirArray


	##Zusammenfassung
	green "Fertig! "$anzahlFilme" Filme in "$anzahlDirs" Ordner und Subordner" 

	##Information über evtl. Fehler
	if [ -s $LOGDIR"errors.log" ];then
	     echo
	     error "Es sind Fehler aufgetreten:"
	     cat $LOGDIR"errors.log"
	fi
    }
    
###vdrMovieConvert
###
###  
###  
###  
   
vdrMovieConvert(){
	FILMDIR="$1"
	cd "$FILMDIR"
	 
	
	#### titel der aufnahme herausfinden
	# info datei existiert?

	if [ ! -f "$INFO" ]; then

	  echo

	  error "  Die info-Datei existiert nicht!"

	  echo
	  OUTPUT="!UNBEKANNT!"
	  CHANNEL=""
	  CHANNEL=""
	  RECTIME=""
	  COMMENT=""
	  echo "  Standard-VDR-Dateiname: "$OUTPUT".mkv"

	  echo

	else

	# info datei auslesen
	  
	  #Metadaten
	  TITLE=$(grep -m 1 ^T "$INFO" | tr -s " " | cut -d " " -f 2-)
	  SUBTITLE=" - $(grep -m 1 ^S "$INFO" | tr -s " " | cut -d " " -f 2-)"
	  CHANNEL=$(grep -m 1 ^C "$INFO" | tr -s " " | cut -d " " -f 3)
	  RECTIME=$(date --date @$(grep -m 1 ^E "$INFO" | tr -s " " | cut -d " " -f 3))
	  COMMENT=$(grep -m 1 ^D "$INFO" | tr -s " " | cut -d " " -f 2-)
	  NAME=$(grep -m 1 ^T "$INFO" | tr -s " " | cut -d " " -f 2- | sed 's/ //g')
	  SUBNAME=$(grep -m 1 ^S "$INFO" | tr -s " " | cut -d " " -f 2- | sed 's/ //g')

	  # falls SUBTITLE leer ist

	  if [ "$SUBNAME" = "" ]
	   then
	    OUTPUT="$NAME"
	  else
	    OUTPUT="$NAME"-"$SUBNAME"
	  fi
	fi

	#### aufnahme muxen (aus einzelnen Teilen wird *.mpg)

	 
	for vdr in 0*.vdr; do
	   INPUT=$vdr
	   echo "input: "$INPUT
	   sleep 2
		if [ "$MUXER" = "replex" ]; then
		  replex -k -x -t MPEG2 -o "$OUTPUTDIR""$OUTPUT""$vdr".mpg "$INPUT"
		else
		  projectx -out "$OUTPUTDIR" -name "$OUTPUT""$vdr".mpg -tom2p "$INPUT"
		  mv "$OUTPUTDIR""$OUTPUT""$vdr"[pes][remux].mpg "$OUTPUTDIR""$OUTPUT""$vdr".mpg
		fi
	done
sleep 2
	#### Dateien zusammenführen
 
 
 for PART  in "$OUTPUTDIR"*.vdr.mpg; do        
     cat $PART >> "$OUTPUTDIR""$OUTPUT".mpg
      INPUT="$OUTPUTDIR""$OUTPUT".mpg
      green "  Teilstück verschoben"
      rm $PART
  done	
  
  green "  Alle Teile zusammengeführt"

sleep 2
	#### nach aac/x264 kodieren
	green "  Beginne transkodieren von "$OUTPUTDIR""$OUTPUT"".mpg""
	exec 2> /dev/null
	ffmpeg -threads 2 -loglevel 16 -i "$OUTPUTDIR""$OUTPUT".mpg -y -preset fast -map 0 -acodec libvo_aacenc -vcodec libx264  "$OUTPUTDIR""$OUTPUT".avi
	exec 2>$LOGDIR"errors.log"
	wait
	###Folgender Aufruf transkodiert Track0 (Video) nach x264 und splittet den 
	###audioTrack (2-Kanal-Ton) in 2 verschiedene Tracks mit je einer Sprache
	###
	#ffmpeg -i "$OUTPUTDIR""$OUTPUT".mpg -map 0:0 -map 0:1 -map 0:1 -vcodec libx264 -map_channel 0.1.0:0.1 -map_channel 0.1.1:0.2 -acodec libvo_aacenc "$OUTPUTDIR""$OUTPUT".avi


	#Film Infos bereitstellen
	
	green "  schreibe FilmInfos"

	echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>

	<!DOCTYPE Tags SYSTEM \"matroskatags.dtd\">

	<Tags>

	  <Tag>

	    <Simple>

	      <Name>Source</Name>

	      <String>TV - VDR</String>
	      
	    </Simple>

	    <Simple>

	      <Name>Title</Name>

	      <String>"$TITLE"</String>

	    </Simple>

	    <Simple>

	      <Name>TV-Channel</Name>

	      <String>"$CHANNEL"</String>

	    </Simple>

	    <Simple>

	      <Name>Record Time</Name>

	      <String>"$RECTIME"</String>

	    </Simple>
	    
	    <Simple>

	      <Name>Comment</Name>

	      <String>"$COMMENT"</String>

	    </Simple>

	  </Tag>

	</Tags>" > "$OUTPUTDIR""$OUTPUT".xml


	# mkvmerge : Container füllen

	green "  Container füllen"

	mkvmerge --global-tags "$OUTPUTDIR""$OUTPUT".xml --title "$OUTPUT" "$OUTPUTDIR""$OUTPUT".avi --no-chapters -o "$OUTPUTDIR""$OUTPUT".mkv

	sleep 2
	mv "$OUTPUTDIR""$OUTPUT".mkv $SAVEDIR
	green "Film ""$Title"" nach ""$SAVEDIR"" verschoben"
	green ""
	sleep 2
	rm_temp
}   
   
 ####vdrBatchConvert
###
###  
###  
### 
#vdrBatchConvert() {
#set -m
#	while 
#	read line #< "$LOGDIR"tracklist.lst
#	 do
#          vdrMovieConvert "$line"
#	 sleep 2
#	 done < "$LOGDIR"tracklist.lst  
#}   
    
    
#### Parameter-Abfragen

if [ "$1" = ""  ]; then
  echo "
#####Funktionen
#  
## Aufruf mit Parameter -l
#Es werden 2 Listen erstellt. tracklist.lst mit den Verzeichnisnamen welche VDR 1.6 Aufnahmen
#enthalten. filmInfo.txt mit dem Namen des Films, dem Sender, dem Aspekt und der Bezeichnung der Tonspuren
#
#
## Aufruf mit Parameter -b
#
#Es werden die Listen wie mit -l erstellt. Sobald ein Film gefunden wird, wird dieser
#direkt transkodiert und nach SAVEDIR verschoben. Anschliessend wird der nächste
#Film gesucht
#
#
## Aufruf mit einer Pfadangabe
#
#Es wird nur der Film im übergebenen Verzeichnis transkodiert
#
## Aufruf ohne Parameter
#
#Dieser Text..."
    exit
fi

if [ "$1" = "-l" ]; then
  echo green " Nur Filme auflisten"
  vdrFindMovie
  exit
fi

if [ "$1" = "-s" ]; then
  green " Einen Film konvertieren"
  if [ -n "$FILMDIR" ]; then
      rm "$OUTPUTDIR"*.mpg
      vdrMovieConvert "$FILMDIR"
   else
      error " Bitte Pfad angeben!"
  fi
  exit
fi
if [ "$1" = "-b" ]; then
  green " Filmliste abarbeiten"
  vdrFindMovie -b
  exit
fi
