diff options
| author | root <root@elwms02.(none)> | 2010-04-06 16:13:08 +0200 |
|---|---|---|
| committer | root <root@elwms02.(none)> | 2010-04-06 16:13:08 +0200 |
| commit | 0e7005fcc7483c01aa102fbea358c5ac65a48d62 (patch) | |
| tree | 11517ce0d3d2977c6732b3aa583b0008083e0bd3 /plugins/dvdconvert | |
| download | x-vdr-0e7005fcc7483c01aa102fbea358c5ac65a48d62.tar.gz x-vdr-0e7005fcc7483c01aa102fbea358c5ac65a48d62.tar.bz2 | |
hello world
Diffstat (limited to 'plugins/dvdconvert')
| -rwxr-xr-x | plugins/dvdconvert/dvdconvert/dvd2dvd.sh | 1559 | ||||
| -rwxr-xr-x | plugins/dvdconvert/dvdconvert/dvd2vdr.sh | 1386 | ||||
| -rwxr-xr-x | plugins/dvdconvert/dvdconvert/dvdconvert.sh | 31 | ||||
| -rwxr-xr-x | plugins/dvdconvert/dvdconvert/getadmval.sh | 16 | ||||
| -rwxr-xr-x | plugins/dvdconvert/dvdconvert/setadmval.sh | 26 | ||||
| -rwxr-xr-x | plugins/dvdconvert/dvdconvert/start_dvd2dvd.sh | 63 | ||||
| -rwxr-xr-x | plugins/dvdconvert/dvdconvert/start_dvd2vdr.sh | 57 | ||||
| -rw-r--r-- | plugins/dvdconvert/patches/dvdconvert-1.0.2_versnum-fix.diff | 39 | ||||
| -rwxr-xr-x | plugins/dvdconvert/plugin.sh | 161 |
9 files changed, 3338 insertions, 0 deletions
diff --git a/plugins/dvdconvert/dvdconvert/dvd2dvd.sh b/plugins/dvdconvert/dvdconvert/dvd2dvd.sh new file mode 100755 index 0000000..74fe2b1 --- /dev/null +++ b/plugins/dvdconvert/dvdconvert/dvd2dvd.sh @@ -0,0 +1,1559 @@ +#! /bin/bash + +############################################################################ +# Copyright (C) 2004 by Ronny Frankowski (lini@lausitz.net) # +# & AngieSoft (vdr@angiesoft.de) # +# & Matthias Appel (private_tweety@gmx.net) # +# # +# This program is free software; you can redistribute it and#or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program; if not, write to the # +# Free Software Foundation, Inc., # +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # +############################################################################ + + +########################################################################### +# define some variables +########################################################################### + +VERSION="1.0.2-xvdr" + +[ -r /etc/default/vdr ] && . /etc/default/vdr +[ -d "$VIDEODIR" ] || exit +[ -d "$DVDISODIR" ] || exit +[ -d "$VDRVARDIR" ] || exit +[ -d "$VDRBINDIR" ] || exit +[ -n "$DVDBURNER" ] || exit + +VIDEODIR="$VIDEODIR" # video directory of vdr +ISODIR="$DVDISODIR" # dir for the isofiles +WORKDIR="$VDRVARDIR/dvdconvert/dvd2dvd" # working directory of dvd2dvd +DVD_DEVICE="$DVDBURNER" # dvd device + +LANGUAGE="de" # select preferred language + # "de", "en" + +RECORDING_LIFETIME=99 # lifetime from 00 to 99 + +DVD_SIZE=4300000000 # DVD Size 4,3GB + +#TITLE_MIN_LENGTH=60 # mimimun length in sec for + # a title on a DVD to be + # considered for conversion + +PRIO=19 # priority from 1 to 19 +SLEEPTIME=10 # wait for user action +VERBOSE=1 # be verbose - 0: off, 1: on +DEBUG=2 # debug info - 0: off, 1-3: level +FORCE=0 # force exec - 0: off, 1: on (erzwingen) +CLEAN=1 # clean dirs - 0: off, 1: on (abschliesendes loeschen) +REMOVE=1 # remove tmp file - 0: off, 1: on (temp. loeschen im Betrieb) + +REMOVE_ISO=0 # remove iso file - 0: off, 1: on +BURN=0 # burn a dvd - 0: off, 1: on +RW_FORMAT=0 # format a dvd+rw or dvd-rw disk - 0: off, 1: on + +OSDINFO=1 # svdrpsend - 0: off, 1: on + +A52DEC_GAIN="+5.0" # add gain in decibels +CREATE_MARKS=0 # create a marks.vdr for vdr - 0: off, 1: on + + +########################################################################### +# define required tools +########################################################################### + +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:~/bin + +SVDRPSEND_PL="$VDRBINDIR/svdrpsend.pl" + +VOBCOPY_BIN=vobcopy +EJECT_BIN=eject +TCPROBE_BIN=tcprobe +TCCAT_BIN=tccat +TCEXTRACT_BIN=tcextract +TCDEMUX_BIN=tcdemux + +A52DEC_BIN=a52dec +TOOLAME_BIN=toolame +MP2ENC_BIN=mp2enc + +JAVA_BIN=java +PROJECTX_JAR=$PROJECTX_HOME/ProjectX.jar +[ ! -f "$PROJECTX_JAR" ] && PROJECTX_JAR=/usr/bin/ProjectX/ProjectX.jar +PROJECTX_INI=$PROJECTX_HOME/ProjectX.ini +[ ! -f "$PROJECTX_INI" ] && PROJECTX_JAR=/usr/bin/ProjectX/ProjectX.ini +XVFB_BIN=Xvfb + +TCMPLEX_BIN=tcmplex +TCMPLEX_PANTELTJE_BIN=tcmplex-panteltje +MPLEX_BIN=mplex + +REQUANT_BIN=tcrequant + +DVDAUTHOR_BIN=dvdauthor + +MKISOFS_BIN=mkisofs + +DVDSTATUS_BIN=dvd+rw-mediainfo +DVDRECORD_BIN=dvdrecord +GROWISOFS_BIN=growisofs + +DVDRECORD_OPT_1="-dao blank=fast" +DVDFORMAT_BIN="dvd+rw-format -f" +DVDRECORD_OPT_2="-dao driveropts=burnfree" +DVDFORMAT_OPT="-Z" + +LOGDIR="$VDRVARDIR/dvdconvert/log" +LOGFILE=$LOGDIR/dvd2dvd.log +LOCKFILE=$LOGDIR/dvd2dvd.LOCK + + +########################################################################### +# print usage information +########################################################################### + +usage() { +test -n "$1" && echo "${RED} Error: $1${NORMAL}" && echo +echo " DVD2DVD Version ${MAGENTA}$VERSION${NORMAL}" +echo +echo " ${CYAN}Usage: ${GREEN}$0${NORMAL}" +echo " ${CYAN} or: ${GREEN}$0${NORMAL} <action> [options]" +echo +echo " DVD2DVD is intended to convert the main movie of a DVD into" +echo " a VDR recoring. If required the main movie will be demuxed" +echo " transcoded and remuxed again." +echo +echo " ${CYAN}Actions:${NORMAL}" +echo +echo "${GREEN} all${NORMAL}" +echo " Do all steps of the following" +echo "${GREEN} copy${NORMAL}" +echo " Copy the main movie to disk" +echo "${GREEN} demux${NORMAL}" +echo " Demultiplex the main movie in mpv and ac3" +echo "${GREEN} encode${NORMAL}" +echo " Encode ac3 to mp2" +echo "${GREEN} reqant${NORMAL}" +echo " Verkleinern des Videofile" +echo "${GREEN} mplex${NORMAL}" +echo " Multiplex the parts to a VDR recording" +echo "${GREEN} dvdauthor${NORMAL}" +echo " Create a dvd structur" +echo "${GREEN} iso${NORMAL}" +echo " Create a iso file" +echo "${GREEN} burn${NORMAL}" +echo " Burn the DVD" +echo "${GREEN} move${NORMAL}" +echo " Move recording to video directory" +echo +echo " ${CYAN}Options:${NORMAL}" +echo +echo "${GREEN} -i | --device ${MAGENTA}<device>${NORMAL}" +echo " Read DVD structure from this device" +echo "${GREEN} -o ${MAGENTA}<dirname>${NORMAL}" +echo " Write output into this video directory" +echo "${GREEN} -s ${MAGENTA}<dirname>${NORMAL}" +echo " Write iso file into this directory" +echo "${GREEN} -w ${MAGENTA}<dirname>${NORMAL}" +echo " Use working directory as base for temp directory" +echo "${GREEN} -t ${MAGENTA}<dirname>${NORMAL}" +echo " Use temp directory for temporary files" +echo "${GREEN} --preferred-language ${MAGENTA}<language>${NORMAL}" +echo " Choose preferred language for messages" +echo " and the main movie (default is \"de\")" +echo "${GREEN} --no-osd-info${NORMAL}" +echo " Don't send messages to the OSD of VDR" +echo "${GREEN} --set-title ${MAGENTA}<string>${NORMAL}" +echo " Set title of main movie to <string>" +echo "${GREEN} --read-title-num ${MAGENTA}<number>${NORMAL}" +echo " Read specific title set (1-99)" +echo "${GREEN} --use-tcextract${NORMAL}" +echo " Demux the main movie with tcextract (default)" +echo "${GREEN} --use-projectX${NORMAL}" +echo " Demux the main movie with projectX." +echo " Ensure to have a X server running" +echo "${GREEN} --projectX-ini ${MAGENTA}<filename>${NORMAL}" +echo " Use this X.ini for projectX" +echo "${GREEN} --use-Xvfb | --without-X${NORMAL}" +echo " Start a virtual X Server with Xvfb" +echo "${GREEN} --add-gain ${MAGENTA}<string>${NORMAL}" +echo " Add gain to mp2 audio (-96.0 to +96.0)" +echo "${GREEN} --use-mp2enc${NORMAL}" +echo " Encode the audio track with mp2enc" +echo "${GREEN} --use-toolame${NORMAL}" +echo " Encode the audio track with toolame (default)" +echo "${GREEN} --use-mp3gain${NORMAL}" +echo " Normalize ac3 (time consuming)" +echo "${GREEN} --use-tcmplex${NORMAL}" +echo " Remux with tcmplex (default)" +echo "${GREEN} --use-tcmplex-panteltje${NORMAL}" +echo " Remux with tcmplex-panteltje" +echo "${GREEN} --use-mplex${NORMAL}" +echo " Remux with mplex" +echo "${GREEN} --no-burn${NORMAL}" +echo " No burn a DVD" +echo "${GREEN} --no-rw-formatburn${NORMAL}" +echo " No format a DVD+RW" +echo "${GREEN} --force${NORMAL}" +echo " Force execution of <action>" +echo "${GREEN} --verbose${NORMAL}" +echo " Turns verbosity on" +echo "${GREEN} -V | --version${NORMAL}" +echo " Print version information and exit" +echo "${GREEN} --all-versions${NORMAL}" +echo " Print version information of most used tools" +echo "${GREEN} -h | -? | --help${NORMAL}" +echo " Print this usage information" +exit 1 +} + +########################################################################### +# set color parameters +########################################################################### + +# ANSI COLORS +CRE=" +[K" +NORMAL="[0;39m" +# RED: Failure or error message +RED="[1;31m" +# GREEN: Success message +GREEN="[1;32m" +# YELLOW: Descriptions +YELLOW="[1;33m" +# BLUE: System messages +BLUE="[1;34m" +# MAGENTA: Found devices or drivers (pink) +MAGENTA="[1;35m" +# CYAN: Questions (hellblau) +CYAN="[1;36m" +# BOLD WHITE: Hint +WHITE="[1;37m" + +########################################################################### +# check for given parameters +########################################################################### + +case $DEBUG in + 1) ;; + 2) set -x ;; + 3) set -xv ;; + *) LOGFILE=/dev/null ;; +esac + +ACTION="all" +OPTIONS=$@ +TEMPDIR="" +LANGUAGES=("de" "en") +TITLE="" +TITLENUM="AUTO" # AUTO = vobcopy-test; MAX = max. Frames; 1,2,3... DVD-Title +RECORDING="" +AUDIOTRACK=-1 +AUDIOFORMAT="" +TCEXTRACTOPTAUDIO="" +WITHOUT_X=1 +AC3_TRACK=1 + +GETTITLE_TOOLS=("user-input" "vobcopy") +COPY_TOOLS=("tccat") +DEMUX_TOOLS=("tcextract" "projectX") +ENCODE_TOOLS=("mp2enc" "toolame") +MPLEX_TOOLS=("tcmplex" "tcmplex-panteltje" "mplex") + +ACTION_GETTITLE=${GETTITLE_TOOLS[1]} +ACTION_COPY=${COPY_TOOLS[0]} +ACTION_DEMUX=${DEMUX_TOOLS[0]} +ACTION_ENCODE=${ENCODE_TOOLS[0]} +ACTION_MPLEX=${MPLEX_TOOLS[1]} + +while [ $# -gt 0 ]; do + case $1 in + all|gettitle|copy|demux|encode|requant|mplex|dvdauthor|iso|burn|move) + ACTION="$1" + ;; + -i|--device) + [ -b "$2" ] || usage "${RED}unknown device ${MAGENTA}'$2'${NORMAL}" + DVD_DEVICE="$2" + shift + ;; + -o) + [ -d "$2" ] || usage "${RED}missing directory ${MAGENTA}'$2'${NORMAL}" + VIDEODIR="$2" + shift + ;; + -s) + [ -d "$2" ] || usage "${RED}missing directory ${MAGENTA}'$2'${NORMAL}" + ISODIR="$2" + shift + ;; + -w) + [ -d "$2" ] || usage "${RED}missing directory ${MAGENTA}'$2'${NORMAL}" + WORKDIR="$2" + shift + ;; + -t) + [ -d "$2" ] || usage "${RED}missing directory ${MAGENTA}'$2'${NORMAL}" + TEMPDIR=`echo $2 | sed "s/\/$//"` + shift + ;; + --preferred-language) + [ $2 = "" ] || usage "${RED}missing language${NORMAL}" + LANGUAGE=$2 + shift + ;; + --no-osd-info) + OSDINFO=0 + ;; + --set-title) + TITLE=`echo $2 | sed "s/[^a-zA-Z0-9???????/:.#'&_-]/_/g"` + ACTION_GETTITLE=${GETTITLE_TOOLS[0]} + shift + ;; + --read-title-num) +# [ $2 -ge 1 -a $2 -le 99 ] || usage "${RED}invalid title number ${MAGENTA}'$2'${NORMAL}" + TITLENUM=$2 + shift + ;; + --use-tcextract) + ACTION_DEMUX=${DEMUX_TOOLS[0]} + ;; + --use-projectX) + ACTION_DEMUX=${DEMUX_TOOLS[1]} + ;; + --projectX-ini) + [ -e "$2" ] || usage "${RED}missing file ${MAGENTA}'$2'${NORMAL}" + PROJECTX_INI="$2" + shift + ;; + --use-Xvfb|--without-X) + WITHOUT_X=0 + ;; + --add-gain) + [ `echo $2 | \\ + grep -c "[+-][[:digit:]]\{1,2\}\.[[:digit:]]"` -eq 1 ] || \ + usage "${RED}invalid gain ${MAGENTA}'$2'${NORMAL}" + A52DEC_GAIN="$2" + shift + ;; + --use-mp2enc) + ACTION_ENCODE=${ENCODE_TOOLS[0]} + ;; + --use-toolame) + ACTION_ENCODE=${ENCODE_TOOLS[1]} + ;; + --use-tcmplex) + ACTION_MPLEX=${MPLEX_TOOLS[0]} + ;; + --use-tcmplex-panteltje) + ACTION_MPLEX=${MPLEX_TOOLS[1]} + ;; + --use-mplex) + ACTION_MPLEX=${MPLEX_TOOLS[2]} + ;; + --remove-iso) + REMOVE_ISO=1 + ;; + --no-burn) + BURN=0 + ;; + --no-rw-format) + RW_FORMAT=0 + ;; + --force) + FORCE=1 + ;; + --clean) + CLEAN=1 + ;; + --verbose) + VERBOSE=1 + ;; + -V|--version) + echo "${GREEN}$0 ${MAGENTA}Version $VERSION${NORMAL}" + exit 1 + ;; + --all-versions) + echo "${GREEN}$0 ${MAGENTA}Version $VERSION${NORMAL}" + echo + $VOBCOPY_BIN --version + $TCPROBE_BIN -v + $TCCAT_BIN -v + $TCEXTRACT_BIN -v + $TCDEMUX_BIN -v + echo + $A52DEC_BIN - 2>&1|grep a52dec + $TOOLAME_BIN --version 2>&1|grep version + echo + $JAVA_BIN -version + echo + $MPLEX_BIN -? 2>&1|grep version + $TCMPLEX_BIN -v + $TCMPLEX_PANTELTJE_BIN -v + echo + $MKISOFS_BIN -version + echo + $GROWISOFS_BIN -version 2>&1|grep version + $DVDRECORD_BIN -version + echo + exit 1 + ;; + -h|-?|--help) + usage + ;; + *) + usage "${RED}unknown option ${MAGENTA}'$1'${NORMAL}" ;; + esac + shift +done + +[ -f "$DVD2DVD_CONF" ] && . "$DVD2DVD_CONF" + + +########################################################################### +# translation tables for user messages +########################################################################### + +LNG=0 +for i in 0 1 ; do + [ $LANGUAGE = ${LANGUAGES[$i]} ] && LNG=$i +done + +MESG_01=( \ +"Bitte die zu kopierende DVD einlegen" \ +"please insert DVD" \ +) + +MESG_02=( \ +"Keine DVD im Laufwerk erkannt" \ +"DVD not found" \ +) + +MESG_03=( \ +"Kopiere DVD auf Disk" \ +"Copy DVD to disk" \ +) + +MESG_04=( \ +"Videospur nicht gefunden - Abbruch" \ +"main movie not found - exiting" \ +) + +MESG_05=( \ +"Tonspur '$LANGUAGE' nicht gefunden - Abbruch" \ +"Audio track '$LANGUAGE' not found - exiting" \ +) + +MESG_06=( \ +"Kein unterstuetztes Audioformat auf der DVD gefunden - Abbruch" \ +"no supported audio format found - exiting" \ +) + +MESG_07=( \ +"Kopieren der DVD gescheitert - Abbruch" \ +"copying of main movie failed - exiting" \ +) + +MESG_08=( \ +"DVD auslesen beendet, bitte DVD entnehmen" \ +"main movie successfully read, please remove DVD" \ +) + +MESG_09=( \ +"Fehler bei der Umwandlung der DVD-Daten - Abbruch" \ +"failed to transcode the main movie - exiting" \ +) + +MESG_10=( \ +"DVD Daten werden mit '$ACTION_DEMUX' bearbeitet" \ +"" \ +) + +MESG_11=( \ +"DVD Daten werden mit '$ACTION_MPLEX' bearbeitet" \ +"" \ +) + +MESG_12=( \ +"DVD Daten werden mit '$REQUANT_BIN' verkleinert" \ +"" \ +) + +MESG_13=( \ +"DVD Daten werden auf DVD gebrannt" \ +"" \ +) + +MESG_14=( \ +"Alle temp. Daten geloescht" \ +"" \ +) + +MESG_15=( \ +"Daten befinden sich in ${ISODIR}" \ +"" \ +) + +MESG_16=( \ +"!!! GRATULATION , FERTIG !!!" \ +"" \ +) + +MESG_17=( \ +"DVD Daten werden mit '$DVDAUTHOR_BIN' bearbeitet" \ +"" \ +) + +MESG_18=( \ +"DVD Daten werden mit '$MKISOFS_BIN' bearbeitet" \ +"" \ +) + +MESG_19=( \ +"DVD-Rohling fuer Brennvorgang einlegen" \ +"" \ +) + +MESG_20=( \ +"DVD-RW Medium wird geloescht" \ +"" \ +) + +MESG_21=( \ +"DVD wird geschrieben" \ +"" \ +) + +MESG_22=( \ +"DVD Schreibvorgang beendet, DVD entnehmen" \ +"" \ +) + +MESG_23=( \ +"DVD Schreibvorgang fehlgeschlagen, DVD entnehmen" \ +"" \ +) + +MESG_30=( \ +"textutils Fehler, update dein coreutils" \ +"error textutils, upgrade your coreutils" \ +) + +########################################################################### +# prepare to run +########################################################################### + +d2v_error () { + echo "${RED}ERROR: ${MAGENTA}$1${NORMAL}" + $EJECT_BIN $DVD_DEVICE + exit 255 +} + + +d2v_log () { + [ $VERBOSE -eq 1 -o "$2" = "force" ] && echo "`date +"%T"`: $1" + echo "`date +"%T"`: $1" >> $LOGFILE +} + + +d2v_log_separator () { + d2v_log "---------------------------------------------------------------" +} + + +d2v_log_force () { + d2v_log "$1" force +} + + +d2v_mesg () { + if [ $OSDINFO -eq 1 ] ; then + d2v_log "$SVDRPSEND_PL MESG $1" + $SVDRPSEND_PL MESG "$1" >> $LOGFILE + fi +} + +if [ -e $LOCKFILE ] ; then + if [ $FORCE -eq 1 ] ; then + rm -f $LOCKFILE + else + PIDID=`cat $LOCKFILE` + RUNCHECK=`ps $PIDID | grep 'dvd2' | wc -l` + if [ $RUNCHECK -eq 0 ]; then + rm -f $LOCKFILE + d2v_log "dvd2dvd is not active, remove lockfile done" + else + d2v_error "$0 is already running" + fi + fi +fi + +echo "$0 $OPTIONS" > $LOGFILE || d2v_error "${RED}Cannot create \$LOGFILE ${MAGENTA}'$LOGFILE'${NORMAL}" +echo $$ > $LOCKFILE || d2v_error "${RED}Cannot create \$LOCKFILE ${MAGENTA}'$LOCKFILE'${NORMAL}" + +d2v_log_separator +d2v_log_force START + +[ -d $VIDEODIR ] || d2v_error "${RED}\$VIDEODIR ${MAGENTA}'$VIDEODIR' ${RED}not found${NORMAL}" + VIDEODIR=`echo $VIDEODIR | sed "s/\/$//"` +[ -d $WORKDIR ] || d2v_error "${RED}\$WORKDIR ${MAGENTA}'$WORKDIR' ${RED}not found${NORMAL}" + WORKDIR=`echo $WORKDIR | sed "s/\/$//"` +[ -b $DVD_DEVICE ] || d2v_error "${RED}\$DVD_DEVICE ${MAGENTA}'$DVD_DEVICE' ${RED}not found${NORMAL}" + +[ $PRIO -ge 1 -a $PRIO -le 19 ] || \ + d2v_error "${RED}\$PRIO ${MAGENTA}$PRIO ${RED}out of range${NORMAL}" +[ $VERBOSE -ge 0 -a $VERBOSE -le 1 ] || \ + d2v_error "${RED}\$VERBOSE ${MAGENTA}$VERBOSE ${RED}out of range${NORMAL}" + +########################################################################### +# check the temp directory +########################################################################### + +d2v_log_separator +d2v_log_force "checking the temp directory" + +if [ $ACTION = "all" -a -z "$TEMPDIR" ] ; then + + TEMPDIR=`mktemp -dp ${WORKDIR}` + TEMPDIR_ISO=`mktemp -dp ${TEMPDIR}` + + d2v_log "\$TEMPDIR='$TEMPDIR' and \$TEMPDIR_ISO='$TEMPDIR_ISO' created" + +elif [ $ACTION != "all" -a -z "$TEMPDIR" ] ; then + + HELP="`echo && echo \$\> ls -d1 ${WORKDIR} && ls -d1 ${WORKDIR}/tmp.* 2> /dev/null`" + [ `ls -d1 ${WORKDIR}/tmp.* 2> /dev/null | wc -l` -ne 1 ] && d2v_error "${RED}no unique temp directory found ${MAGENTA}$HELP${NORMAL}" + + TEMPDIR=`ls -d1 ${WORKDIR}/tmp.* | head -n 1` + TEMPDIR_ISO=`ls -d1 ${TEMPDIR}/tmp.* | head -n 1` + + d2v_log "\$TEMPDIR='$TEMPDIR' and \$TEMPDIR_ISO='$TEMPDIR_ISO' used" +else + d2v_log "\$TEMPDIR='$TEMPDIR' and \$TEMPDIR_ISO='$TEMPDIR_ISO' used" +fi + + + +########################################################################### +# read and write global variables to disk +########################################################################### + +VARIABLES="TITLE RECORDING TITLENUM AUDIOTRACK AUDIOFORMAT TCEXTRACTOPTAUDIO" + +readvars () { + local FILE=${TEMPDIR}/variables.info + + if [ -f $FILE ] ; then + d2v_log_separator + d2v_log_force "reading file '$FILE'" + + for i in $VARIABLES ; do + if [ "$i" != "TITLE" -o "$TITLE" = "" ] ; then + eval $i=\"`grep "^$i=" $FILE | awk -F = '{print $2}'`\" + eval d2v_log \"\\\$$i=\'$`echo $i`\'\" + fi + done + fi +} + +writevars () { + local FILE=${TEMPDIR}/variables.info + + if [ "$TITLE" != "" -a "$RECORDING" != "" ] ; then + d2v_log_separator + d2v_log_force "writing file '$FILE'" + + echo "LASTRUN=`date +"%Y-%m-%d %T"`" > $FILE || \ + d2v_error "${RED}Cannot create file ${MAGENTA}'$FILE'${NORMAL}" + + for i in $VARIABLES ; do + eval echo "$i=$`echo $i`" >> $FILE + done + fi +} + + +########################################################################### +# gettitle of the main movie +########################################################################### + +gettitle () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_GETTITLE' to get the title of the main movie" + + if [ "$TITLE" = "" -o "$RECORDING" = "" -o $FORCE -eq 1 ] ; then + + # insert DVD and do some checks + d2v_mesg "${MESG_01[$LNG]}" + $EJECT_BIN $DVD_DEVICE + sleep $SLEEPTIME + + local DVDSTATUS="1" + while [ "$DVDSTATUS" -gt 0 ] ; do + $TCPROBE_BIN -i $DVD_DEVICE -H 10 >> $LOGFILE 2>&1> /dev/null + DVDSTATUS=$? + if [ $DVDSTATUS -gt 0 ]; then + d2v_mesg "${MESG_02[$LNG]}" + # insert DVD + d2v_mesg "${MESG_01[$LNG]}" + $EJECT_BIN $DVD_DEVICE + sleep $SLEEPTIME + fi + done + + case $ACTION_GETTITLE in + ${GETTITLE_TOOLS[0]}) + ;; + ${GETTITLE_TOOLS[1]}) + d2v_log "`echo && echo \$\> $VOBCOPY_BIN -i $DVD_DEVICE \ + -v -v -I -L ${TEMPDIR} 2\> /dev/null`" + $VOBCOPY_BIN -i $DVD_DEVICE -v -v -I \ + -L ${TEMPDIR} 2> /dev/null && \ + TITLE=`cat ${TEMPDIR}/vobcopy_*.log | \ + grep 'Name of the dvd' | head -n 1 | awk '{print $6}'` && \ + cat ${TEMPDIR}/vobcopy_*.log >> $LOGFILE + if [ $TITLENUM = "AUTO" ] ; then + TITLENUM=`cat ${TEMPDIR}/vobcopy_*.log | \ + grep 'Using Title' | head -n 1 | awk '{print $4}'` + fi + ;; + esac + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + + TITLE=`echo $TITLE | sed "s/[^a-zA-Z0-9???????/:.#'&_-]/_/g"` + [ `echo $TITLE | wc -m` -le 2 ] && TITLE="DVD`date +%Y-%m-%d-%M-%H`" + + RECORDING="`date +%Y-%m-%d.%H.%M`" + fi + + d2v_log_force "\$TITLE='$TITLE'" + d2v_log_force "\$TITLENUM='$TITLENUM'" + d2v_log_force "\$RECORDING='$RECORDING'" +} + + +########################################################################### +# test for the main movie +########################################################################### + +test () { + d2v_log_separator + d2v_log_force \ + "using 'tcprobe' to test for the main movie" + + if [ ! -f ${TEMPDIR}/001.vob -o $FORCE -eq 1 -o \ + $AUDIOTRACK -lt 0 -o "$AUDIOFORMAT" = "" -o \ + "$TCEXTRACTOPTAUDIO" = "" ] ; then + + # find main movie + local MAX_TITLENUM=0 + + d2v_log "`echo && echo \$\> $TCPROBE_BIN -H 0 \ + -i $DVD_DEVICE 2\>\&1 \| grep 'title 1/' \| awk '{print $5}'`" + + MAX_TITLENUM=`$TCPROBE_BIN -H 0 -i $DVD_DEVICE 2>&1 | \ + grep 'title 1/' | awk '{print $5}'` + + if [ $MAX_TITLENUM = 0 ] ; then + d2v_mesg "${MESG_04[$LNG]}" + #$TCPROBE_BIN -H 0 -i $DVD_DEVICE 2>&1 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + fi + + d2v_log "\$MAX_TITLENUM='$MAX_TITLENUM'" + + local i=0 + local FRAMES=0 + local MAX_FRAMES=0 + + if [ $TITLENUM = "MAX" ] ; then + while [ "$i" -lt $MAX_TITLENUM ] ; do + i=$((i+1)) + FRAMES=`$TCPROBE_BIN -i $DVD_DEVICE -H 10 -T $i \ + 2>/dev/null | grep 'frames' | awk '{print $3}'` + [ -z $FRAMES ] && FRAMES="0" + if [ $FRAMES -gt $MAX_FRAMES ] ; then + if [ $FRAMES -gt $((${TITLE_MIN_LENGTH}*25)) ]; then + TITLENUM="$i" + MAX_FRAMES="$FRAMES" + fi + fi + done + fi + + d2v_log "\$MAX_FRAMES='$MAX_FRAMES'" + if [ $TITLENUM = "MAX" ]; then + d2v_mesg "${MESG_04[$LNG]}" + $TCPROBE_BIN -H 0 -i $DVD_DEVICE 2>&1 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + fi + + d2v_log "\$TITLENUM='$TITLENUM'" + + # create the marks.vdr + if [ $CREATE_MARKS -eq 1 ]; then + d2v_log "`echo && echo \$\> $TCPROBE_BIN -i $DVD_DEVICE -H 10 \ + -T $TITLENUM 2\>\&1 \| grep Chapter \| cut -d \\\" \\\" -f 4 \ + \> ${TEMPDIR}/marks.vdr`" + $TCPROBE_BIN -i $DVD_DEVICE -H 10 -T $TITLENUM 2>&1 | \ + grep Chapter | cut -d " " -f 4 > ${TEMPDIR}/marks.vdr + fi + + # read audio track + local AUDIOTYPE="" + local AUDIOTYPELINES=0 + local AUDIOFORMATLINES=0 + + d2v_log "`echo && echo \$\> $TCPROBE_BIN -i $DVD_DEVICE -H 10 \ + -T $TITLENUM 2\> /dev/null \| grep dvd_reader.c \| grep kHz \| \ + cat -b - \> ${TEMPDIR}/transcode-audio.log`" + $TCPROBE_BIN -i $DVD_DEVICE -H 10 -T $TITLENUM 2> /dev/null | \ + grep dvd_reader.c | \ + grep kHz | cat -b - > ${TEMPDIR}/transcode-audio.log + + d2v_log "`echo && echo \$\> $TCPROBE_BIN -i $DVD_DEVICE -H 10 \ + -T $TITLENUM 2\> /dev/null \| grep "audio track:" \ + cat -b - \> ${TEMPDIR}/transcode-audio2.log`" + $TCPROBE_BIN -i $DVD_DEVICE -H 10 -T $TITLENUM 2> /dev/null | \ + grep "audio track:" | cat -b - > ${TEMPDIR}/transcode-audio2.log + + AUDIOTRACK=`cat ${TEMPDIR}/transcode-audio.log | \ + grep -n " "$LANGUAGE" " | grep "ac3" | head -n 1 | \ + awk '{print (($1-1))}'` + + if [ -z $AUDIOTRACK ] ; then + AUDIOTRACK=`cat ${TEMPDIR}/transcode-audio.log | grep -n " "$LANGUAGE" " | \ + head -n 1 | awk '{print (($1-1))}'` + if [ -z $AUDIOTRACK ] ; then + AUDIOTRACK=-1 + fi + fi + + AUDIOTYPE=`cat ${TEMPDIR}/transcode-audio.log | \ + grep " "$LANGUAGE" " | head -n 1 | awk '{print $3}'` + AUDIOTYPELINES=`cat ${TEMPDIR}/transcode-audio.log | \ + grep " "$LANGUAGE" " | head -n 1 | awk '{print $3}' | \ + wc -m | awk '{print $1}'` + AUDIOFORMATLINES=`cat ${TEMPDIR}/transcode-audio2.log | \ + grep "0x55"| head -n 1 | wc -m | awk '{print $1}'` + TRANSCODE_AUDIO=`cat ${TEMPDIR}/transcode-audio.log` + TRANSCODE_AUDIO2=`cat ${TEMPDIR}/transcode-audio2.log` + + if [ -z $AUDIOTYPELINES ] ; then + d2v_mesg "${MESG_30[$LNG]}" + $TRANSCODE_AUDIO >> $LOGFILE + $TRANSCODE_AUDIO2 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + fi + + if [ $AUDIOTYPELINES -eq 0 ] ; then + d2v_mesg "${MESG_05[$LNG]}" + $TRANSCODE_AUDIO >> $LOGFILE + $TRANSCODE_AUDIO2 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + fi + + + [ -z $AUDIOFORMATLINES ] && $AUDIOFORMATLINES="0" + if [ $AUDIOFORMATLINES -eq 0 ] ; then + AUDIOFORMAT="other" + else + AUDIOFORMAT="mp3" + fi + + if [ $DEBUG -gt 1 ] ; then + d2v_log_separator + d2v_log_force "write output from transcode-audio.log" + d2v_log "\$TRANSCODE_AUDIO='$TRANSCODE_AUDIO'" + d2v_log_separator + d2v_log_separator + d2v_log_force "write output from transcode-audio2.log" + d2v_log "\$TRANSCODE_AUDIO2='$TRANSCODE_AUDIO2'" + d2v_log_separator + fi + + d2v_log_force "\$AUDIOTRACK='$AUDIOTRACK'" + d2v_log "\$AUDIOTYPE='$AUDIOTYPE'" + d2v_log "\$AUDIOTYPELINES='$AUDIOTYPELINES'" + d2v_log_force "\$AUDIOFORMAT='$AUDIOFORMAT'" + d2v_log "\$AUDIOFORMATLINES='$AUDIOFORMATLINES'" + + case $AUDIOTYPE in + a??) + TCEXTRACTOPTAUDIO="ac3" + ;; + *pcm|raw) + TCEXTRACTOPTAUDIO="pcm" + if [ ACTION_ENCODE != ${ENCODE_TOOLS[1]} ] ; then + ACTION_ENCODE=${ENCODE_TOOLS[1]} + d2v_log "pcm audio track found - \ + forced the usage of '$ACTION_ENCODE'" + fi + ;; + mpeg?) + TCEXTRACTOPTAUDIO="mp2" + ;; + dts) + TCEXTRACTOPTAUDIO="dts" + ;; + *) + d2v_mesg "${MESG_06[$LNG]}" + cat $TRANSCODE_AUDIO >> $LOGFILE + cat $TRANSCODE_AUDIO2 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + ;; + esac + + d2v_log_force "\$TCEXTRACTOPTAUDIO='$TCEXTRACTOPTAUDIO'" + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + else + d2v_log_force "\$AUDIOTRACK='$AUDIOTRACK'" + d2v_log_force "\$AUDIOFORMAT='$AUDIOFORMAT'" + d2v_log_force "\$TCEXTRACTOPTAUDIO='$TCEXTRACTOPTAUDIO'" + fi +} + + +########################################################################### +# copy the main movie to disk +########################################################################### + +copy () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_COPY' to copy the main movie to disk" + + if [ ! -f ${TEMPDIR}/001.vob -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/001.vob ] && rm -f ${TEMPDIR}/001.vob + + # read main movie off the DVD + d2v_mesg "${MESG_03[$LNG]} TITEL: $TITLE NUM: $TITLENEM AUDIO: $TCEXTRACTOPTAUDIO" + + d2v_log "`echo && echo \$\> $TCCAT_BIN -t dvd -i $DVD_DEVICE \ + -T $TITLENUM,-1 -L 2\> /dev/null \> ${TEMPDIR}/001.vob`" + nice -n ${PRIO} $TCCAT_BIN -t dvd -i $DVD_DEVICE -T $TITLENUM,-1 \ + -L 2> /dev/null > ${TEMPDIR}/001.vob + + local STATUS=$? + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_07[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$TCCAT_BIN ${RED}failed - exiting${NORMAL}" + fi + + # eject DVD + d2v_mesg "${MESG_08[$LNG]}" + $EJECT_BIN $DVD_DEVICE + sleep $SLEEPTIME + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + + if [ $AUDIOFORMAT = "mp3" ] ; then + d2v_log "`echo && echo \$\> mv ${TEMPDIR}/001.vob \ + ${TEMPDIR}/001.mpeg`" && \ + mv ${TEMPDIR}/001.vob ${TEMPDIR}/001.mpeg + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + fi + fi +} + + +########################################################################### +# demultiplex the main movie in mpv and ac3 +########################################################################### + +demux () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_DEMUX' to demultiplex the main movie in mpv and ac3" + + if [ ! -f ${TEMPDIR}/001.vob ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.vob' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.mpv -o ! -f ${TEMPDIR}/001.ac3 -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/001.mpv ] && rm -f ${TEMPDIR}/001.mpv + [ -f ${TEMPDIR}/001.ac3 ] && rm -f ${TEMPDIR}/001.ac3 + rm -f ${TEMPDIR}/video.fifo + rm -f ${TEMPDIR}/audio.fifo + + local STATUS=1 + + if [ "$AUDIOFORMAT" != "mp3" ] ; then + case $ACTION_DEMUX in + ${DEMUX_TOOLS[0]}) + + # demux using fifos and tcextract + d2v_mesg "${MESG_10[$LNG]}" + mkfifo ${TEMPDIR}/video.fifo + mkfifo ${TEMPDIR}/audio.fifo + + d2v_log "`echo && echo \$\> $TCEXTRACT_BIN -i \ + ${TEMPDIR}/video.fifo -t vob -x mpeg2 -a 0xe0 \ + \> ${TEMPDIR}/001.mpv \&`" + + nice -n ${PRIO} $TCEXTRACT_BIN -i ${TEMPDIR}/video.fifo \ + -t vob -x mpeg2 -a 0xe0 \ + > ${TEMPDIR}/001.mpv & + + d2v_log "`echo && echo \$\> $TCEXTRACT_BIN -i \ + ${TEMPDIR}/audio.fifo -t vob -x ${TCEXTRACTOPTAUDIO} \ + -a $AUDIOTRACK \> ${TEMPDIR}/001.ac3 \&`" + nice -n ${PRIO} $TCEXTRACT_BIN -i ${TEMPDIR}/audio.fifo \ + -t vob -x ${TCEXTRACTOPTAUDIO} -a ${AUDIOTRACK} \ + > ${TEMPDIR}/001.ac3 & + + sleep 5 + d2v_log "`echo && echo \$\> cat ${TEMPDIR}/001.vob \| \ + tee ${TEMPDIR}/video.fifo ${TEMPDIR}/audio.fifo \ + \> /dev/null`" + nice -n ${PRIO} cat ${TEMPDIR}/001.vob | \ + tee ${TEMPDIR}/audio.fifo ${TEMPDIR}/video.fifo \ + > /dev/null + + STATUS=$? + ;; + ${DEMUX_TOOLS[1]}) + + if [ $WITHOUT_X -eq 0 ] ; then + # start virtual X server + $XVFB_BIN -once :4 >/dev/null 2>&1 & + export DISPLAY=localhost:4 + fi + + export LANG=de_DE@euro + + # demux using projectX + d2v_log "`echo && echo \$\> $JAVA_BIN -jar $PROJECTX_JAR \ + -c $PROJECTX_INI -o ${TEMPDIR} \ + ${TEMPDIR}/001.vob 2\>\&1 \>\> $LOGFILE`" + nice -n ${PRIO} $JAVA_BIN -jar $PROJECTX_JAR \ + -c $PROJECTX_INI -o ${TEMPDIR} \ + ${TEMPDIR}/001.vob 2>&1 >> $LOGFILE + + STATUS=$? + + if [ $WITHOUT_X -eq 0 ] ; then + # stop Virtual X server + /usr/bin/killall Xvfb + fi + ;; + esac + + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$ACTION_DEMUX ${RED}failed - exiting${NORMAL}" + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + else + d2v_log "demultiplexing not required - \ + main movie contains mp2 audio track" + fi + + fi + + [ $REMOVE -eq 1 ] && rm -f ${TEMPDIR}/001.vob + +} + + +########################################################################### +# encode ac3 to mp2 +########################################################################### + +encode () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_ENCODE' to encode ac3 to mp2" + + if [ ! -f ${TEMPDIR}/001.ac3 ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.ac3' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.mp2 -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/001.mp2 ] && rm -f ${TEMPDIR}/001.mp2 + + local STATUS=1 + + if [ "$AUDIOFORMAT" != "mp3" ] ; then + + if [ "$TCEXTRACTOPTAUDIO" = "pcm" ] ; then + d2v_log "pcm or raw audio track move to wav audio track" + mv ${TEMPDIR}/001.ac3 ${TEMPDIR}/001.wav + fi + + if [ "$TCEXTRACTOPTAUDIO" != "pcm" ] ; then + + # encode with a52dec ... + d2v_log "`echo && echo \$\> $A52DEC_BIN -o wavdolby \ + -g "$A52DEC_GAIN" ${TEMPDIR}/001.ac3 \ + 2\>\&1 \> ${TEMPDIR}/001.wav \| grep -v \'last\' \ + \>\> $LOGFILE`" + nice -n ${PRIO} $A52DEC_BIN -o wavdolby \ + -g "$A52DEC_GAIN" ${TEMPDIR}/001.ac3 \ + 2>&1 > ${TEMPDIR}/001.wav | grep -v 'last' \ + >> $LOGFILE + + STATUS=$? + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$A52DEC_BIN ${RED}failed - exiting${NORMAL}" + fi + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + + case $ACTION_ENCODE in + ${ENCODE_TOOLS[0]}) + + # ... and mp2enc + d2v_log "`echo && echo \$\> cat ${TEMPDIR}/001.wav \| \ + $MP2ENC_BIN -r 48000 -o ${TEMPDIR}/001.mp2 \ + \> /dev/null 2\>\> $LOGFILE`" + nice -n ${PRIO} cat ${TEMPDIR}/001.wav | \ + $MP2ENC_BIN -r 48000 -o ${TEMPDIR}/001.mp2 \ + > /dev/null 2>> $LOGFILE + STATUS=$? + ;; + ${ENCODE_TOOLS[1]}) + + # ... and toolame + d2v_log "`echo && echo \$\> cat ${TEMPDIR}/001.wav \| \ + $TOOLAME_BIN -s 48 /dev/stdin ${TEMPDIR}/001.mp2 \ + \> /dev/null 2\>\> $LOGFILE`" + nice -n ${PRIO} cat ${TEMPDIR}/001.wav | \ + $TOOLAME_BIN -s 48 /dev/stdin ${TEMPDIR}/001.mp2 \ + > /dev/null 2>> $LOGFILE + STATUS=$? + ;; + esac + + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$ACTION_ENCODE ${RED}failed - exiting${NORMAL}" + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + else + d2v_log "encoding not required - \ + main movie contains mp2 audio track" + fi + fi + [ $REMOVE -eq 1 ] && rm -f ${TEMPDIR}/001.wav + +} + + +########################################################################### +# requant +########################################################################### + +requant () { + d2v_log_separator + d2v_log_force \ + "using '$REQUANT_BIN' to multiplex the part to a VDR recording" + + if [ ! -f ${TEMPDIR}/001.mpv ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.mpv' ${RED}not found${NORMAL}" + fi + + MPVBIG=`ls -l ${TEMPDIR}/001.mpv | awk '{print $5}'` + AC3BIG=`ls -l ${TEMPDIR}/001.ac3 | awk '{print $5}'` + MP2BIG=`ls -l ${TEMPDIR}/001.mp2 | awk '{print $5}'` + + [ -z $AC3BIG ] && AC3BIG=0 + [ -z $MP2BIG ] && MP2BIG=0 + + BIG=$(( $MPVBIG + $AC3BIG + $MP2BIG )) + + d2v_log_force "Dateiinfos \$MPVBIG='$MPVBIG' \$AC3BIG='$AC3BIG' \ + \$MP2BIG='$MP2BIG' \$BIG='$BIG'" + + if [ $MP2BIG -eq 0 ] ; then + FACTOR=`echo $MPVBIG $DVD_SIZE $AC3BIG|awk '{printf "%f\n",0.05+($1/($2-$3))}'| sed s/,/./g` + else + FACTOR=`echo $MPVBIG $DVD_SIZE $MP2BIG|awk '{printf "%f\n",0.05+($1/($2-$3))}' | sed s/,/./g` + fi + + d2v_log_force "Faktor zum verkleinern \$FACTOR='$FACTOR'" + + if [ $BIG -gt $DVD_SIZE ] ; then + + d2v_mesg "${MESG_12[$LNG]}" + + # requant + d2v_log "`echo && echo \$\> $REQUANT_BIN -f $FACTOR -i ${TEMPDIR}/001.mpv\ + -o ${TEMPDIR}/001.req 2\>\&1 \| grep -v \'%\' - \>\> $LOGFILE`" + + nice -n ${PRIO} $REQUANT_BIN -f $FACTOR -i ${TEMPDIR}/001.mpv \ + -o ${TEMPDIR}/001.req 2>&1 | grep -v '%' - >> $LOGFILE + + #local STATUS=$? + #if [ $STATUS -eq 1 ] ; then + # d2v_mesg "${MESG_09[$LNG]}" + # cp $LOGFILE ${TEMPDIR}/$TITLE.log + # d2v_error "${MAGENTA}$REQUANT_BIN ${RED}failed - exiting${NORMAL}" + #fi + + mv ${TEMPDIR}/001.mpv ${TEMPDIR}/001.mpv.org + mv ${TEMPDIR}/001.req ${TEMPDIR}/001.mpv + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + else + d2v_log "requant not required " + fi + [ $REMOVE -eq 1 ] && rm -f ${TEMPDIR}/001.mpv.org +} + +########################################################################### +# multiplex the parts to a VDR recording +########################################################################### + +mplex () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_MPLEX' to multiplex the part to a VDR recording" + + if [ ! -f ${TEMPDIR}/001.mpv ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.mpv' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.ac3 ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.ac3' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.mp2 ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.mp2' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.mpeg -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/001.mpeg ] && rm -f ${TEMPDIR}/001.mpeg + + if [ "$AUDIOFORMAT" != "mp3" ] ; then + + local STATUS=1 + + d2v_mesg "${MESG_11[$LNG]}" + + case $ACTION_MPLEX in + ${MPLEX_TOOLS[0]}) + [ $AC3_TRACK = 1 ] && \ + INC_AC3_TRACK="-s ${TEMPDIR}/001.ac3" + + # tcmplex a MPEG file + d2v_log "`echo && echo \$\> $TCMPLEX_BIN -m d \ + -i ${TEMPDIR}/001.mpv -p ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2\>\&1 \| grep -v \'%\' - \>\> $LOGFILE`" + nice -n ${PRIO} $TCMPLEX_BIN -m d \ + -i ${TEMPDIR}/001.mpv -p ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2>&1 | grep -v '%' - >> $LOGFILE + STATUS=$? + ;; + ${MPLEX_TOOLS[1]}) + [ $AC3_TRACK = 1 ] && \ + INC_AC3_TRACK="-1 ${TEMPDIR}/001.ac3" + + # tcmplex-panteltje a MPEG file + d2v_log "`echo && echo \$\> $TCMPLEX_PANTELTJE_BIN -m d \ + -i ${TEMPDIR}/001.mpv -0 ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2\>\&1 \| grep -v \'%\' - \>\> $LOGFILE`" + nice -n ${PRIO} $TCMPLEX_PANTELTJE_BIN -m d \ + -i ${TEMPDIR}/001.mpv -0 ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2>&1 | grep -v '%' - >> $LOGFILE + STATUS=$? + ;; + ${MPLEX_TOOLS[2]}) + [ $AC3_TRACK = 1 ] && \ + INC_AC3_TRACK="${TEMPDIR}/001.ac3" + + # mplex a MPEG file + d2v_log "`echo && echo \$\> $MPLEX_BIN -f 9 \ + -o ${TEMPDIR}/001.mpeg ${TEMPDIR}/001.mpv \ + ${TEMPDIR}/001.mp2 $INC_AC3_TRACK \ + 2\>\&1 \| grep -v \'%\' - \>\> $LOGFILE`" + nice -n ${PRIO} $MPLEX_BIN -f 9 \ + -o ${TEMPDIR}/001.mpeg ${TEMPDIR}/001.mpv \ + ${TEMPDIR}/001.mp2 $INC_AC3_TRACK \ + 2>&1 | grep -v '%' - >> $LOGFILE + STATUS=$? + ;; + esac + + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$ACTION_MPLEX ${RED}failed - exiting${NORMAL}" + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + else + d2v_log "multiplexing not required - \ + main movie contains mp2 audio track" + fi + fi + [ $REMOVE -eq 1 ] && rm -f ${TEMPDIR}/001.mpv ${TEMPDIR}/001.mp2 ${TEMPDIR}/001.ac3 + +} + + +########################################################################### +# dvdauthor create a dvd structur +########################################################################### + +dvdauthor () { + d2v_log_separator + d2v_log_force "using '$DVDAUTHOR_BIN' dvdauthor create a dvd structur" + + d2v_mesg "${MESG_17[$LNG]}" + + if [ ! -f ${TEMPDIR}/001.mpeg ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.mpeg' ${RED}not found${NORMAL}" + fi + +if [ ! -d ${TEMPDIR_ISO}/VIDEO_TS -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR_ISO}/VIDEO_TS ] && rm -rf ${TEMPDIR_ISO}/VIDEO_TS + [ -f ${TEMPDIR_ISO}/AUDIO_TS ] && rm -rf ${TEMPDIR_ISO}/AUDIO_TS + +cat << XMLEOF > ${TEMPDIR}/001.xml +<dvdauthor> + <vmgm /> + <titleset> + <titles> + <pgc> + <vob file="${TEMPDIR}/001.mpeg" /> + </pgc> + </titles> + </titleset> +</dvdauthor> +XMLEOF + + d2v_log "`echo && echo \$\> $DVDAUTHOR_BIN -o ${TEMPDIR_ISO} -x ${TEMPDIR}/001.xml`" + nice -n ${PRIO} $DVDAUTHOR_BIN -o ${TEMPDIR_ISO} -x ${TEMPDIR}/001.xml + + local STATUS=$? + if [ $STATUS -ne 0 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$DVDAUTHORT_BIN ${RED}failed - exiting${NORMAL}" + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} ${TEMPDIR_ISO} \ + && ls -l ${TEMPDIR} ${TEMPDIR_ISO}`" + +fi + [ $REMOVE -eq 1 ] && rm -f ${TEMPDIR}/001.mpeg +} + +########################################################################### +# create an iso file +########################################################################### + +iso () { + +d2v_log_separator +d2v_log_force "using '$MKISOFS_BIN' to create a iso file" +d2v_mesg "${MESG_18[$LNG]}" + +if [ ! -d ${TEMPDIR_ISO}/VIDEO_TS ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} ${TEMPDIR_ISO} && ls -l ${TEMPDIR} ${TEMPDIR_ISO}`" + d2v_error "${MAGENTA} '${TEMPDIR_ISO}/VIDEO_TS' ${RED}not found${NORMAL}" +fi + +if [ ! -f ${TEMPDIR}/001.iso -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/001.iso ] && rm -f ${TEMPDIR}/001.iso + + d2v_log "`echo && echo \$\> $MKISOFS_BIN -dvd-video -o ${TEMPDIR}/001.iso ${TEMPDIR_ISO} \2\>\&1 \ + \>\> $LOGFILE`" + nice -n ${PRIO} $MKISOFS_BIN -dvd-video -o ${TEMPDIR}/001.iso ${TEMPDIR_ISO} 2>&1 >> $LOGFILE + + local STATUS=$? + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$MKISOFS_BIN ${RED}failed - exiting${NORMAL}" + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} ${TEMPDIR_ISO} && ls -l ${TEMPDIR} ${TEMPDIR_ISO}`" +fi + [ $REMOVE -eq 1 ] && rm -rf ${TEMPDIR_ISO} +} + +########################################################################### +# burn recording +########################################################################### + +burn () { + +if [ "$BURN" -eq 1 ] ; then + + d2v_log_separator + d2v_log_force "using burn the DVD with '$GROWISOFS_BIN'" + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + + # insert DVD and do some checks + + local DVDCHECK="0" + while [ "$DVDCHECK" -eq 0 ] ; do + #sleep $SLEEPTIME + d2v_mesg "${MESG_19[$LNG]}" + $EJECT_BIN $DVD_DEVICE + sleep $SLEEPTIME + $TCPROBE_BIN -i $DVD_DEVICE > /dev/null + $DVDSTATUS_BIN $DVD_DEVICE > ${TEMPDIR}/dvdstatus.log + DVDTYPE=`cat ${TEMPDIR}/dvdstatus.log |grep 'Mounted Media' | awk '{print $4}'` + DVDSTATUS=`cat ${TEMPDIR}/dvdstatus.log | grep 'Disc status' | awk '{print $3}'` + if [ $DVDTYPE = "DVD-RW" ] ; then + DVDTYPE="DVD+RW" + fi + if [ $DVDTYPE = "DVD-R" ] ; then + DVDTYPE="DVD+R" + fi + if [ $DVDTYPE = "DVD+R" -o $DVDTYPE = "DVD+RW" ] ; then + DVDCHECK="1" + else + d2v_mesg "${MESG_02[$LNG]}" + DVDCHECK="0" + fi + if [ $DVDSTATUS = "blank" ] ; then + DVDCHECK="1" + else + d2v_mesg "${MESG_02[$LNG]}" + DVDCHECK="0" + fi + done + + if [ "$RW_FORMAT" -eq 1 ] ; then + if [ "$DVDTYPE" = "DVD+RW" ] ; then + if [ "$DVDSTATUS" != "blank" ]; then + d2v_mesg "${MESG_20[$LNG]}" + sleep $SLEEPTIME + $DVDFORMAT_BIN $DVD_DEVICE + fi + fi + fi + + d2v_mesg "${MESG_21[$LNG]}" + + nice -n ${PRIO} $GROWISOFS_BIN $DVDFORMAT_OPT $DVD_DEVICE=${TEMPDIR}/001.iso + + local STATUS=$? + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_23[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$GROWISOFS_BIN ${RED}failed - exiting${NORMAL}" + fi + + d2v_mesg "${MESG_22[$LNG]}" + + $EJECT_BIN $DVD_DEVICE + + sleep $SLEEPTIME + +fi + +} + +########################################################################### +# move recording to video directory +########################################################################### + +move () { + if [ "$BURN" == "0" -o "$REMOVE_ISO" == "1" ] ; then + d2v_log_separator + d2v_log_force "using 'mv' to move recording to iso directory" + + mkdir -p ${ISODIR} >> $LOGFILE || d2v_error "${RED}failed to create {MAGENTA}'${ISODIR}'${NORMAL}" + d2v_log "'${ISODIR}' created" + + mv ${TEMPDIR}/001.iso ${ISODIR}/${TITLE}.iso + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} ${ISODIR} && ls -l ${TEMPDIR} ${ISODIR}`" + fi + +} + + +########################################################################### +# do all the bits +########################################################################### + +readvars + +if [ $ACTION = "all" ] ; then + gettitle + test + copy + demux + encode + requant + mplex + dvdauthor + iso + burn + move +elif [ $ACTION = "copy" ] ; then + gettitle + test + eval $ACTION +fi + +writevars + + +########################################################################### +# yeeha, we did it +########################################################################### + +[ $ACTION = "all" -o $CLEAN = 1 ] && rm -rf $TEMPDIR && d2v_log "\$TEMPDIR '$TEMPDIR' deleted" + +rm -f $LOCKFILE + +d2v_log_separator +d2v_log_force END +d2v_log_separator diff --git a/plugins/dvdconvert/dvdconvert/dvd2vdr.sh b/plugins/dvdconvert/dvdconvert/dvd2vdr.sh new file mode 100755 index 0000000..ea08790 --- /dev/null +++ b/plugins/dvdconvert/dvdconvert/dvd2vdr.sh @@ -0,0 +1,1386 @@ +#! /bin/bash + +############################################################################ +# Copyright (C) 2006 by Ronny Frankowski (lini@lausitz.net) # +# & AngieSoft (vdr@angiesoft.de) # +# & Matthias Appel (private_tweety@gmx.net) # +# # +# This program is free software; you can redistribute it and#or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program; if not, write to the # +# Free Software Foundation, Inc., # +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # +############################################################################ + + +########################################################################### +# define some variables +########################################################################### + +VERSION="1.0.1-xvdr" + +[ -r /etc/default/vdr ] && . /etc/default/vdr +[ -d "$VIDEODIR" ] || exit +[ -d "$VDRVARDIR" ] || exit +[ -d "$VDRBINDIR" ] || exit +[ -n "$DVDBURNER" ] || exit + +VIDEODIR="$VIDEODIR" # video directory of vdr +WORKDIR="$VDRVARDIR/dvdconvert/dvd2vdr" # working directory of dvd2vdr +DVD_DEVICE="$DVDBURNER" # dvd device + +LANGUAGE="de" # select preferred language + # "de", "en" + +RECORDING_LIFETIME=99 # lifetime from 00 to 99 +RECORDING_MAX_SIZE=2000000000 # max size (byte) for a single + # *.vdr file +RECORDING_MAX_CHUNKS=255 # max chunks for spliting + +#TITLE_MIN_LENGTH=60 # mimimun length in sec for + # a title on a DVD to be + # considered for conversion + +PRIO=19 # priority from 1 to 19 +SLEEPTIME=10 # wait for user action +VERBOSE=1 # be verbose - 0: off, 1: on +DEBUG=2 # debug info - 0: off, 1-3: level +FORCE=0 # force exec - 0: off, 1: on (erzwingen) +CLEAN=1 # clean dirs - 0: off, 1: on (abschliesendes loeschen) +REMOVE=1 # remove tmp file - 0: off, 1: on (temp. loeschen im Betrieb) + +OSDINFO=1 # svdrpsend - 0: off, 1: on + +A52DEC_GAIN="+5.0" # add gain in decibels +CREATE_MARKS=0 # create a marks.vdr for vdr - 0: off, 1: on + + +########################################################################### +# define required tools +########################################################################### + +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:~/bin + +SVDRPSEND_PL="$VDRBINDIR/svdrpsend.pl" + +VOBCOPY_BIN=vobcopy +EJECT_BIN=eject +TCPROBE_BIN=tcprobe +TCCAT_BIN=tccat +TCEXTRACT_BIN=tcextract +TCDEMUX_BIN=tcdemux + +A52DEC_BIN=a52dec +TOOLAME_BIN=toolame +MP2ENC_BIN=mp2enc + +JAVA_BIN=java +PROJECTX_JAR=$PROJECTX_HOME/ProjectX.jar +[ ! -f "$PROJECTX_JAR" ] && PROJECTX_JAR=/usr/bin/ProjectX/ProjectX.jar +PROJECTX_INI=$PROJECTX_HOME/ProjectX.ini +[ ! -f "$PROJECTX_INI" ] && PROJECTX_JAR=/usr/bin/ProjectX/ProjectX.ini +XVFB_BIN=Xvfb + +TCMPLEX_BIN=tcmplex +TCMPLEX_PANTELTJE_BIN=tcmplex-panteltje +MPLEX_BIN=mplex + +SPLIT_BIN=split + +GENINDEX_BIN=genindex +GENINDEX_MJPEGFIX_BIN=genindex-mjpegfix + +LOGDIR="$VDRVARDIR/dvdconvert/log" +LOGFILE=$LOGDIR/dvd2vdr.log +LOCKFILE=$LOGDIR/dvd2vdr.LOCK + + +########################################################################### +# print usage information +########################################################################### + +usage() { +test -n "$1" && echo "${RED} Error: $1${NORMAL}" && echo +echo " DVD2VDR Version ${MAGENTA}$VERSION${NORMAL}" +echo +echo " ${CYAN}Usage: ${GREEN}$0${NORMAL}" +echo " ${CYAN} or: ${GREEN}$0${NORMAL} <action> [options]" +echo +echo " DVD2VDR is intended to convert the main movie of a DVD into" +echo " a VDR recoring. If required the main movie will be demuxed" +echo " transcoded and remuxed again." +echo +echo " ${CYAN}Actions:${NORMAL}" +echo +echo "${GREEN} all${NORMAL}" +echo " Do all steps of the following" +echo "${GREEN} copy${NORMAL}" +echo " Copy the main movie to disk" +echo "${GREEN} demux${NORMAL}" +echo " Demultiplex the main movie in mpv and ac3" +echo "${GREEN} encode${NORMAL}" +echo " Encode ac3 to mp2" +echo "${GREEN} mplex${NORMAL}" +echo " Multiplex the parts to a VDR recording" +echo "${GREEN} split${NORMAL}" +echo " Split the VDR recording into chunks" +echo "${GREEN} genindex${NORMAL}" +echo " Create an index.vdr" +echo "${GREEN} move${NORMAL}" +echo " Move recording to video directory" +echo +echo " ${CYAN}Options:${NORMAL}" +echo +echo "${GREEN} -i | --device ${MAGENTA}<device>${NORMAL}" +echo " Read DVD structure from this device" +echo "${GREEN} -o ${MAGENTA}<dirname>${NORMAL}" +echo " Write output into this video directory" +echo "${GREEN} -w <dirname>${NORMAL}" +echo " Use working directory as base for temp directory" +echo "${GREEN} -t ${MAGENTA}<dirname>${NORMAL}" +echo " Use temp directory for temporary files" +echo "${GREEN} --preferred-language ${MAGENTA}<language>${NORMAL}" +echo " Choose preferred language for messages" +echo " and the main movie (default is \"de\")" +echo "${GREEN} --no-osd-info${NORMAL}" +echo " Don't send messages to the OSD of VDR" +echo "${GREEN} --set-title ${MAGENTA}<string>${NORMAL}" +echo " Set title of main movie to <string>" +echo "${GREEN} --read-title-num ${MAGENTA}<number>${NORMAL}" +echo " Read specific title set (1-99)" +echo "${GREEN} --use-tcextract${NORMAL}" +echo " Demux the main movie with tcextract (default)" +echo "${GREEN} --use-projectX${NORMAL}" +echo " Demux the main movie with projectX." +echo " Ensure to have a X server running" +echo "${GREEN} --projectX-ini ${MAGENTA}<filename>${NORMAL}" +echo " Use this X.ini for projectX" +echo "${GREEN} --use-Xvfb | --without-X${NORMAL}" +echo " Start a virtual X Server with Xvfb" +echo "${GREEN} --add-gain ${MAGENTA}<string>${NORMAL}" +echo " Add gain to mp2 audio (-96.0 to +96.0)" +echo "${GREEN} --use-mp2enc${NORMAL}" +echo " Encode the audio track with mp2enc" +echo "${GREEN} --use-toolame${NORMAL}" +echo " Encode the audio track with toolame (default)" +echo "${GREEN} --use-mp3gain${NORMAL}" +echo " Normalize ac3 (time consuming)" +echo "${GREEN} --use-tcmplex${NORMAL}" +echo " Remux with tcmplex (default)" +echo "${GREEN} --use-tcmplex-panteltje${NORMAL}" +echo " Remux with tcmplex-panteltje" +echo "${GREEN} --use-mplex${NORMAL}" +echo " Remux with mplex" +echo "${GREEN} --use-genindex${NORMAL}" +echo " Create index.vdr with genindex (default)" +echo "${GREEN} --use-genindex-mjpegfix${NORMAL}" +echo " Create index.vdr with genindex-mjpegfix" +echo "${GREEN} --force${NORMAL}" +echo " Force execution of <action>" +echo "${GREEN} --verbose${NORMAL}" +echo " Turns verbosity on" +echo "${GREEN} -V | --version${NORMAL}" +echo " Print version information and exit" +echo "${GREEN} --all-versions${NORMAL}" +echo " Print version information of most used tools" +echo "${GREEN} -h | -? | --help${NORMAL}" +echo " Print this usage information" +exit 1 +} + +########################################################################### +# set color parameters +########################################################################### + +# ANSI COLORS +CRE=" +[K" +NORMAL="[0;39m" +# RED: Failure or error message +RED="[1;31m" +# GREEN: Success message +GREEN="[1;32m" +# YELLOW: Descriptions +YELLOW="[1;33m" +# BLUE: System messages +BLUE="[1;34m" +# MAGENTA: Found devices or drivers (pink) +MAGENTA="[1;35m" +# CYAN: Questions (hellblau) +CYAN="[1;36m" +# BOLD WHITE: Hint +WHITE="[1;37m" + +########################################################################### +# check for given parameters +########################################################################### + +case $DEBUG in + 1) ;; + 2) set -x ;; + 3) set -xv ;; + *) LOGFILE=/dev/null ;; +esac + +ACTION="all" +OPTIONS=$@ +TEMPDIR="" +LANGUAGES=("de" "en") +TITLE="" +TITLENUM="AUTO" # AUTO = vobcopy-test; MAX = max. Frames; 1,2,3... DVD-Title +RECORDING="" +AUDIOTRACK=-1 +AUDIOFORMAT="" +TCEXTRACTOPTAUDIO="" +WITHOUT_X=1 +AC3_TRACK=1 + +GETTITLE_TOOLS=("user-input" "vobcopy") +COPY_TOOLS=("tccat") +DEMUX_TOOLS=("tcextract" "projectX") +ENCODE_TOOLS=("mp2enc" "toolame") +MPLEX_TOOLS=("tcmplex" "tcmplex-panteltje" "mplex") +SPLIT_TOOLS=("split") +GENINDEX_TOOLS=("genindex" "genindex-mjpegfix") + +ACTION_GETTITLE=${GETTITLE_TOOLS[1]} +ACTION_COPY=${COPY_TOOLS[0]} +ACTION_DEMUX=${DEMUX_TOOLS[0]} +ACTION_ENCODE=${ENCODE_TOOLS[0]} +ACTION_MPLEX=${MPLEX_TOOLS[1]} +ACTION_SPLIT=${SPLIT_TOOLS[0]} +ACTION_GENINDEX=${GENINDEX_TOOLS[0]} + +while [ $# -gt 0 ]; do + case $1 in + all|gettitle|copy|demux|encode|mplex|split|genindex|move) + ACTION="$1" + ;; + -i|--device) + [ -b "$2" ] || usage "${RED}unknown device ${MAGENTA}'$2'${NORMAL}" + DVD_DEVICE="$2" + shift + ;; + -o) + [ -d "$2" ] || usage "${RED}missing directory ${MAGENTA}'$2'${NORMAL}" + VIDEODIR="$2" + shift + ;; + -w) + [ -d "$2" ] || usage "${RED}missing directory ${MAGENTA}'$2'${NORMAL}" + WORKDIR="$2" + shift + ;; + -t) + [ -d "$2" ] || usage "${RED}missing directory ${MAGENTA}'$2'${NORMAL}" + TEMPDIR=`echo $2 | sed "s/\/$//"` + shift + ;; + --preferred-language) + [ $2 = "" ] || usage "${RED}missing language${NORMAL}" + LANGUAGE=$2 + shift + ;; + --no-osd-info) + OSDINFO=0 + ;; + --set-title) + TITLE=`echo $2 | sed "s/[^a-zA-Z0-9???????/:.#'&_-]/_/g"` + ACTION_GETTITLE=${GETTITLE_TOOLS[0]} + shift + ;; + --read-title-num) +# [ $2 -ge 1 -a $2 -le 99 ] || usage "${RED}invalid title number ${MAGENTA}'$2'${NORMAL}" + TITLENUM=$2 + shift + ;; + --use-tcextract) + ACTION_DEMUX=${DEMUX_TOOLS[0]} + ;; + --use-projectX) + ACTION_DEMUX=${DEMUX_TOOLS[1]} + ;; + --projectX-ini) + [ -e "$2" ] || usage "${RED}missing file ${MAGENTA}'$2'${NORMAL}" + PROJECTX_INI="$2" + shift + ;; + --use-Xvfb|--without-X) + WITHOUT_X=0 + ;; + --add-gain) + [ `echo $2 | \\ + grep -c "[+-][[:digit:]]\{1,2\}\.[[:digit:]]"` -eq 1 ] || \ + usage "${RED}invalid gain ${MAGENTA}'$2'${NORMAL}" + A52DEC_GAIN="$2" + shift + ;; + --use-mp2enc) + ACTION_ENCODE=${ENCODE_TOOLS[0]} + ;; + --use-toolame) + ACTION_ENCODE=${ENCODE_TOOLS[1]} + ;; + --use-tcmplex) + ACTION_MPLEX=${MPLEX_TOOLS[0]} + ;; + --use-tcmplex-panteltje) + ACTION_MPLEX=${MPLEX_TOOLS[1]} + ;; + --use-mplex) + ACTION_MPLEX=${MPLEX_TOOLS[2]} + ;; + --use-genindex) + ACTION_GENINDEX=${GENINDEX_TOOLS[0]} + ;; + --use-genindex-mjpegfix) + ACTION_GENINDEX=${GENINDEX_TOOLS[1]} + ;; + --force) + FORCE=1 + ;; + --clean) + CLEAN=1 + ;; + --verbose) + VERBOSE=1 + ;; + -V|--version) + echo "${GREEN}$0 ${MAGENTA}Version $VERSION${NORMAL}" + exit 1 + ;; + --all-versions) + echo "${GREEN}$0 ${MAGENTA}Version $VERSION${NORMAL}" + echo + $VOBCOPY_BIN --version + $TCPROBE_BIN -v + $TCCAT_BIN -v + $TCEXTRACT_BIN -v + $TCDEMUX_BIN -v + echo + $A52DEC_BIN - 2>&1|grep a52dec + $TOOLAME_BIN --version 2>&1|grep version + echo + $JAVA_BIN -version + echo + $MPLEX_BIN -? 2>&1|grep version + $TCMPLEX_BIN -v + $TCMPLEX_PANTELTJE_BIN -v + echo + $GENINDEX_BIN 2>&1|grep genindex + exit 1 + ;; + -h|-?|--help) + usage + ;; + *) + usage "${RED}unknown option ${MAGENTA}'$1'${NORMAL}" ;; + esac + shift +done + +[ -f "$DVD2VDR_CONF" ] && . "$DVD2VDR_CONF" + + +########################################################################### +# translation tables for user messages +########################################################################### + +LNG=0 +for i in 0 1 ; do + [ $LANGUAGE = ${LANGUAGES[$i]} ] && LNG=$i +done + +MESG_01=( \ +"Bitte die zu wandelne DVD einlegen" \ +"please insert DVD" \ +) + +MESG_02=( \ +"Keine DVD im Laufwerk erkannt" \ +"DVD not found" \ +) + +MESG_03=( \ +"Kopiere DVD auf Disk" \ +"Copy DVD to disk" \ +) + +MESG_04=( \ +"Videospur nicht gefunden - Abbruch" \ +"main movie not found - exiting" \ +) + +MESG_05=( \ +"Tonspur '$LANGUAGE' nicht gefunden - Abbruch" \ +"Audio track '$LANGUAGE' not found - exiting" \ +) + +MESG_06=( \ +"Kein unterstuetztes Audioformat auf der DVD gefunden - Abbruch" \ +"no supported audio format found - exiting" \ +) + +MESG_07=( \ +"Kopieren der DVD gescheitert - Abbruch" \ +"copying of main movie failed - exiting" \ +) + +MESG_08=( \ +"DVD auslesen beendet, bitte DVD entnehmen" \ +"main movie successfully read, please remove DVD" \ +) + +MESG_09=( \ +"Fehler bei der Umwandlung der DVD-Daten - Abbruch" \ +"failed to transcode the main movie - exiting" \ +) + +MESG_10=( \ +"DVD Daten werden mit '$ACTION_DEMUX' bearbeitet" \ +"" \ +) + +MESG_11=( \ +"DVD Daten werden mit '$ACTION_MPLEX' bearbeitet" \ +"" \ +) + +MESG_12=( \ +"DVD Daten werden gesplittet" \ +"" \ +) + +MESG_13=( \ +"DVD Daten werden mit '$ACTION_GENINDEX' bearbeitet" \ +"" \ +) + +MESG_14=( \ +"Alle temp. Daten geloescht" \ +"" \ +) + +MESG_15=( \ +"Daten befinden sich in ${VIDEODIR}" \ +"" \ +) + +MESG_16=( \ +"!!! GRATULATION , FERTIG !!!" \ +"" \ +) + +MESG_30=( \ +"textutils Fehler, update dein coreutils" \ +"error textutils, upgrade your coreutils" \ +) + +########################################################################### +# prepare to run +########################################################################### + +d2v_error () { + echo "${RED}ERROR: ${MAGENTA}$1${NORMAL}" + $EJECT_BIN $DVD_DEVICE + exit 255 +} + + +d2v_log () { + [ $VERBOSE -eq 1 -o "$2" = "force" ] && echo "`date +"%T"`: $1" + echo "`date +"%T"`: $1" >> $LOGFILE +} + + +d2v_log_separator () { + d2v_log "---------------------------------------------------------------" +} + + +d2v_log_force () { + d2v_log "$1" force +} + + +d2v_mesg () { + if [ $OSDINFO -eq 1 ] ; then + d2v_log "$SVDRPSEND_PL MESG $1" + $SVDRPSEND_PL MESG "$1" >> $LOGFILE + fi +} + + +if [ -e $LOCKFILE ] ; then + if [ $FORCE -eq 1 ] ; then + rm -f $LOCKFILE + else + PIDID=`cat $LOCKFILE` + RUNCHECK=`ps $PIDID | grep 'dvd2' | wc -l` + if [ $RUNCHECK -eq 0 ]; then + rm -f $LOCKFILE + d2v_log "dvd2vdr is not active, remove lockfile done" + else + d2v_error "$0 is already running" + fi + fi +fi + +echo "$0 $OPTIONS" > $LOGFILE || d2v_error "${RED}Cannot create \$LOGFILE ${MAGENTA}'$LOGFILE'${NORMAL}" +echo $$ > $LOCKFILE || d2v_error "${RED}Cannot create \$LOCKFILE ${MAGENTA}'$LOCKFILE'${NORMAL}" + +d2v_log_separator +d2v_log_force START + +[ -d $VIDEODIR ] || d2v_error "${RED}\$VIDEODIR ${MAGENTA}'$VIDEODIR' ${RED}not found${NORMAL}" + VIDEODIR=`echo $VIDEODIR | sed "s/\/$//"` +[ -d $WORKDIR ] || d2v_error "${RED}\$WORKDIR ${MAGENTA}'$WORKDIR' ${RED}not found${NORMAL}" + WORKDIR=`echo $WORKDIR | sed "s/\/$//"` +[ -b $DVD_DEVICE ] || d2v_error "${RED}\$DVD_DEVICE ${MAGENTA}'$DVD_DEVICE' ${RED}not found${NORMAL}" + +[ $PRIO -ge 1 -a $PRIO -le 19 ] || \ + d2v_error "${RED}\$PRIO ${MAGENTA}$PRIO ${RED}out of range${NORMAL}" +[ $VERBOSE -ge 0 -a $VERBOSE -le 1 ] || \ + d2v_error "${RED}\$VERBOSE ${MAGENTA}$VERBOSE ${RED}out of range${NORMAL}" + +########################################################################### +# check the temp directory +########################################################################### + +d2v_log_separator +d2v_log_force "checking the temp directory" + +if [ $ACTION = "all" -a -z "$TEMPDIR" ] ; then + TEMPDIR=`mktemp -dp ${WORKDIR}` + d2v_log "\$TEMPDIR='$TEMPDIR' created" +elif [ $ACTION != "all" -a -z "$TEMPDIR" ] ; then + HELP="`echo && echo \$\> ls -d1 ${WORKDIR} && \ + ls -d1 ${WORKDIR}/tmp.* 2> /dev/null`" + [ `ls -d1 ${WORKDIR}/tmp.* 2> /dev/null | wc -l` -ne 1 ] && \ + d2v_error "${RED}no unique temp directory found $HELP${NORMAL}" + TEMPDIR=`ls -d1 ${WORKDIR}/tmp.* | head -n 1` + d2v_log "\$TEMPDIR='$TEMPDIR' used" +else + d2v_log "\$TEMPDIR='$TEMPDIR' used" +fi + + + +########################################################################### +# read and write global variables to disk +########################################################################### + +VARIABLES="TITLE RECORDING TITLENUM AUDIOTRACK AUDIOFORMAT TCEXTRACTOPTAUDIO" + +readvars () { + local FILE=${TEMPDIR}/variables.info + + if [ -f $FILE ] ; then + d2v_log_separator + d2v_log_force "reading file '$FILE'" + + for i in $VARIABLES ; do + if [ "$i" != "TITLE" -o "$TITLE" = "" ] ; then + eval $i=\"`grep "^$i=" $FILE | awk -F = '{print $2}'`\" + eval d2v_log \"\\\$$i=\'$`echo $i`\'\" + fi + done + fi +} + +writevars () { + local FILE=${TEMPDIR}/variables.info + + if [ "$TITLE" != "" -a "$RECORDING" != "" ] ; then + d2v_log_separator + d2v_log_force "writing file '$FILE'" + + echo "LASTRUN=`date +"%Y-%m-%d %T"`" > $FILE || \ + d2v_error "${RED}Cannot create file ${MAGENTA}'$FILE'${NORMAL}" + + for i in $VARIABLES ; do + eval echo "$i=$`echo $i`" >> $FILE + done + fi +} + + +########################################################################### +# gettitle of the main movie +########################################################################### + +gettitle () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_GETTITLE' to get the title of the main movie" + + if [ "$TITLE" = "" -o "$RECORDING" = "" -o $FORCE -eq 1 ] ; then + + # insert DVD and do some checks + d2v_mesg "${MESG_01[$LNG]}" + $EJECT_BIN $DVD_DEVICE + sleep $SLEEPTIME + + local DVDSTATUS=1 + while [ "$DVDSTATUS" -gt 0 ] ; do + $TCPROBE_BIN -i $DVD_DEVICE -H 10 >> $LOGFILE 2>&1> /dev/null + DVDSTATUS=$? + if [ $DVDSTATUS -gt 0 ]; then + d2v_mesg "${MESG_02[$LNG]}" + # insert DVD + d2v_mesg "${MESG_01[$LNG]}" + $EJECT_BIN $DVD_DEVICE + sleep $SLEEPTIME + fi + done + + case $ACTION_GETTITLE in + ${GETTITLE_TOOLS[0]}) + ;; + ${GETTITLE_TOOLS[1]}) + d2v_log "`echo && echo \$\> $VOBCOPY_BIN -i $DVD_DEVICE \ + -v -v -I -L ${TEMPDIR} 2\> /dev/null`" + $VOBCOPY_BIN -i $DVD_DEVICE -v -v -I \ + -L ${TEMPDIR} 2> /dev/null && \ + TITLE=`cat ${TEMPDIR}/vobcopy_*.log | \ + grep 'Name of the dvd' | head -n 1 | awk '{print $6}'` && \ + cat ${TEMPDIR}/vobcopy_*.log >> $LOGFILE + if [ $TITLENUM = "AUTO" ] ; then + TITLENUM=`cat ${TEMPDIR}/vobcopy_*.log | \ + grep 'Using Title' | head -n 1 | awk '{print $4}'` + fi + ;; + esac + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + + TITLE=`echo $TITLE | sed "s/[^a-zA-Z0-9???????/:.#'&_-]/_/g"` + [ `echo $TITLE | wc -m` -le 2 ] && TITLE="DVD`date +%Y-%m-%d-%M-%H`" + + RECORDING="`date +%Y-%m-%d.%H.%M`.99.$RECORDING_LIFETIME.rec" + fi + + d2v_log_force "\$TITLE='$TITLE'" + d2v_log_force "\$TITLENUM='$TITLENUM'" + d2v_log_force "\$RECORDING='$RECORDING'" +} + + +########################################################################### +# test for the main movie +########################################################################### + +test () { + d2v_log_separator + d2v_log_force \ + "using 'tcprobe' to test for the main movie" + + if [ ! -f ${TEMPDIR}/001.vob -o $FORCE -eq 1 -o \ + $AUDIOTRACK -lt 0 -o "$AUDIOFORMAT" = "" -o \ + "$TCEXTRACTOPTAUDIO" = "" ] ; then + + # find main movie + local MAX_TITLENUM=0 + + d2v_log "`echo && echo \$\> $TCPROBE_BIN -H 0 \ + -i $DVD_DEVICE 2\>\&1 \| grep 'title 1/' \| awk '{print $5}'`" + + MAX_TITLENUM=`$TCPROBE_BIN -H 0 -i $DVD_DEVICE 2>&1 | \ + grep 'title 1/' | awk '{print $5}'` + + if [ $MAX_TITLENUM -eq 0 ] ; then + d2v_mesg "${MESG_04[$LNG]}" + $TCPROBE_BIN -H 0 -i $DVD_DEVICE 2>&1 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + fi + + d2v_log "\$MAX_TITLENUM='$MAX_TITLENUM'" + + local i=0 + local FRAMES=0 + local MAX_FRAMES=0 + + if [ $TITLENUM = "MAX" ] ; then + while [ "$i" -lt $MAX_TITLENUM ] ; do + i=$((i+1)) + FRAMES=`$TCPROBE_BIN -i $DVD_DEVICE -H 10 -T $i \ + 2>/dev/null | grep 'frames' | awk '{print $3}'` + [ -z $FRAMES ] && FRAMES="0" + if [ $FRAMES -gt $MAX_FRAMES ] ; then + if [ $FRAMES -gt $((${TITLE_MIN_LENGTH}*25)) ]; then + TITLENUM="$i" + MAX_FRAMES="$FRAMES" + fi + fi + done + fi + + d2v_log "\$MAX_FRAMES='$MAX_FRAMES'" + + if [ $TITLENUM = "MAX" ]; then + d2v_mesg "${MESG_04[$LNG]}" + $TCPROBE_BIN -H 0 -i $DVD_DEVICE 2>&1 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + fi + + d2v_log "\$TITLENUM='$TITLENUM'" + + # create the marks.vdr + + if [ $CREATE_MARKS -eq 1 ]; then + d2v_log "`echo && echo \$\> $TCPROBE_BIN -i $DVD_DEVICE -H 10 \ + -T $TITLENUM 2\>\&1 \| grep Chapter \| cut -d \\\" \\\" -f 4 \ + \> ${TEMPDIR}/marks.vdr`" + $TCPROBE_BIN -i $DVD_DEVICE -H 10 -T $TITLENUM 2>&1 | \ + grep Chapter | cut -d " " -f 4 > ${TEMPDIR}/marks.vdr + fi + + # read audio track + local AUDIOTYPE="" + local AUDIOTYPELINES=0 + local AUDIOFORMATLINES=0 + + d2v_log "`echo && echo \$\> $TCPROBE_BIN -i $DVD_DEVICE -H 10 \ + -T $TITLENUM 2\> /dev/null \| grep dvd_reader.c \| grep kHz \| \ + cat -b - \> ${TEMPDIR}/transcode-audio.log`" + $TCPROBE_BIN -i $DVD_DEVICE -H 10 -T $TITLENUM 2> /dev/null | \ + grep dvd_reader.c | \ + grep kHz | cat -b - > ${TEMPDIR}/transcode-audio.log + + d2v_log "`echo && echo \$\> $TCPROBE_BIN -i $DVD_DEVICE -H 10 \ + -T $TITLENUM 2\> /dev/null \| grep "audio track:" \ + cat -b - \> ${TEMPDIR}/transcode-audio2.log`" + $TCPROBE_BIN -i $DVD_DEVICE -H 10 -T $TITLENUM 2> /dev/null | \ + grep "audio track:" | cat -b - > ${TEMPDIR}/transcode-audio2.log + + AUDIOTRACK=`cat ${TEMPDIR}/transcode-audio.log | \ + grep -n " "$LANGUAGE" " | grep "ac3" | head -n 1 | \ + awk '{print (($1-1))}'` + + if [ -z $AUDIOTRACK ] ; then + AUDIOTRACK=`cat ${TEMPDIR}/transcode-audio.log | grep -n " "$LANGUAGE" " | \ + head -n 1 | awk '{print (($1-1))}'` + if [ -z $AUDIOTRACK ] ; then + AUDIOTRACK=-1 + fi + fi + + AUDIOTYPE=`cat ${TEMPDIR}/transcode-audio.log | \ + grep " "$LANGUAGE" " | head -n 1 | awk '{print $3}'` + AUDIOTYPELINES=`cat ${TEMPDIR}/transcode-audio.log | \ + grep " "$LANGUAGE" " | head -n 1 | awk '{print $3}' | \ + wc -m | awk '{print $1}'` + AUDIOFORMATLINES=`cat ${TEMPDIR}/transcode-audio2.log | \ + grep "0x55"| head -n 1 | wc -m | awk '{print $1}'` + TRANSCODE_AUDIO=`cat ${TEMPDIR}/transcode-audio.log` + TRANSCODE_AUDIO2=`cat ${TEMPDIR}/transcode-audio2.log` + + if [ -z $AUDIOTYPELINES ] ; then + d2v_mesg "${MESG_30[$LNG]}" + $TRANSCODE_AUDIO >> $LOGFILE + $TRANSCODE_AUDIO2 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + fi + + if [ $AUDIOTYPELINES -eq 0 ] ; then + d2v_mesg "${MESG_05[$LNG]}" + $TRANSCODE_AUDIO >> $LOGFILE + $TRANSCODE_AUDIO2 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + fi + + + [ -z $AUDIOFORMATLINES ] && $AUDIOFORMATLINES="0" + if [ $AUDIOFORMATLINES -eq 0 ] ; then + AUDIOFORMAT="other" + else + AUDIOFORMAT="mp3" + fi + + if [ $DEBUG -gt 1 ] ; then + d2v_log_separator + d2v_log_force "write output from transcode-audio.log" + d2v_log "\$TRANSCODE_AUDIO='$TRANSCODE_AUDIO'" + d2v_log_separator + d2v_log_separator + d2v_log_force "write output from transcode-audio2.log" + d2v_log "\$TRANSCODE_AUDIO2='$TRANSCODE_AUDIO2'" + d2v_log_separator + fi + + d2v_log_force "\$AUDIOTRACK='$AUDIOTRACK'" + d2v_log "\$AUDIOTYPE='$AUDIOTYPE'" + d2v_log "\$AUDIOTYPELINES='$AUDIOTYPELINES'" + d2v_log_force "\$AUDIOFORMAT='$AUDIOFORMAT'" + d2v_log "\$AUDIOFORMATLINES='$AUDIOFORMATLINES'" + + case $AUDIOTYPE in + a??) + TCEXTRACTOPTAUDIO="ac3" + ;; + *pcm|raw) + TCEXTRACTOPTAUDIO="pcm" + if [ ACTION_ENCODE != ${ENCODE_TOOLS[1]} ] ; then + ACTION_ENCODE=${ENCODE_TOOLS[1]} + d2v_log "pcm audio track found - \ + forced the usage of '$ACTION_ENCODE'" + fi + ;; + mpeg?) + TCEXTRACTOPTAUDIO="mp2" + ;; + dts) + TCEXTRACTOPTAUDIO="dts" + ;; + *) + d2v_mesg "${MESG_06[$LNG]}" + cat $TRANSCODE_AUDIO >> $LOGFILE + cat $TRANSCODE_AUDIO2 >> $LOGFILE + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${RED}exiting${NORMAL}" + ;; + esac + + d2v_log_force "\$TCEXTRACTOPTAUDIO='$TCEXTRACTOPTAUDIO'" + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + else + d2v_log_force "\$AUDIOTRACK='$AUDIOTRACK'" + d2v_log_force "\$AUDIOFORMAT='$AUDIOFORMAT'" + d2v_log_force "\$TCEXTRACTOPTAUDIO='$TCEXTRACTOPTAUDIO'" + fi +} + + +########################################################################### +# copy the main movie to disk +########################################################################### + +copy () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_COPY' to copy the main movie to disk" + + if [ ! -f ${TEMPDIR}/001.vob -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/001.vob ] && rm -f ${TEMPDIR}/001.vob + + # read main movie off the DVD + d2v_mesg "${MESG_03[$LNG]} TITEL: $TITLE NUM: $TITLENEM AUDIO: $TCEXTRACTOPTAUDIO" + + d2v_log "`echo && echo \$\> $TCCAT_BIN -t dvd -i $DVD_DEVICE \ + -T $TITLENUM,-1 -L 2\> /dev/null \> ${TEMPDIR}/001.vob`" + nice -n ${PRIO} $TCCAT_BIN -t dvd -i $DVD_DEVICE -T $TITLENUM,-1 \ + -L 2> /dev/null > ${TEMPDIR}/001.vob + + local STATUS=$? + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_07[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$TCCAT_BIN ${RED}failed - exiting${NORMAL}" + fi + + # eject DVD + d2v_mesg "${MESG_08[$LNG]}" + $EJECT_BIN $DVD_DEVICE + sleep $SLEEPTIME + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + + if [ $AUDIOFORMAT = "mp3" ] ; then + d2v_log "`echo && echo \$\> mv ${TEMPDIR}/001.vob \ + ${TEMPDIR}/001.mpeg`" && \ + mv ${TEMPDIR}/001.vob ${TEMPDIR}/001.mpeg + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + fi + if [ $AUDIOFORMAT = "other" -a "$TCEXTRACTOPTAUDIO" = "mp2" ] ; then + d2v_log "cho && echo \$\> mv ${TEMPDIR}/001.vob \ + ${TEMPDIR}/001.mpeg" && \ + mv ${TEMPDIR}/001.vob ${TEMPDIR}/001.mpeg + d2v_log "cho && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}" + fi + + + fi +} + + +########################################################################### +# demultiplex the main movie in mpv and ac3 +########################################################################### + +demux () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_DEMUX' to demultiplex the main movie in mpv and ac3" + + if [ ! -f ${TEMPDIR}/001.vob ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.vob' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.mpv -o ! -f ${TEMPDIR}/001.ac3 -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/001.mpv ] && rm -f ${TEMPDIR}/001.mpv + [ -f ${TEMPDIR}/001.ac3 ] && rm -f ${TEMPDIR}/001.ac3 + rm -f ${TEMPDIR}/video.fifo + rm -f ${TEMPDIR}/audio.fifo + + local STATUS=1 + + if [ "$AUDIOFORMAT" != "mp3" ] ; then + case $ACTION_DEMUX in + ${DEMUX_TOOLS[0]}) + + # demux using fifos and tcextract + d2v_mesg "${MESG_10[$LNG]}" + mkfifo ${TEMPDIR}/video.fifo + mkfifo ${TEMPDIR}/audio.fifo + + d2v_log "`echo && echo \$\> $TCEXTRACT_BIN -i \ + ${TEMPDIR}/video.fifo -t vob -x mpeg2 -a 0xe0 \ + \> ${TEMPDIR}/001.mpv \&`" + + nice -n ${PRIO} $TCEXTRACT_BIN -i ${TEMPDIR}/video.fifo \ + -t vob -x mpeg2 -a 0xe0 \ + > ${TEMPDIR}/001.mpv & + + d2v_log "`echo && echo \$\> $TCEXTRACT_BIN -i \ + ${TEMPDIR}/audio.fifo -t vob -x ${TCEXTRACTOPTAUDIO} \ + -a $AUDIOTRACK \> ${TEMPDIR}/001.ac3 \&`" + nice -n ${PRIO} $TCEXTRACT_BIN -i ${TEMPDIR}/audio.fifo \ + -t vob -x ${TCEXTRACTOPTAUDIO} -a ${AUDIOTRACK} \ + > ${TEMPDIR}/001.ac3 & + + sleep 5 + d2v_log "`echo && echo \$\> cat ${TEMPDIR}/001.vob \| \ + tee ${TEMPDIR}/video.fifo ${TEMPDIR}/audio.fifo \ + \> /dev/null`" + nice -n ${PRIO} cat ${TEMPDIR}/001.vob | \ + tee ${TEMPDIR}/audio.fifo ${TEMPDIR}/video.fifo \ + > /dev/null + + STATUS=$? + ;; + ${DEMUX_TOOLS[1]}) + + if [ $WITHOUT_X -eq 0 ] ; then + # start virtual X server + $XVFB_BIN -once :4 >/dev/null 2>&1 & + export DISPLAY=localhost:4 + fi + + export LANG=de_DE@euro + + # demux using projectX + d2v_log "`echo && echo \$\> $JAVA_BIN -jar $PROJECTX_JAR \ + -c $PROJECTX_INI -o ${TEMPDIR} \ + ${TEMPDIR}/001.vob 2\>\&1 \>\> $LOGFILE`" + nice -n ${PRIO} $JAVA_BIN -jar $PROJECTX_JAR \ + -c $PROJECTX_INI -o ${TEMPDIR} \ + ${TEMPDIR}/001.vob 2>&1 >> $LOGFILE + + STATUS=$? + + if [ $WITHOUT_X -eq 0 ] ; then + # stop Virtual X server + /usr/bin/killall Xvfb + fi + ;; + esac + + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$ACTION_DEMUX ${RED}failed - exiting${NORMAL}" + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + else + d2v_log "demultiplexing not required - \ + main movie contains mp2 audio track" + fi + fi + [ $REMOVE -eq 1 ] && rm -f ${TEMPDIR}/001.vob +} + + +########################################################################### +# encode ac3 to mp2 +########################################################################### + +encode () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_ENCODE' to encode ac3 to mp2" + + if [ ! -f ${TEMPDIR}/001.ac3 ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.ac3' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.mp2 -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/001.mp2 ] && rm -f ${TEMPDIR}/001.mp2 + + local STATUS=1 + + if [ "$AUDIOFORMAT" != "mp3" ] ; then + + if [ "$TCEXTRACTOPTAUDIO" = "pcm" ] ; then + d2v_log "pcm or raw audio track move to wav audio track" + mv ${TEMPDIR}/001.ac3 ${TEMPDIR}/001.wav + fi + + if [ "$TCEXTRACTOPTAUDIO" != "pcm" ] ; then + # encode with a52dec ... + d2v_log "`echo && echo \$\> $A52DEC_BIN -o wavdolby \ + -g "$A52DEC_GAIN" ${TEMPDIR}/001.ac3 \ + 2\>\&1 \> ${TEMPDIR}/001.wav \| grep -v \'last\' \ + \>\> $LOGFILE`" + nice -n ${PRIO} $A52DEC_BIN -o wavdolby \ + -g "$A52DEC_GAIN" ${TEMPDIR}/001.ac3 \ + 2>&1 > ${TEMPDIR}/001.wav | grep -v 'last' \ + >> $LOGFILE + STATUS=$? + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$A52DEC_BIN ${RED}failed - exiting${NORMAL}" + fi + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + + case $ACTION_ENCODE in + ${ENCODE_TOOLS[0]}) + + # ... and mp2enc + d2v_log "`echo && echo \$\> cat ${TEMPDIR}/001.wav \| \ + $MP2ENC_BIN -r 48000 -o ${TEMPDIR}/001.mp2 \ + \> /dev/null 2\>\> $LOGFILE`" + nice -n ${PRIO} cat ${TEMPDIR}/001.wav | \ + $MP2ENC_BIN -r 48000 -o ${TEMPDIR}/001.mp2 \ + > /dev/null 2>> $LOGFILE + STATUS=$? + ;; + ${ENCODE_TOOLS[1]}) + + # ... and toolame + d2v_log "`echo && echo \$\> cat ${TEMPDIR}/001.wav \| \ + $TOOLAME_BIN -s 48 /dev/stdin ${TEMPDIR}/001.mp2 \ + \> /dev/null 2\>\> $LOGFILE`" + nice -n ${PRIO} cat ${TEMPDIR}/001.wav | \ + $TOOLAME_BIN -s 48 /dev/stdin ${TEMPDIR}/001.mp2 \ + > /dev/null 2>> $LOGFILE + STATUS=$? + ;; + esac + + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$ACTION_ENCODE ${RED}failed - exiting${NORMAL}" + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + else + d2v_log "encoding not required - \ + main movie contains mp2 audio track" + fi + fi + [ $REMOVE -eq 1 ] && rm -f ${TEMPDIR}/001.wav +} + + +########################################################################### +# multiplex the parts to a VDR recording +########################################################################### + +mplex () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_MPLEX' to multiplex the part to a VDR recording" + + if [ ! -f ${TEMPDIR}/001.mpv ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.mpv' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.ac3 ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.ac3' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.mp2 ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.mp2' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.mpeg -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/001.mpeg ] && rm -f ${TEMPDIR}/001.mpeg + + if [ "$AUDIOFORMAT" != "mp3" ] ; then + + local STATUS=1 + + d2v_mesg "${MESG_11[$LNG]}" + + case $ACTION_MPLEX in + ${MPLEX_TOOLS[0]}) + [ $AC3_TRACK -eq 1 ] && \ + INC_AC3_TRACK="-s ${TEMPDIR}/001.ac3" + + # tcmplex a MPEG file + d2v_log "`echo && echo \$\> $TCMPLEX_BIN -m 2 \ + -i ${TEMPDIR}/001.mpv -p ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2\>\&1 \| grep -v \'%\' - \>\> $LOGFILE`" + nice -n ${PRIO} $TCMPLEX_BIN -m 2 \ + -i ${TEMPDIR}/001.mpv -p ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2>&1 | grep -v '%' - >> $LOGFILE + STATUS=$? + ;; + ${MPLEX_TOOLS[1]}) + [ $AC3_TRACK -eq 1 ] && \ + INC_AC3_TRACK="-1 ${TEMPDIR}/001.ac3" + + # tcmplex-panteltje a MPEG file + d2v_log "`echo && echo \$\> $TCMPLEX_PANTELTJE_BIN -m 2 \ + -i ${TEMPDIR}/001.mpv -0 ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2\>\&1 \| grep -v \'%\' - \>\> $LOGFILE`" + nice -n ${PRIO} $TCMPLEX_PANTELTJE_BIN -m 2 \ + -i ${TEMPDIR}/001.mpv -0 ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2>&1 | grep -v '%' - >> $LOGFILE + STATUS=$? + ;; + ${MPLEX_TOOLS[2]}) + [ $AC3_TRACK -eq 1 ] && \ + INC_AC3_TRACK="${TEMPDIR}/001.ac3" + + # mplex a MPEG file + d2v_log "`echo && echo \$\> $MPLEX_BIN -f 9 \ + ${TEMPDIR}/001.mpv ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2\>\&1 \| grep -v \'%\' - \>\> $LOGFILE`" + nice -n ${PRIO} $TCMPLEX_BIN -f 9 \ + ${TEMPDIR}/001.mpv ${TEMPDIR}/001.mp2 \ + $INC_AC3_TRACK -o ${TEMPDIR}/001.mpeg \ + 2>&1 | grep -v '%' - >> $LOGFILE + STATUS=$? + ;; + esac + + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$ACTION_MPLEX ${RED}failed - exiting${NORMAL}" + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + else + d2v_log "multiplexing not required - \ + main movie contains mp2 audio track" + fi + fi + [ $REMOVE -eq 1 ] && rm -f ${TEMPDIR}/001.mpv ${TEMPDIR}/001.ac3 ${TEMPDIR}/001.mp2 +} + + +########################################################################### +# split the VDR recording into chunks +########################################################################### + +split () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_SPLIT' to split the VDR recording into chunks" + + d2v_mesg "${MESG_12[$LNG]}" + + if [ ! -f ${TEMPDIR}/001.mpeg ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.mpeg' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/001.vdr -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/002.vdr ] && rm -f ${TEMPDIR}/???.vdr + [ -f ${TEMPDIR}/001.mpeg.* ] && rm -f ${TEMPDIR}/001.mpeg.* + + local FILESIZE=`ls -l ${TEMPDIR}/001.mpeg | awk '{print $5}'` + + if [ $FILESIZE -gt $RECORDING_MAX_SIZE ] ; then + d2v_log "`echo && echo \$\> $SPLIT_BIN -b $RECORDING_MAX_SIZE \ + ${TEMPDIR}/001.mpeg ${TEMPDIR}/001.vdr.`" + nice -n ${PRIO} $SPLIT_BIN -b $RECORDING_MAX_SIZE \ + ${TEMPDIR}/001.mpeg ${TEMPDIR}/001.mpeg. + + local STATUS=$? + if [ $STATUS -eq 1 ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$ACTION_SPLIT ${RED}failed - exiting${NORMAL}" + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && \ + ls -l ${TEMPDIR}`" + + local NEWNAME=0 + for DNAME in ${TEMPDIR}/001.mpeg.* ; do + NEWNAME=`echo $NEWNAME | awk '{printf "%03d",$1+1}'` + mv $DNAME ${TEMPDIR}/$NEWNAME.vdr + + if [ $NEWNAME -gt $RECORDING_MAX_CHUNKS ] ; then + d2v_mesg "${MESG_09[$LNG]}" + cp $LOGFILE ${TEMPDIR}/$TITLE.log + d2v_error "${MAGENTA}$RECORDING_MAX_CHUNKS ${RED}to many chunks - exiting${NORMAL}" + fi + done + else + mv ${TEMPDIR}/001.mpeg ${TEMPDIR}/001.vdr + fi + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" +} + + +########################################################################### +# create an index.vdr +########################################################################### + +genindex () { + d2v_log_separator + d2v_log_force \ + "using '$ACTION_GENINDEX' to create an index.vdr" + + if [ ! -f ${TEMPDIR}/001.vdr ] ; then + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_error "${MAGENTA}'${TEMPDIR}/001.vdr' ${RED}not found${NORMAL}" + fi + + if [ ! -f ${TEMPDIR}/index.vdr -o $FORCE -eq 1 ] ; then + + # clean up + [ -f ${TEMPDIR}/index.vdr ] && rm -f ${TEMPDIR}/index.vdr + + cd ${TEMPDIR} + + case $ACTION_GENINDEX in + ${GENINDEX_TOOLS[0]}) + d2v_log "`echo && echo \$\> $GENINDEX_BIN 2\>\&1 \| \ + grep -v \'%\' - \>\> $LOGFILE`" + nice -n ${PRIO} $GENINDEX_BIN 2>&1 | \ + grep -v '%' - >> $LOGFILE + ;; + ${GENINDEX_TOOLS[1]}) + d2v_log "`echo && echo \$\> $GENINDEX_MJPEGFIX_BIN 2\>\&1 \| \ + grep -v \'I-Frame\' - \>\> $LOGFILE`" + nice -n ${PRIO} $GENINDEX_MJPEGFIX_BIN 2>&1 | \ + grep -v 'I-Frame' - >> $LOGFILE + ;; + esac + fi + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" +} + + +########################################################################### +# move recording to video directory +########################################################################### + +move () { + d2v_log_separator + d2v_log_force \ + "using 'mv' to move recording to video directory" + + mkdir -p ${VIDEODIR}/${TITLE}/${RECORDING} >> $LOGFILE || \ + d2v_error "${RED}failed to create ${MAGENTA}'${VIDEODIR}/${TITLE}/${RECORDING}'${NORMAL}" + d2v_log "'${VIDEODIR}/${TITLE}/${RECORDING}' created" + + mv ${TEMPDIR}/*.vdr ${VIDEODIR}/${TITLE}/${RECORDING} + + d2v_log "`echo && echo \$\> ls -l ${TEMPDIR} && ls -l ${TEMPDIR}`" + d2v_log "`echo && echo \$\> ls -l ${VIDEODIR}/${TITLE}/${RECORDING} && \ + ls -l ${VIDEODIR}/${TITLE}/${RECORDING}`" +} + + +########################################################################### +# do all the bits +########################################################################### + +if [ $ACTION = "copy" ] ; then + gettitle + test + eval $ACTION +fi + + +if [ $ACTION = "all" ] ; then + readvars + gettitle + test + copy + if [ "$AUDIOFORMAT" = "mp3" ] ; then + split + genindex + move + elif [ "$AUDIOFORMAT" = "other" -a "$TCEXTRACTOPTAUDIO" = "mp2" ] ; then + split + genindex + move + else + demux + encode + mplex + split + genindex + move + fi +fi + +writevars + + +########################################################################### +# yeeha, we did it +########################################################################### + +[ $ACTION = "all" -a $CLEAN = 1 ] && rm -rf $TEMPDIR && d2v_log "\$TEMPDIR '$TEMPDIR' deleted" + +rm -f $LOCKFILE + +d2v_log_separator +d2v_log_force END +d2v_log_separator + +if [ "$?" = "0" ] ; then + touch $VIDEODIR/.update |at now && $SVDRPSEND_PL -d localhost "MESG ! Auftrag erfolgreich beendet !" && exit 0 +else + exit 1 +fi diff --git a/plugins/dvdconvert/dvdconvert/dvdconvert.sh b/plugins/dvdconvert/dvdconvert/dvdconvert.sh new file mode 100755 index 0000000..ffcc271 --- /dev/null +++ b/plugins/dvdconvert/dvdconvert/dvdconvert.sh @@ -0,0 +1,31 @@ +#!/bin/sh +[ -r /etc/default/vdr ] || exit +. /etc/default/vdr +CFG_FILE="$VDRCONFDIR/plugins/dvdconvert.conf" +CFG_SAVE="$VDRCONFDIR/plugins/dvdconvert.conf.save" + +TODO_FILE="/tmp/~dvdconvert.sh" +LOG_FILE="$VDRVARDIR/dvdconvert/log/dvdconvert.log" +rm -rf $TODO_FILE > /dev/null 2>&1 +echo "#!/bin/sh" > $TODO_FILE +if [ -s $CFG_SAVE ] ; then + ALL_SCRIPTS=`diff $CFG_FILE $CFG_SAVE | grep "^< /" | cut -b 3- | cut -d ":" -f 1` +else + ALL_SCRIPTS=`cat $CFG_FILE | grep "^/" | cut -d ":" -f 1` +fi +LAST_SCRIPT="" +for i in $ALL_SCRIPTS ; do + if [ "${i}" != "$LAST_SCRIPT" ] ; then + if [ -f ${i} ] ; then + echo "sh ${i} >> $LOG_FILE 2>&1" >> $TODO_FILE + else + echo "<${i}> not found" >> $LOG_FILE + echo "<${i}> not found" + fi + fi + LAST_SCRIPT=${i} +done +#echo 'echo "Fertig"' >> $TODO_FILE +cp -f $CFG_FILE $CFG_SAVE +chmod +x $TODO_FILE +sh $TODO_FILE diff --git a/plugins/dvdconvert/dvdconvert/getadmval.sh b/plugins/dvdconvert/dvdconvert/getadmval.sh new file mode 100755 index 0000000..28945d4 --- /dev/null +++ b/plugins/dvdconvert/dvdconvert/getadmval.sh @@ -0,0 +1,16 @@ +#!/bin/sh +[ -r /etc/default/vdr ] || exit +. /etc/default/vdr +CFG_FILE="$VDRCONFDIR/plugins/dvdconvert.conf" + +VAL=`cat $CFG_FILE | grep ":$1:" | cut -f 3 -d ":"` +TYPE=`cat $CFG_FILE | grep ":$1:" | cut -f 4 -d ":"` +if [ "$TYPE" = "L" ] ; then + ALL_VAL=`cat $CFG_FILE | grep ":$1:" | cut -f 6 -d ":" | grep ","` + VAL=$(($VAL+1)) + SET_VAL=`echo $ALL_VAL | cut -f $VAL -d ","` +else + SET_VAL=$VAL +fi + +echo `echo $SET_VAL | sed 's/^ //'g` diff --git a/plugins/dvdconvert/dvdconvert/setadmval.sh b/plugins/dvdconvert/dvdconvert/setadmval.sh new file mode 100755 index 0000000..9964f17 --- /dev/null +++ b/plugins/dvdconvert/dvdconvert/setadmval.sh @@ -0,0 +1,26 @@ +#!/bin/sh +[ -r /etc/default/vdr ] || exit +. /etc/default/vdr +CFG_FILE="$VDRCONFDIR/plugins/dvdconvert.conf" + +VAL=$2 +NAME=$1 + +mv -f $CFG_FILE $CFG_FILE.org + +NLINE=`cat $CFG_FILE.org | grep ":$NAME:"` + +TYPE=`echo $NLINE | cut -f 4 -d ":"` +OLDVAL=`echo $NLINE | cut -f 3 -d ":"` +if [ "$TYPE" = "L" ] ; then + ALL_VAL=`echo $NLINE | cut -f 6 -d ":" | sed 's/,/ /g'` + IDX=0 + for i in $ALL_VAL ; do + if [ "${i}" = "$VAL" ] ; then + VAL=$IDX + fi + IDX=$(($IDX+1)) + done +fi + +cat $CFG_FILE.org | sed 's/:'$NAME':'$OLDVAL':/:'$NAME':'$VAL':/' > $CFG_FILE diff --git a/plugins/dvdconvert/dvdconvert/start_dvd2dvd.sh b/plugins/dvdconvert/dvdconvert/start_dvd2dvd.sh new file mode 100755 index 0000000..6eda409 --- /dev/null +++ b/plugins/dvdconvert/dvdconvert/start_dvd2dvd.sh @@ -0,0 +1,63 @@ +#!/bin/bash +[ -r /etc/default/vdr ] || exit +. /etc/default/vdr + +GETVAL="sh $VDRSCRIPTDIR/dvdconvert/getadmval.sh" +SETVAL="sh $VDRSCRIPTDIR/dvdconvert/setadmval.sh" +DVD2DVD="$VDRSCRIPTDIR/dvdconvert/dvd2dvd.sh" +DVD2DVD_CFG="$VDRCONFDIR/plugins/dvd2dvd.conf" +LOG_FILE="$VDRVARDIR/dvdconvert/log/dvd2dvd.log" + +ACTION=`$GETVAL ACTION1` +echo "ACTION="$ACTION > $DVD2DVD_CFG + +LANGUAGE=`$GETVAL LANGUAGE1` +echo "LANGUAGE="$LANGUAGE >> $DVD2DVD_CFG + +OSDINFO=`$GETVAL OSDINFO1` +echo "OSDINFO="$OSDINFO >> $DVD2DVD_CFG + +TITLE=`$GETVAL TITLE1` +echo "TITLE="$TITLE >> $DVD2DVD_CFG + +TITLENUM=`$GETVAL TITLENUM1` +echo "TITLENUM="$TITLENUM >> $DVD2DVD_CFG + +ACTION_DEMUX=`$GETVAL ACTION_DEMUX1` +echo "ACTION_DEMUX="$ACTION_DEMUX >> $DVD2DVD_CFG + +WITHOUT_X=`$GETVAL WITHOUT_X1` +echo "WITHOUT_X="$WITHOUT_X >> $DVD2DVD_CFG + +A52DEC_GAIN=`$GETVAL A52DEC_GAIN1` +echo "A52DEC_GAIN="$A52DEC_GAIN >> $DVD2DVD_CFG + +ACTION_ENCODE=`$GETVAL ACTION_ENCODE1` +echo "ACTION_ENCODE="$ACTION_ENCODE >> $DVD2DVD_CFG + +ACTION_MPLEX=`$GETVAL ACTION_MPLEX1` +echo "ACTION_MPLEX="$ACTION_MPLEX >> $DVD2DVD_CFG + +BURN=`$GETVAL BURN1` +echo "BURN="$BURN >> $DVD2DVD_CFG + +RW_FORMAT=`$GETVAL RW_FORMAT1` +echo "RW_FORMAT="$RW_FORMAT >> $DVD2DVD_CFG + +REMOVE_ISO=`$GETVAL REMOVE_ISO1` +echo "REMOVE_ISO="$REMOVE_ISO >> $DVD2DVD_CFG + +REMOVE=`$GETVAL REMOVE1` +echo "REMOVE="$REMOVE >> $DVD2DVD_CFG + +CLEAN=`$GETVAL CLEAN1` +echo "CLEAN="$CLEAN >> $DVD2DVD_CFG + +VERBOSE=`$GETVAL VERBOSE1` +echo "VERBOSE="$VERBOSE >> $DVD2DVD_CFG + +sh $DVD2DVD >> $LOG_FILE 2>&1& + +exit 0 + + diff --git a/plugins/dvdconvert/dvdconvert/start_dvd2vdr.sh b/plugins/dvdconvert/dvdconvert/start_dvd2vdr.sh new file mode 100755 index 0000000..39d3fde --- /dev/null +++ b/plugins/dvdconvert/dvdconvert/start_dvd2vdr.sh @@ -0,0 +1,57 @@ +#!/bin/bash +[ -r /etc/default/vdr ] || exit +. /etc/default/vdr + +GETVAL="sh $VDRSCRIPTDIR/dvdconvert/getadmval.sh" +SETVAL="sh $VDRSCRIPTDIR/dvdconvert/setadmval.sh" +DVD2VDR="$VDRSCRIPTDIR/dvdconvert/dvd2vdr.sh" +DVD2VDR_CFG="$VDRCONFDIR/plugins/dvd2vdr.conf" +LOG_FILE="$VDRVARDIR/dvdconvert/log/dvd2vdr.log" + +ACTION=`$GETVAL ACTION` +echo "ACTION="$ACTION > $DVD2VDR_CFG + +LANGUAGE=`$GETVAL LANGUAGE` +echo "LANGUAGE="$LANGUAGE >> $DVD2VDR_CFG + +OSDINFO=`$GETVAL OSDINFO` +echo "OSDINFO="$OSDINFO >> $DVD2VDR_CFG + +TITLE=`$GETVAL TITLE` +echo "TITLE="$TITLE >> $DVD2VDR_CFG + +TITLENUM=`$GETVAL TITLENUM` +echo "TITLENUM="$TITLENUM >> $DVD2VDR_CFG + +ACTION_DEMUX=`$GETVAL ACTION_DEMUX` +echo "ACTION_DEMUX="$ACTION_DEMUX >> $DVD2VDR_CFG + +WITHOUT_X=`$GETVAL WITHOUT_X` +echo "WITHOUT_X="$WITHOUT_X >> $DVD2VDR_CFG + +A52DEC_GAIN=`$GETVAL A52DEC_GAIN` +echo "A52DEC_GAIN="$A52DEC_GAIN >> $DVD2VDR_CFG + +ACTION_ENCODE=`$GETVAL ACTION_ENCODE` +echo "ACTION_ENCODE="$ACTION_ENCODE >> $DVD2VDR_CFG + +ACTION_MPLEX=`$GETVAL ACTION_MPLEX` +echo "ACTION_MPLEX="$ACTION_MPLEX >> $DVD2VDR_CFG + +ACTION_GENINDEX=`$GETVAL ACTION_GENINDEX` +echo "ACTION_GENINDEX="$ACTION_GENINDEX >> $DVD2VDR_CFG + +REMOVE=`$GETVAL REMOVE` +echo "REMOVE="$REMOVE >> $DVD2VDR_CFG + +CLEAN=`$GETVAL CLEAN` +echo "CLEAN="$CLEAN >> $DVD2VDR_CFG + +VERBOSE=`$GETVAL VERBOSE` +echo "VERBOSE="$VERBOSE >> $DVD2VDR_CFG + +sh $DVD2VDR >> $LOG_FILE 2>&1& + +exit 0 + + diff --git a/plugins/dvdconvert/patches/dvdconvert-1.0.2_versnum-fix.diff b/plugins/dvdconvert/patches/dvdconvert-1.0.2_versnum-fix.diff new file mode 100644 index 0000000..7a026ae --- /dev/null +++ b/plugins/dvdconvert/patches/dvdconvert-1.0.2_versnum-fix.diff @@ -0,0 +1,39 @@ +diff -ruN dvdconvert-1.0.2/dvdconvert.c~ dvdconvert-1.0.2/dvdconvert.c +--- dvdconvert-1.0.2/dvdconvert.c~ 2006-11-02 22:37:34.000000000 +0100 ++++ dvdconvert-1.0.2/dvdconvert.c 2009-03-17 20:52:20.000000000 +0100 +@@ -19,7 +19,7 @@ + #define STATE_SAVE 999 + #define DEFAULT_CHARS "abcdefghijklmnopqrstuvwxyz0123456789-/_ABCDEFGHIJKLMNOPQRSTUVWXYZ" + +-static const char *VERSION = "1.0.1"; ++static const char *VERSION = "1.0.2"; + static const char *DESCRIPTION = "Plugin for dvdconvert with dvd2vdr dvd2dvd"; + static const char *MAINMENUENTRY = NULL; + +diff -ruN dvdconvert-1.0.2/Makefile~ dvdconvert-1.0.2/Makefile +--- dvdconvert-1.0.2/Makefile~ 2004-08-16 07:21:36.000000000 +0200 ++++ dvdconvert-1.0.2/Makefile 2009-03-17 20:45:42.000000000 +0100 +@@ -29,9 +29,9 @@ + + -include $(VDRDIR)/Make.config + +-### The version number of VDR (taken from VDR's "config.h"): ++### The version number of VDR's plugin API (taken from VDR's "config.h"): + +-VDRVERSION = $(shell grep 'define VDRVERSION ' $(VDRDIR)/config.h | awk '{ print $$3 }' | sed -e 's/"//g') ++APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h) + + ### The name of the distribution archive: + +@@ -68,8 +68,8 @@ + + libvdr-$(PLUGIN).so: $(OBJS) + $(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@ +- echo "cp $@ $(LIBDIR)/$@.$(VDRVERSION)" +- @cp $@ $(LIBDIR)/$@.$(VDRVERSION) ++ echo "cp $@ $(LIBDIR)/$@.$(APIVERSION)" ++ @cp $@ $(LIBDIR)/$@.$(APIVERSION) + + dist: clean + @-rm -rf $(TMPDIR)/$(ARCHIVE) + diff --git a/plugins/dvdconvert/plugin.sh b/plugins/dvdconvert/plugin.sh new file mode 100755 index 0000000..d4ca3d9 --- /dev/null +++ b/plugins/dvdconvert/plugin.sh @@ -0,0 +1,161 @@ +#!/bin/sh + +# x-vdr (Installations-Skript fuer einen VDR mit Debian als Basis) +# von Marc Wernecke - www.zulu-entertainment.de +# 23.03.2009 +# +# vdr-dvdconvert + +# defaults +source ./../../x-vdr.conf +source ./../../setup.conf +source ./../../functions + +WEB="http://vdr-wiki.de/vdr/vdr-dvdconvert/vdr-dvdconvert-1.0.2.tar.bz2" +VERSION="dvdconvert-1.0.2" +LINK="dvdconvert" + +VAR=`basename $WEB` +DIR=`pwd` + +# plugin entfernen +function clean_plugin() { + cd $SOURCEDIR/VDR/PLUGINS/src + rm -rf $LINK* + rm -f $VDRLIBDIR/libvdr-$LINK* + log "cleaning $LINK" + [ "$VDRUPDATE" = "on" ] && return + rm -r $VDRSCRIPTDIR/dvdconvert + rm -f $VDRCONFDIR/plugins/dvdconvert.conf + rm -f $VDRCONFDIR/plugins/dvdconvert.conf.save +} + +# plugin installieren +function install_plugin() { + download_plugin + extract_plugin + cd $SOURCEDIR/VDR/PLUGINS/src + rm -f $LINK + ln -vfs $VERSION $LINK + patch_plugin + + ## plugin specials - start ## + # dirs + mkdir -p $VDRVARDIR/dvdconvert/dvd2vdr + mkdir -p $VDRVARDIR/dvdconvert/dvd2dvd + mkdir -p $VDRVARDIR/dvdconvert/log + chown -R $VDRUSER:$VDRGROUP $VDRVARDIR/dvdconvert + + # scripts + [ "$VDRUPDATE" = "on" ] && [ -d $VDRSCRIPTDIR/dvdconvert ] && return + if [ -d $DIR/dvdconvert ]; then + cp -r $DIR/dvdconvert $VDRSCRIPTDIR/ + chown -R $VDRUSER:$VDRGROUP $VDRSCRIPTDIR/dvdconvert + chmod 0744 $VDRSCRIPTDIR/dvdconvert/* + fi + + # config +echo "# This file contains the tasks for the dvdconvert plugin +# Syntax: +# <script>:<name>:<value>:<type>:<length>:<choices>:<description>: +# +:dvd2vdr +--- Einstellungen_dvd2vdr --- +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION:0:L:1:all,copy,demux,encode,mplex,split,move:Actions: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:LANGUAGE:0:L:1:de,en:Language: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:OSDINFO:1:B:0:Nein,Ja:OSD-Info: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:TITLE: :A:15:abcdefghijklmnopqrstuvwxyz0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZ:Title (optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:TITLENUM: :A:3:0,99,MAX,AUTO:Specific title (00-99) or (MAX = max. Frames) or (AUTO = vobcopy-test)(optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION_DEMUX:0:L:0:tcextract,projectX:Demuxer: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:WITHOUT_X:0:B:1:Nein,Ja:Start Xvfb (optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:A52DEC_GAIN:00:I:2:-96,96:Audio gain (-96.0 to +96.0)(optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION_ENCODE:0:L:0:toolame,mp2enc:Encoder: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION_MPLEX:0:L:0:mplex,tcmplex,tcmplex-panteltje:Remuxer: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION_GENINDEX:1:L:0:genindex-mjpegfix,genindex:Write index.vdr: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:REMOVE:1:B:1:Nein,Ja:Remove tmp files: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:CLEAN:0:B:1:Nein,Ja:Clean dirs: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:VERBOSE:1:B:1:Nein,Ja:Turns verbosity on: +: +--- +# +--- +:dvd2dvd +--- Einstellungen_dvd2dvd --- +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:ACTION1:0:L:1:all,copy,demux,encode,reqant,mplex,dvdauthor,iso,move:Actions: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:LANGUAGE1:0:L:1:de,en:Language: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:OSDINFO1:1:B:0:Nein,Ja:OSD-Info: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:TITLE1: :A:15:abcdefghijklmnopqrstuvwxyz0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZ:Title (optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:TITLENUM1: :A:3:0,99,MAX,AUTO:Specific title (00-99) or (MAX = max. Frames) or (AUTO = vobcopy-test)(optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:ACTION_DEMUX1:0:L:0:tcextract,projectX:Demuxer: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:WITHOUT_X1:0:B:1:Nein,Ja:Start Xvfb (optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:A52DEC_GAIN1:00:I:2:-96,96:Audio gain (-96.0 to +96.0)(optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:ACTION_ENCODE1:0:L:0:toolame,mp2enc:Encoder: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:ACTION_MPLEX1:1:L:0:mplex,tcmplex,tcmplex-panteltje:Remuxer: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:BURN1:1:B:1:Nein,Ja:Burn DVD: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:RW_FORMAT1:0:B:1:Nein,Ja:Format DVD-RW: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:REMOVE_ISO1:0:B:1:Nein,Ja:Remove this iso file: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:REMOVE1:0:B:1:Nein,Ja:Remove tmp files: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:CLEAN1:0:B:1:Nein,Ja:Clean dirs: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:VERBOSE1:1:B:1:Nein,Ja:Turns verbosity on: +" > $VDRCONFDIR/plugins/dvdconvert.conf + + +echo "# This file contains the tasks for the dvdconvert plugin +# Syntax: +# <script>:<name>:<value>:<type>:<length>:<choices>:<description>: +# +:dvd2vdr +--- Einstellungen_dvd2vdr --- +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION:0:L:1:all,copy,demux,encode,mplex,split,move:Actions: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:LANGUAGE:0:L:1:de,en:Language: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:OSDINFO:1:B:0:Nein,Ja:OSD-Info: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:TITLE: :A:15:abcdefghijklmnopqrstuvwxyz0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZ:Title (optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:TITLENUM: :A:3:0,99,MAX,AUTO:Specific title (00-99) or (MAX = max. Frames) or (AUTO = vobcopy-test)(optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION_DEMUX:0:L:0:tcextract,projectX:Demuxer: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:WITHOUT_X:0:B:1:Nein,Ja:Start Xvfb (optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:A52DEC_GAIN: :I:2:-96,96:Audio gain (-96.0 to +96.0)(optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION_ENCODE:0:L:0:toolame,mp2enc:Encoder: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION_MPLEX:0:L:0:mplex,tcmplex,tcmplex-panteltje:Remuxer: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:ACTION_GENINDEX:0:L:0:genindex-mjpegfix,genindex:Write index.vdr: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:REMOVE:0:B:1:Nein,Ja:Remove tmp files: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:CLEAN:0:B:1:Nein,Ja:Clean dirs: +$VDRSCRIPTDIR/dvdconvert/start_dvd2vdr.sh:VERBOSE:1:B:1:Nein,Ja:Turns verbosity on: +: +--- +# +--- +:dvd2dvd +--- Einstellungen_dvd2dvd --- +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:ACTION1:0:L:1:all,copy,demux,encode,reqant,mplex,dvdauthor,iso,move:Actions: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:LANGUAGE1:0:L:1:de,en:Language: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:OSDINFO1:1:B:0:Nein,Ja:OSD-Info: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:TITLE1: :A:15:abcdefghijklmnopqrstuvwxyz0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZ:Title (optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:TITLENUM1: :A:3:0,99,MAX,AUTO:Specific title (00-99) or (MAX = max. Frames) or (AUTO = vobcopy-test)(optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:ACTION_DEMUX1:0:L:0:tcextract,projectX:Demuxer: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:WITHOUT_X1:0:B:1:Nein,Ja:Start Xvfb (optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:A52DEC_GAIN1: :I:2:-96,96:Audio gain (-96.0 to +96.0)(optional): +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:ACTION_ENCODE1:0:L:0:toolame,mp2enc:Encoder: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:ACTION_MPLEX1:1:L:0:mplex,tcmplex,tcmplex-panteltje:Remuxer: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:BURN1:1:B:1:Nein,Ja:Burn DVD: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:RW_FORMAT1:0:B:1:Nein,Ja:Format DVD-RW: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:REMOVE_ISO1:0:B:1:Nein,Ja:Remove this iso file: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:REMOVE1:0:B:1:Nein,Ja:Remove tmp files: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:CLEAN1:0:B:1:Nein,Ja:Clean dirs: +$VDRSCRIPTDIR/dvdconvert/start_dvd2dvd.sh:VERBOSE1:1:B:1:Nein,Ja:Turns verbosity on: +" > $VDRCONFDIR/plugins/dvdconvert.conf.save + + chown $VDRUSER:$VDRGROUP $VDRCONFDIR/plugins/dvdconvert.conf $VDRCONFDIR/plugins/dvdconvert.conf.save + + ## plugin specials - ende ## +} + +# plugin commands +if [ $# \> 0 ]; then + cmd=$1 + cmd_plugin +else + install_plugin + log "install-plugin fuer $VERSION ist fertig" +fi + +exit 0 |
