From 81d1a6d6608cd5841873cbc727150e643602eeba Mon Sep 17 00:00:00 2001 From: Daniel Meyerholt Date: Sun, 6 Feb 2011 18:20:58 +0100 Subject: * Changed support recording format to .ts present in vdr>=1.7 currently old recordings are not supported anymore * removed some bashisms in queuehandler.sh * renamed queuehandler.sh to queuehandler, removed sh in conf name as well --- FAQ | 6 +- INSTALL | 6 +- README | 4 +- movie.c | 28 +- scripts/queuehandler | 1035 ++++++++++++++++++++++++++++++++++++++++++ scripts/queuehandler.conf | 72 +++ scripts/queuehandler.sh | 1034 ----------------------------------------- scripts/queuehandler.sh.conf | 71 --- 8 files changed, 1135 insertions(+), 1121 deletions(-) create mode 100755 scripts/queuehandler create mode 100755 scripts/queuehandler.conf delete mode 100755 scripts/queuehandler.sh delete mode 100755 scripts/queuehandler.sh.conf diff --git a/FAQ b/FAQ index af36672..85dd5ee 100755 --- a/FAQ +++ b/FAQ @@ -48,7 +48,7 @@ Which deinterlacing-Filter should i use ? I don't like your encoding-options. How can I change them ? - feel free to change them in the file queuehandler.sh: + feel free to change them in the queuehandler script: ... case "$vcodec" in @@ -124,8 +124,8 @@ a network ? encode.vdrrip. Then you only have to install mplayer/mencoder with all needed codecs and - container-tools, and copy the queuehandler (/scripts/queuehandler.sh & - /scripts/queuehandler.sh.conf) and perhaps vdrsync.pl to e.g. + container-tools, and copy the queuehandler (/scripts/queuehandler & + /scripts/queuehandler.conf) and perhaps vdrsync.pl to e.g. /usr/local/bin. See the table in the file INSTALL for further informations. diff --git a/INSTALL b/INSTALL index 916a19f..6fda54f 100755 --- a/INSTALL +++ b/INSTALL @@ -285,12 +285,12 @@ And don't forget to give read-privileges to the user which starts vdr. > cd vdr/PLUGINS/src > tar xzvf vdr-vdrrip-X.X.X.tgz > ln -s vdrrip-X.X.X vdrrip - > cp vdrrip/scripts/queuehandler.sh /usr/local/bin (or e.g. /usr/bin) - > cp vdrrip/scripts/queuehandler.sh.conf /usr/local/bin (or e.g. /usr/bin) + > cp vdrrip/scripts/queuehandler /usr/local/bin (or e.g. /usr/bin) + > cp vdrrip/scripts/queuehandler.conf /usr/local/bin (or e.g. /usr/bin) > cd ../.. > make plugins - Now you have to adjust the settings in the file queuehandler.sh.conf + Now you have to adjust the settings in the file queuehandler.conf See the README and FAQ how to use the queuehandler. diff --git a/README b/README index 156694e..5eb92c3 100755 --- a/README +++ b/README @@ -51,7 +51,7 @@ movie-boarders with the green key. All settings are saved in the file save.vdrrip in the movie directory. After this you can add the movie with the red key to the encoding queue (this is the file queue.vdrrip in the plugins-directory) and select between preview or full encoding-mode. -The script queuehandler.sh reads the data from the queue, joins +The script queuehandler reads the data from the queue, joins or demuxes the vdr-files and encodes the movie. Some parameters of vdrrip can be adjusted in the setup menu. @@ -89,7 +89,7 @@ templates.vdrrip in the dir /PLUGINS. usage of the quehandler-script: =============================== -queuehandler.sh queuefile tempdir +queuehandler queuefile tempdir The queuefile is the file queue.vdrrip in the dir /PLUGINS. This file is only created, if you add a movie to the queue. After the diff --git a/movie.c b/movie.c index a85763d..364b043 100755 --- a/movie.c +++ b/movie.c @@ -29,8 +29,9 @@ #define IDENTCMD "%s \'%s\'%s -identify -frames 1 -vo md5sum:outfile=/dev/null -ao null 2>/dev/null | sed -e \'s/[`\\!$\"]/\\&/g\'" #define CROPCMD "%s \'%s\'%s -vo null -ao null -quiet -ss %i -frames %i -vf cropdetect 2>/dev/null | grep \"crop=\" | sed \"s/.*crop\\(.*\\)).*/\\1/\" | sort | uniq -c | sort -r" -#define AUDIOCMD "%s \'%s/001.vdr\' -vo null -ao null -frames 0 -aid %i 2>/dev/null | grep AUDIO" -#define AUDIOCMDDVD "%s %s -vo null -ao null -frames 0 -aid %i 2>/dev/null | grep AUDIO" +#define AUDIOPID "%s \'%s/00001.ts\' -vo null -ao null -frames 0 2>/dev/null | grep pid | cut -d \')\' -f2 | cut -d \'=\' -f 2" +#define AUDIOCMD "%s \'%s/00001.ts\' -vo null -ao null -frames 0 -aid %i 2>/dev/null | grep ^AUDIO" +#define AUDIOCMDDVD "%s %s -vo null -ao null -frames 0 -aid %i 2>/dev/null | grep ^AUDIO" #define MENCCMD "%s %s help 2>/dev/null" // --- cMovie ------------------------------------------------------------ @@ -296,7 +297,7 @@ bool cMovie::setCropValues() { int l1; if (Dvd) {asprintf(&cmd, IDENTCMD, MPlayer, Dir, ""); - } else {asprintf(&cmd, IDENTCMD, MPlayer, Dir, "/001.vdr");} + } else {asprintf(&cmd, IDENTCMD, MPlayer, Dir, "/00001.ts");} FILE *p = popen(cmd, "r"); if (p) { @@ -316,8 +317,8 @@ bool cMovie::setCropValues() { asprintf(&cmd, CROPCMD, MPlayer, Dir, "", l/2, l1); isyslog("[vdrrip] detecting crop values in %s", Dir); } else { - asprintf(&cmd, CROPCMD, MPlayer, Dir, "/001.vdr", l/2, l1); - isyslog("[vdrrip] detecting crop values in %s/001.vdr", Dir); + asprintf(&cmd, CROPCMD, MPlayer, Dir, "/00001.ts", l/2, l1); + isyslog("[vdrrip] detecting crop values in %s/00001.ts", Dir); } p = popen(cmd, "r"); FREE(cmd); @@ -481,7 +482,7 @@ const char* cMovie::getPPValues() {return PPValues;} void cMovie::setLengthVDR() { char *file = NULL; - asprintf(&file, "%s/index.vdr", Dir); + asprintf(&file, "%s/index", Dir); FILE *f = fopen(file, "r"); if (f) { fseek(f, 0, SEEK_END); @@ -500,7 +501,7 @@ void cMovie::setLengthVDR() { void cMovie::queryMpValuesVDR() { char *cmd = NULL, *s = NULL; - asprintf(&cmd, IDENTCMD, MPlayer, Dir, "/001.vdr"); + asprintf(&cmd, IDENTCMD, MPlayer, Dir, "/00001.ts"); FILE *p = popen(cmd, "r"); if (p) { s = strcol(strgrep("ID_VIDEO_WIDTH", p), "=", 2); @@ -564,7 +565,18 @@ void cMovie::queryAudioDataVDR() { char *cmd = NULL, *buf = NULL; size_t i = 0; int n = 0; + + // Get Audio PID + asprintf(&cmd, AUDIOPID, MPlayer, Dir); + FILE *apid = popen(cmd,"r"); + isyslog ("Getting Audio PID of ts: %s",cmd); int c = 0; + if (apid && getline(&buf,&i,apid) != -1) { + c = atoi (buf); + } + pclose(apid); + isyslog("Pid selected : %i",c); + bool next = true; while (next) { @@ -572,7 +584,7 @@ void cMovie::queryAudioDataVDR() { FILE *p = popen(cmd, "r"); if (p) { if (getline(&buf, &i, p) != -1) { - if (c == 128) {next = false;} + if (c == 255) {next = false;} A = (struct AudioData*)realloc(A, (n + 1) * sizeof(struct AudioData)); A[n].AudioID = c; diff --git a/scripts/queuehandler b/scripts/queuehandler new file mode 100755 index 0000000..1ab8501 --- /dev/null +++ b/scripts/queuehandler @@ -0,0 +1,1035 @@ +#!/bin/sh + +################################################################# +# # +# this scrip handles the queue which is generated from # +# the vdr-plugin vdrrip. # +# # +# usage: queuehandler queuefile tempdir # +# # +# # +# written by herbert attenberger # +# # +# 15.07.2003: 0.1.0: - initial version # +# 24.07.2003: 0.1.1: - added split function # +# 28.07.2003: 0.1.2: - added video codec "divx4/divx5" # +# 22.08.2003: 0.1.3: - added vdrecho function # +# 07.09.2003: 0.1.4: - added (preview) to the output filename # +# in preview mode # +# 15.09.2003: 0.1.5: - added -frames 0 to get -identify with # +# mplayer1.0pre1 working (thx to ronny) # +# 24.09.2003: 0.1.6: - added (optional) svdrpsend.pl in # +# function vdrecho # +# - added dvd-handling # +# 28.09.2003: 0.1.7: - added handling of postprocess-filters # +# - added rename function (thx to # +# memed@www.vdrportal.de) # +# - copy 001.vdr if a symbolic link couldn't # +# be created (for fat-partitions) # +# (thx to memed@www.vdrportal.de) # +# 30.09.2003: 0.1.8: - added -sws 2 to xvid/divx5 encoding # +# 25.11.2003: 0.1.9: - moved loop function to read_queue # +# - added lock, unlock and wait_unlock # +# functions # +# - moved encode.vdrrip to the plugins-dir # +# 14.12.2003: 0.2.0: - added check_exe function # +# 16.12.2003: 0.2.1: - removed mod_quant from xvid encoding # +# 20.12.2003: 0.2.2: - moved pp-filters to the last position # +# - added log_error function to output the # +# errors to the syslog & stderr # +# - added log_info function to output the # +# infos to the syslog & stdout # +# - added log_debug function to output the # +# debug-infos infos to the syslog & stdout # +# 10.01.2004: 0.2.4: - renamed check function to initialize # +# - added ogg-vorbis, ac3-handling # +# - added ogm, matroska-handling # +# - moved configuration to the file # +# queuehandler.sh.conf # +# - improved error-handling # +# - added execute function # +# - added trap-command & _trap-function # +# 18.01.2004: 0.2.5: - fixed a bug if scaling is off (thx to # +# cosmo@www.vdrportal.de) # +# 21.01.2004: 0.2.6: - added option $useropts # +# - completed dvd-handling # +# 13.02.2004: 0.2.7: - changed some if statements to elif # +# - changed preview-handling # +# 10.03.2004: 0.2.8: - added calc_steps function # +# - write status to encode.vdrrip # +# 22.03.2004: 0.2.9: - moved 2-pass logiles to $tempdir # +# 26.03.2004: 0.3.0: - added evecho function # +# - added $mencoder_ac3 & $mplayer_ac3 # +# - added $qh_ver & qh_conf_ver # +# # +################################################################# +qh_ver="0.3.2" + + +initialize () { +# +# make initial checks +# + + scriptname=`basename $0` + scriptdir=`dirname $0` + + cfgfile="$scriptname.conf" + + if [ -e "$scriptdir/$cfgfile" ] + then + . "$scriptdir/$cfgfile" + else + log_error "file $cfgfile not found in $scriptdir, aborting !" 1 + fi + + if [ "$1" -a "$2" ] + then + queuefile="$1" + tempdir="$2" + pluginsdir=`dirname "$queuefile"` + else + log_error "usage: $scriptname queuefile tempdir" 1 + fi + + mkdir -p "$tempdir" + if [ ! -d "$tempdir" ] + then + log_error "directory $tempdir doesn't exist, aborting !" 1 + fi + + if [ "$3" ]; then log_info "the option -preview isn't supported anymore"; fi + + local pids=`pgrep -d" " "$scriptname"` + local pid1=`echo "$pids" | cut -d" " -f1` + local pid2=`echo "$pids" | cut -d" " -f2` + + if [ "$pid1" != "$pid2" ] + then + log_error "$scriptname is already running with pid $pid1, aborting !" 2 + fi + + # now the 2-pass logfiles are created in $tempdir ;-) + # (because -passlogfile doesn't do its job for xvid) + cd "$tempdir" +} + + +read_queue () { +# +# wait for the queuefile and read the first line +# + + while [ ! -e "$queuefile" ] + do + echo + echo "waiting for queuefile $queuefile" + echo "sleeping $check seconds" + echo + sleep $check + done + + wait_unlock # wait until the queuefile is unlocked + lock # locks the queuefile + + local saveifs="$IFS" + IFS=";" + read dir name filesize filenumbers vcodec br_video min_q max_q \ + crop_w crop_h crop_x crop_y scale_w scale_h acodec br_audio audio_id \ + ppvalues rename container preview < "$queuefile" + IFS=$saveifs + + # there is an active encoding + echo "- reading queuefile..." > "$pluginsdir/encode.vdrrip" + + unlock # unlocks the queuefile + + # correct some data + name=`echo "$name" | sed "s/ /_/g"` + + local name_length=`echo "$name" | wc -c` + if [ $name_length -gt 20 ] + then + shortname=`echo "$name" | cut -c 1-17` + shortname="$shortname..." + else + shortname="$name" + fi + + if [ "$ppvalues" = "(null)" ]; then ppvalues=""; fi + + dvd=`echo "$dir" | grep "^dvd://"` + + if [ "$preview" = "1" ] + then + local mode="preview" + else + local mode="full" + fi + + log_info "### start encoding movie $shortname in $mode mode ###" + + log_debug "version of queuehandler: $qh_ver" + log_debug "version of queuehandler.conf: $qh_conf_ver" + log_debug "dir: $dir" + log_debug "name: $name" + log_debug "filesize: $filesize" + log_debug "filenumbers: $filenumbers" + log_debug "vcodec: $vcodec" + log_debug "br_video: $br_video" + log_debug "min_q: $min_q" + log_debug "max_q: $max_q" + log_debug "crop_w: $crop_w" + log_debug "crop_h: $crop_h" + log_debug "crop_x: $crop_x" + log_debug "crop_y: $crop_y" + log_debug "scale_w: $scale_w" + log_debug "scale_h: $scale_h" + log_debug "acodec: $acodec" + log_debug "br_audio: $br_audio" + log_debug "audio_id: $audio_id" + log_debug "ppvalues: $ppvalues" + log_debug "rename: $rename" + log_debug "container: $container" + log_debug "preview: $preview" +} + + +pre_check () { +# +# make some checks before the encoding +# + if [ "$error" ]; then return; fi + + # check mplayer/mencoder + if [ ! "$dvd" -a $audio_id -eq 128 ] + then + # encoding a vdr-recording with selected ac3-stream + check_exe "$mencoder_ac3" "mencoder_ac3=" + check_exe "$mplayer_ac3" "mplayer_ac3=" + mc=$mencoder_ac3 + mp=$mplayer_ac3 + else + check_exe "$mencoder" "mencoder=" + check_exe "$mplayer" "mplayer=" + mc=$mencoder + mp=$mplayer + fi + + # change the dvd-parameter to -dvd if the mencoder-version is 0.XX + if [ "$dvd" ] + then + local menc_ver=`$mc -v 2>/dev/null | grep "MEncoder" | sed "s/^MEncoder \(.\).*/\1/"` + if [ "$menc_ver" = "0" ] + then + dvd=`echo "$dvd" | sed "s/^dvd:\/\//-dvd /"` + fi + log_debug "dvd: $dvd" + fi + + # check needed tools + case "$container" in + "avi") + if [ "$acodec" = "ogg-vorbis" ] + then + log_error "ogg-vorbis isn't a valid audio-codec for a avi-container" + fi + ;; + "ogm") + check_exe "$projectx" "projectx=" + check_exe "$ogmmerge" "ogmmerge=" + + if [ "$acodec" = "lame" -o "$acodec" = "ogg-vorbis" ] + then + check_exe "$ffmpeg" "ffmpeg=" + fi + + if [ $filenumbers -gt 1 ] + then + check_exe "$ogmsplit" "ogmsplit=" + fi + ;; + "matroska") + check_exe "$projectx" "projectx=" + check_exe "$mkvmerge" "mkvmerge=" + + if [ "$acodec" = "lame" -o "$acodec" = "ogg-vorbis" ] + then + check_exe "$ffmpeg" "ffmpeg=" + fi + ;; + *) + log_error "unknown container $container" + ;; + esac +} + + +calc_steps () { +# +# calculate the nuber of encoding-steps +# + if [ "$error" ]; then return + elif [ "$preview" = "1" ] + then + if [ "$container" = "avi" ]; then steps="2" + else steps="3"; fi + return + fi + + steps="8" + + if [ "$filenumbers" = "1" ]; then steps=$((steps-1)); fi + + case "$container" in + "avi") + steps=$((steps-4)) + if [ "$dvd" ]; then steps=$((steps-1)) + elif [ ! -e "$dir/00002.ts" ]; then steps=$((steps-1)); fi + ;; + "ogm") + steps=$((steps-2)) + if [ "$acodec" = "copy" -a $audio_id -eq 128 ] + then + steps=$((steps-1)) + fi + ;; + "matroska") + steps=$((steps-2)) + if [ "$acodec" = "copy" ]; then steps=$((steps-1)); fi + ;; + *) + ;; + esac +} + + +preview () { +# +# get the preview values +# + if [ "$error" ]; then return + elif [ "$preview" != "1" ]; then return; fi + + name="$name(preview)" + shortname="$shortname(preview)" + + # start the preview in the middle of the movie + local length=`"$mp" -vo null -ao null -identify -frames 0 "$dir/00001.ts" 2>/dev/null | grep ID_LENGTH | cut -d"=" -f2` + local ss=$(($(echo $length | sed -e s/[.,].*//)/2)) + previewval="-ss $ss -endpos $previewlength" +} + + +prepare() { +# +# prepares the encoding-process +# + if [ "$error" ]; then return + elif [ "$dvd" ]; then return; fi + + # Recreate $tempdir if removed by vdr housekeeping + mkdir -p "$tempdir" + if [ ! -d "$tempdir" ]; then return; fi + cd "$tempdir" + + case "$container" in + "avi") + # join all vdr-files to $tempdir/temp.vdr + if [ -e "$dir/00002.ts" -a "$preview" != "1" ] + then + log_info "joining all vdr-files from directory $dir" + evecho "joining vdr-files" + nice -+19 cat $dir/[0-9][0-9][0-9][0-9][0-9].ts > "$tempdir/temp.vdr" + else + create_symbolic_link + fi + ;; + "ogm"|"matroska") + # demux vdr-recording with projectx + if [ "$preview" = "1" ] + then + create_symbolic_link + else + log_info "demuxing all vdr-files from directory $dir" + evecho "demuxing vdr-files" + execute "$projectx -demux $dir/0*.ts -out $tempdir" + # vdrsync 0.1.2.2 developer version creates bd.mpa + if [ -e "$tempdir/bd.mpa" ] + then + mv "$tempdir/bd.mpa" "$tempdir/bd.ac3" + fi + fi + ;; + *) + ;; + esac +} + + +create_symbolic_link() { +# +# creates a symbolic link of 00001.ts to $temdir/temp.vdr +# + if [ "$error" ]; then return + elif [ "$dvd" ]; then return; fi + + log_info "create a symbolic link from $dir/00001.ts to $tempdir/temp.vdr" + ln -s "$dir/00001.ts" "$tempdir/temp.vdr" + + if [ ! -e "$tempdir/temp.vdr" ] + then + log_info "could not create a symolic link" + log_info "try to copy $dir/00001.ts to $tempdir/temp.vdr" + execute "cp $dir/00001.ts $tempdir/temp.vdr" + fi +} + + +check_exe () { +# +# checks if $1 is a executable and exit the queuehandler with +# rc $3, if this one is set +# + if [ ! -x "$1" ] + then + if [ "$1" ]; then log_error "$1 isn't a executable"; fi + log_error "set a valid path for $2 in the file $scriptdir/$cfgfile." $3 + fi +} + + +encode () { +# +# encodes the movie +# + if [ "$error" ]; then return; fi + + # set mencoder audio values + case "$container" in + "avi") + case "$acodec" in + "lame") + if [ "$dvd" ] + then + local aopts="-oac mp3lame -lameopts br=$br_audio:abr:q=2:vol=8 -aid $audio_id" + else + local aopts="-oac mp3lame -lameopts br=$br_audio:abr:q=2 -aid $audio_id" + fi + ;; + "copy") + local aopts="-oac copy -aid $audio_id" + ;; + "ogg-vorbis") + # this shouldn't happen + ;; + *) + log_error "unknown audio codec $acodec" + ;; + esac + ;; + "ogm") + local aopts="-nosound" + case "$acodec" in + "lame"|"ogg-vorbis") + if [ "$dvd" ]; then dump_audio_mplayer; fi + encode_ffmpeg + ;; + "copy") + # convert mp2-files to ac3, because + # mp2 isn't supported by ogm + if [ "$dvd" ]; then dump_audio_mplayer; fi + if [ $audio_id -ge 129 ]; then encode_ffmpeg; fi + ;; + *) + log_error "unknown audio codec $acodec" + ;; + esac + ;; + "matroska") + local aopts="-nosound" + case "$acodec" in + "lame"|"ogg-vorbis") + if [ "$dvd" ]; then dump_audio_mplayer; fi + encode_ffmpeg + ;; + "copy") + if [ "$dvd" ]; then dump_audio_mplayer; fi + ;; + *) + log_error "unknown audio codec $acodec" + ;; + esac + ;; + *) + ;; + esac + + # set mencoder -vf values + if [ "$crop_w" = "-1" -a "$crop_h" = "-1" -a "$crop_x" = "-1" -a \ + "$crop_y" = "-1" -a "$scale_w" = "-1" -a "$scale_h" = "-1" ] + then + local vopopts="" + elif [ "$crop_w" = "-1" -a "$crop_h" = "-1" -a "$crop_x" = "-1" -a \ + "$crop_y" = "-1" ] + then + local vopopts="scale=$scale_w:$scale_h" + else + local vopopts="crop=$crop_w:$crop_h:$crop_x:$crop_y,scale=$scale_w:$scale_h" + fi + + if [ "$ppvalues" ] + then + local vopopts="-vf pp=$ppvalues,$vopopts" + elif [ "$vopopts" ] + then + local vopopts="-vf $vopopts" + fi + + # encode in two passes + for pass in 1 2 + do + if [ "$pass" = "1" ] + then + local ofile="-o /dev/null" + else + local ofile="-o $tempdir/$name.avi" + fi + + # set mencoder video values + case "$vcodec" in + "lavc") + local vopts="-ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=$br_video:vqmin=$min_q:vqmax=$max_q:vpass=$pass -sws 2" + ;; + "xvid") + local vopts="-ovc xvid -xvidencopts bitrate=$br_video:me_quality=6:pass=$pass -sws 2" + ;; + "divx4") + local vopts="-ovc divx4 -divx4opts br=$br_video:q=5:min_quant=$min_q:max_quant=$max_q:pass=$pass -sws 2" + ;; + *) + log_error "unknown video codec $vcodec" + ;; + esac + + # set mencoder input file + if [ "$dvd" ] + then + # dvd + local ifile="$dvd" + elif [ "$container" = "avi" -o "$preview" = "1" ] + then + # no dvd, avi container + local ifile="$tempdir/temp.vdr" + else + # no dvd, ogm/matroska container + + # search for the first video-file + local num=1 + while [ ! "$ifile" ] + do + if [ ! -e "$tempdir/0000$num.m2v" ] + then + log_info "video-file $tempdir/0000$num.m2v not found !" + if [ $num -ge 9 ] + then + log_error "no video-stream found ! $num" + # exit loop + local ifile="dummy" + fi + num=$((num+1)) + else + log_info "video-file $tempdir/0000$num.m2v found !" + local ifile="$tempdir/0000$num.m2v" + fi + done + fi + + if [ "$error" ]; then return; fi + + log_info "encoding movie $shortname (pass: $pass)" + + if [ "$aopts" = "-nosound" ] + then + local encstr="video" + else + local encstr="video & audio" + fi + + evecho "enc. $encstr ($pass. pass)" + if [ "$useropts" ]; then log_info "\$useropts are set to \"$useropts\""; fi + execute "$mc $ifile $ofile $useropts $vopts $vopopts $aopts $previewval" + done +} + + +dump_audio_mplayer() { +# +# dump audio-stream from dvd with mplayer +# + if [ "$error" ]; then return + elif [ "$preview" = "1" ]; then return + elif [ ! "$dvd" ]; then return; fi + + log_info "dumping audio-stream $audio_id from $dvd with $mp" + evecho "dumping audio-stream from dvd" + execute "$mp $dir -vo null -vc dummy -aid $audio_id -aop list=volnorm -dumpaudio -dumpfile $tempdir/bd.ac3" +} + + +encode_ffmpeg() { +# +# encode the audio-stream with ffmpeg +# + if [ "$error" ]; then return + elif [ "$preview" = "1" ]; then return; fi + + if [ $audio_id -eq 128 ] + then + local ifile="$tempdir/bd.ac3" + else + local ifile="$tempdir/00001.mp2" + local forceinput="-f mp3" + fi + + case "$acodec" in + "lame") + local filetype="mp3" + local filecodec="libmp3lame" + ;; + "ogg-vorbis") + local filetype="ogg" + local filecodec="libvorbis" + ;; + "copy") + log_info "ogm doesn't support mp2 audio-streams, i will convert it into ac3" + local filetype="ac3" + local filecodec="ac3" + ;; + *) + ;; + esac + + log_info "converting $ifile into $filetype-format" + evecho "conv. audio into $filetype-format" + execute "$ffmpeg -y $forceinput -i $ifile -ab ${br_audio}k -acodec $filecodec $tempdir/c$audio_id.$filetype" +} + + +merge_ogm_mkv() { + if [ "$error" ]; then return; fi + if [ "$container" != "ogm" -a "$container" != "matroska" ]; then return; fi + + + case "$container" in + "ogm") + local merge="$ogmmerge" + local filetype="ogm" + ;; + "matroska") + local merge="$mkvmerge" + local filetype="mkv" + ;; + *) + ;; + esac + + + if [ "$preview" != "1" ] + then + case "$acodec" in + "lame") + local afile="$tempdir/c$audio_id.mp3" + ;; + "ogg-vorbis") + local afile="$tempdir/c$audio_id.ogg" + ;; + "copy") + if [ $audio_id -eq 128 ] + then + # ac3 + local afile="$tempdir/bd.ac3" + elif [ "$container" = "ogm" ] + then + # mpg2, container ogm + local afile="$tempdir/c$audio_id.ac3" + else + # mpg2 + local afile="$tempdir/c$audio_id.mpa" + fi + ;; + *) + ;; + esac + fi + + log_info "merging movie $shortname into $filetype-container" + evecho "merging into $filetype-container" + execute "$merge -o $tempdir/$name.$filetype $tempdir/$name.avi $afile" +} + + +cleanup () { +# +# delete temp-files and reset variables +# + # temp. codec-files + rm -f "$tempdir/divx2pass.log" + rm -f "$tempdir/lavc_stats.txt" + rm -f "$tempdir/analyse.log" + rm -f "$tempdir/c:\\trace_b.txt" + rm -f "$tempdir/xvid-twopass.stats" + + # temp. movie-files + rm -f "$tempdir/temp.vdr" + if [ "$container" = "ogm" -o "$container" = "matroska" ] + then + rm -f "$tempdir/$name.avi" + fi + rm -f "$tempdir"/[0-9][0-9][0-9][0-9][0-9].m2v + rm -f "$tempdir"/[0-9][0-9][0-9][0-9][0-9].mp2 + rm -f "$tempdir"/c*.mp3 + rm -f "$tempdir"/c*.ogg + rm -f "$tempdir"/c*.ac3 + rm -f "$tempdir"/bd.ac3 + + # temp. queuehandler-files + rm -f "$pluginsdir/encode.vdrrip" + rm -f /tmp/queuehandler.err + + + # reset variables + dir="" + name="" + filesize="" + filenumbers="" + vcodec="" + br_video="" + min_q="" + max_q="" + crop_w="" + crop_h="" + crop_x="" + crop_y="" + scale_w="" + scale_h="" + acodec="" + br_audio="" + audio_id="" + ppvalues="" + rename="" + container="" + preview="" + + mc="" + mp="" + + dvd="" + previewval="" + error="" + + step="0" +} + + +del_queue () { +# +# delete first line from the queuefile +# + # waits until the queuefile is unlocked, and locks it + wait_unlock + lock + + if [ "$error" ] + then + head -n 1 "$queuefile" >> "$queuefile.rejected" + fi + + # delete first entry of the queuefile + local lines=`cat "$queuefile" | wc -l` + if [ "$lines" -le 1 ] + then + rm -f "$queuefile" + else + lines=$((lines-1)) + cp -a "$queuefile" /tmp/queuefile.tmp + tail -n $lines /tmp/queuefile.tmp > "$queuefile" + fi + + if [ "$error" ] + then + log_info "### moved movie $shortname to $queuefile.rejected ###" + else + log_info "### movie $shortname deleted from queuefile ###" + fi + + # unlock queuefile + unlock +} + + +split () { +# +# splits the encoded movie into $filenumbers pieces +# + if [ "$error" ]; then return + elif [ "$filenumbers" = "1" -o "$preview" = "1" ]; then return; fi + + log_info "splitting $shortname in $filenumbers pieces" + evecho "splitting movie" + + case "$container" in + "avi") + local overlap=3 + + local count=1 + local splitpos=0 + + # workaround to get the correct filesize from mencoder with -endpos + local splitsize=$((filesize*99/100)) + + log_info "splitting $shortname in $filenumbers pieces" + while [ $count -le $filenumbers ] + do + local ofile="$name-$count.avi" + + if [ $count -eq $filenumbers ] + then + local endpos="" + else + local endpos="-endpos ${splitsize}mb" + fi + + # split file + execute "$mc -ovc copy -oac copy $tempdir/$name.avi \ + -ss $splitpos $endpos -o $tempdir/$ofile" + + # detect length of splitted file and add it to $splitpos + local length=`$mplayer -vo null -ao null -identify -frames 0 $tempdir/$ofile 2>/dev/null | \ + grep ID_LENGTH | cut -d= -f2` + splitpos=$((splitpos+length-overlap)) + count=$((count+1)) + done + ;; + "ogm") + execute "$ogmsplit -s $filesize -n $filenumbers $tempdir/$name.ogm" + ;; + "matroska") + execute "$mkvmerge --split d${filesize}m --split-max-files \ + $filenumbers -o $tempdir/$ofile" + ;; + *) + ;; + esac +} + + +vdrecho () { +# +# echo $1 in the vdr-infobar (or console) +# + + if [ -x "$svdrpsend" ] + then + $svdrpsend -d "$vdrhostname" "MESG $1" 2>/dev/null 1>/dev/null + elif [ -x "$netcat" ] + then + echo "MESG $1" | $netcat -q 1 "$vdrhostname" 2001 2>/dev/null 1>/dev/null + else + log_info "$1" + fi +} + + +evecho () { +# +# echo $ in the file encode.vdrrip +# + step=$((step+1)) + local time=`date +"%k:%M h"` + echo "- step $step/$steps (since $time): $1" > "$pluginsdir/encode.vdrrip" +} + + +log_error () { +# +# echo $1 on stderr and write it to the syslog with priority user.error +# + logger -s -p user.error -t [vdrrip-qh] "$1" + + if [ "$2" ] + then + vdrecho "$1" + exit "$2" + else + error="1" + fi +} + + +log_info () { +# +# echo $1 on stdout and write it to the syslog with priority user.info +# + logger -s -p user.info -t [vdrrip-qh] "$1" 2>&1 +} + + +log_debug () { +# +# echo $1 on stdout and write it to the syslog with priority user.debug +# + if [ "$debug" = "1" ] + then + logger -s -p user.debug -t [vdrrip-qh] "$1" + fi +} + + +execute () { +# +# executes $1 and checks the rc +# + local cmd="$1" + + log_debug "execute command: $cmd" + + # execute $cmd and save the return-code: + if [ "$stdout" = "1" ] + then + nice -+19 $cmd 2>/tmp/queuehandler.err + local rc="$?" + else + nice -+19 $cmd 1>/dev/null 2>/tmp/queuehandler.err + local rc="$?" + fi + + if [ "$rc" != "0" ] + then + # display stderr if the return-code isn't 0 + log_error "an error occured (rc $rc) while processing the command: $cmd" + local err_message=`cat /tmp/queuehandler.err 2>/dev/null` + if [ "$err_message" ] + then + log_error "error message: $err_message" + fi + elif [ "$debug" = "1" ] + then + # display stderr if the debug-mode is set + local dbg_message=`cat /tmp/queuehandler.err 2>/dev/null` + if [ "$dbg_message" ] + then + log_debug "debug message: $dbg_message" + fi + fi +} + + +rename () { +# +# renames the vdr recording to indicate it was encoded properly +# this function is written by memed@www.vdrportal.de +# + if [ "$error" ]; then return + elif [ "$dvd" ]; then return + elif [ "$preview" = "1" ]; then return + elif [ "$rename" = "0" ]; then return; fi + + new_dir="$(dirname $dir)${append_string}" + mkdir -p "$new_dir" + #move finished subdir to new folder + mv "$dir" "$new_dir" + #if all subdirs are empty, also delete dir one up + [ $(find $(dirname $dir) -type f|wc -l) -eq 0 ] && rm -rf $(dirname $dir) +} + + +wait_unlock () { +# +# wait until the queuefile is unlocked +# + local lockstat + read lockstat 2>/dev/null < "$pluginsdir/lock.vdrrip" + + while [ -e "$pluginsdir/lock.vdrrip" -a "$lockstat" != "1" ] + do + echo + echo "queuefile is locked !" + echo "sleeping $lock seconds" + echo + sleep $lock + done +} + + +lock () { +# +# locks the queuefile +# + local lockfile="$pluginsdir/lock.vdrrip" + echo 1 > $lockfile 2>/dev/null + + if [ ! -e "$lockfile" ] + then + log_error "couldn't write to $lockfile" 1 + fi +} + + +unlock () { +# +# unlocks the queuefile +# + rm -f $pluginsdir/lock.vdrrip + + if [ -e "$lockfile" ] + then + log_error "couldn't delete $lockfile" 1 + fi +} + +_trap () { +# +# this function is called if the queuehandler is killed +# + if [ "$debug" = "0" ]; then cleanup; fi + log_error "queuehandler was killed !" + vdrecho "queuehandler was killed !" +} + + +# +# this is the main part +# + +trap "_trap; exit" 2 9 15 + +initialize "$1" "$2" "$3" # make initial checks +cleanup # delete old temp-files + +while [ true ] +do + read_queue # read the first line from the queuefile + pre_check # make some checks before the encoding + calc_steps # calc the number of encoding-steps + preview # get the preview values + prepare # prepares the encoding + encode # encodes the movie + merge_ogm_mkv # merge ogm/mkv-files + split # splits the encoded movie + + if [ ! "$error" ] + then + mess="movie $shortname encoded" + log_info "$mess" + vdrecho "$mess" + else + mess="couldn't encode movie $shortname" + log_info "$mess" + vdrecho "$mess" + fi + + rename # rename dir-name of the vdr-recording + del_queue # delete first line from the queuefile + cleanup # delete temp-files +done diff --git a/scripts/queuehandler.conf b/scripts/queuehandler.conf new file mode 100755 index 0000000..34a89de --- /dev/null +++ b/scripts/queuehandler.conf @@ -0,0 +1,72 @@ +# +# queuehandler.conf: +# this is the configuration-file of queuehandler +# + qh_conf_ver="0.3.2" + + # set this to 1 to get debug-informations in the syslog and + # exit-messages of the queuehandler on the osd: + debug=0 + + # set this to 1 to see stdout while the queuehandler is executing an + # external programm + stdout=0 + + # resulting length (in seconds) of movies if the queuehandler is + # started in the preview-mode + previewlength=60 + + # check for new entries in queuefile (in seconds) + check=30 + + # check for unlocked queuefile (in seconds) + lock=5 + + + + # if you have set the setup-option "rename after encodings" + # to yes, this string will be appended to the recording-name + # after the movie is encoded. + append_string="_-_CONVERTED" + + + + # this pathes are used for the encoding of vdr-recordings & dvd's. + # they _must_ point to an unpatched mencoder & mplayer + mencoder="/usr/bin/mencoder" + mplayer="/usr/bin/mplayer" + + # this pathes are only used for encoding a vdr-recording with + # selected ac3-stream. + # they _must_ point to an ac3-patched mencoder & mplayer. + # if you don't use this feature you should deactivate the option + # AC3 Support (MPlayer-patch inst.) in the plugins setup-menu. + mencoder_ac3="/usr/local/bin/mencoder_ac3" + mplayer_ac3="/usr/local/bin/mplayer_ac3" + + + # this string is added to the mencoder-command in the + # queuehandler + useropts="" + + + + # optional tools (only needed for ogm/matroska-container) + vdrsync="/usr/bin/vdrsync.pl" + projectx="/usr/bin/projectx" + ffmpeg="/usr/bin/ffmpeg" + ogmmerge="/usr/bin/ogmmerge" + ogmsplit="/usr/bin/ogmsplit" + mkvmerge="/usr/bin/mkvmerge" + + + + # This (optional) command is used to display some informations + # from the queuehandler on your tv. + # You have to specify only $svdrpsend or $netcat. + # $netcat is only recommend, if perl isn't installed. + svdrpsend="/usr/lib/vdr/svdrpsend.pl" + #netcat="" + + vdrhostname="localhost" + diff --git a/scripts/queuehandler.sh b/scripts/queuehandler.sh deleted file mode 100755 index c592bd8..0000000 --- a/scripts/queuehandler.sh +++ /dev/null @@ -1,1034 +0,0 @@ -#!/bin/sh - -################################################################# -# # -# this scrip handles the queue which is generated from # -# the vdr-plugin vdrrip. # -# # -# usage: queuehandler.sh queuefile tempdir # -# # -# # -# written by herbert attenberger # -# # -# 15.07.2003: 0.1.0: - initial version # -# 24.07.2003: 0.1.1: - added split function # -# 28.07.2003: 0.1.2: - added video codec "divx4/divx5" # -# 22.08.2003: 0.1.3: - added vdrecho function # -# 07.09.2003: 0.1.4: - added (preview) to the output filename # -# in preview mode # -# 15.09.2003: 0.1.5: - added -frames 0 to get -identify with # -# mplayer1.0pre1 working (thx to ronny) # -# 24.09.2003: 0.1.6: - added (optional) svdrpsend.pl in # -# function vdrecho # -# - added dvd-handling # -# 28.09.2003: 0.1.7: - added handling of postprocess-filters # -# - added rename function (thx to # -# memed@www.vdrportal.de) # -# - copy 001.vdr if a symbolic link couldn't # -# be created (for fat-partitions) # -# (thx to memed@www.vdrportal.de) # -# 30.09.2003: 0.1.8: - added -sws 2 to xvid/divx5 encoding # -# 25.11.2003: 0.1.9: - moved loop function to read_queue # -# - added lock, unlock and wait_unlock # -# functions # -# - moved encode.vdrrip to the plugins-dir # -# 14.12.2003: 0.2.0: - added check_exe function # -# 16.12.2003: 0.2.1: - removed mod_quant from xvid encoding # -# 20.12.2003: 0.2.2: - moved pp-filters to the last position # -# - added log_error function to output the # -# errors to the syslog & stderr # -# - added log_info function to output the # -# infos to the syslog & stdout # -# - added log_debug function to output the # -# debug-infos infos to the syslog & stdout # -# 10.01.2004: 0.2.4: - renamed check function to initialize # -# - added ogg-vorbis, ac3-handling # -# - added ogm, matroska-handling # -# - moved configuration to the file # -# queuehandler.sh.conf # -# - improved error-handling # -# - added execute function # -# - added trap-command & _trap-function # -# 18.01.2004: 0.2.5: - fixed a bug if scaling is off (thx to # -# cosmo@www.vdrportal.de) # -# 21.01.2004: 0.2.6: - added option $useropts # -# - completed dvd-handling # -# 13.02.2004: 0.2.7: - changed some if statements to elif # -# - changed preview-handling # -# 10.03.2004: 0.2.8: - added calc_steps function # -# - write status to encode.vdrrip # -# 22.03.2004: 0.2.9: - moved 2-pass logiles to $tempdir # -# 26.03.2004: 0.3.0: - added evecho function # -# - added $mencoder_ac3 & $mplayer_ac3 # -# - added $qh_ver & qh_conf_ver # -# # -################################################################# -qh_ver="0.3.0" - - -function initialize () { -# -# make initial checks -# - - scriptname=`basename $0` - scriptdir=`dirname $0` - - cfgfile="$scriptname.conf" - - if [ -e "$scriptdir/$cfgfile" ] - then - source "$scriptdir/$cfgfile" - else - log_error "file $cfgfile not found in $scriptdir, aborting !" 1 - fi - - if [ "$1" -a "$2" ] - then - queuefile="$1" - tempdir="$2" - pluginsdir=`dirname "$queuefile"` - else - log_error "usage: $scriptname queuefile tempdir" 1 - fi - - mkdir -p "$tempdir" - if [ ! -d "$tempdir" ] - then - log_error "directory $tempdir doesn't exist, aborting !" 1 - fi - - if [ "$3" ]; then log_info "the option -preview isn't supported anymore"; fi - - local pids=`pgrep -d" " "$scriptname"` - local pid1=`echo "$pids" | cut -d" " -f1` - local pid2=`echo "$pids" | cut -d" " -f2` - - if [ "$pid1" != "$pid2" ] - then - log_error "$scriptname is already running with pid $pid1, aborting !" 2 - fi - - # now the 2-pass logfiles are created in $tempdir ;-) - # (because -passlogfile doesn't do its job for xvid) - cd "$tempdir" -} - - -function read_queue () { -# -# wait for the queuefile and read the first line -# - - while [ ! -e "$queuefile" ] - do - echo - echo "waiting for queuefile $queuefile" - echo "sleeping $check seconds" - echo - sleep $check - done - - wait_unlock # wait until the queuefile is unlocked - lock # locks the queuefile - - local saveifs="$IFS" - IFS=";" - read dir name filesize filenumbers vcodec br_video min_q max_q \ - crop_w crop_h crop_x crop_y scale_w scale_h acodec br_audio audio_id \ - ppvalues rename container preview < "$queuefile" - IFS=$saveifs - - # there is an active encoding - echo "- reading queuefile..." > "$pluginsdir/encode.vdrrip" - - unlock # unlocks the queuefile - - # correct some data - name=`echo "$name" | sed "s/ /_/g"` - - local name_length=`echo "$name" | wc -c` - if [ $name_length -gt 20 ] - then - shortname=`echo "$name" | cut -c 1-17` - shortname="$shortname..." - else - shortname="$name" - fi - - if [ "$ppvalues" = "(null)" ]; then ppvalues=""; fi - - dvd=`echo "$dir" | grep "^dvd://"` - - if [ "$preview" = "1" ] - then - local mode="preview" - else - local mode="full" - fi - - log_info "### start encoding movie $shortname in $mode mode ###" - - log_debug "version of queuehandler.sh: $qh_ver" - log_debug "version of queuehandler.sh.conf: $qh_conf_ver" - log_debug "dir: $dir" - log_debug "name: $name" - log_debug "filesize: $filesize" - log_debug "filenumbers: $filenumbers" - log_debug "vcodec: $vcodec" - log_debug "br_video: $br_video" - log_debug "min_q: $min_q" - log_debug "max_q: $max_q" - log_debug "crop_w: $crop_w" - log_debug "crop_h: $crop_h" - log_debug "crop_x: $crop_x" - log_debug "crop_y: $crop_y" - log_debug "scale_w: $scale_w" - log_debug "scale_h: $scale_h" - log_debug "acodec: $acodec" - log_debug "br_audio: $br_audio" - log_debug "audio_id: $audio_id" - log_debug "ppvalues: $ppvalues" - log_debug "rename: $rename" - log_debug "container: $container" - log_debug "preview: $preview" -} - - -function pre_check () { -# -# make some checks before the encoding -# - if [ "$error" ]; then return; fi - - # check mplayer/mencoder - if [ ! "$dvd" -a $audio_id -ge 128 ] - then - # encoding a vdr-recording with selected ac3-stream - check_exe "$mencoder_ac3" "mencoder_ac3=" - check_exe "$mplayer_ac3" "mplayer_ac3=" - mc=$mencoder_ac3 - mp=$mplayer_ac3 - else - check_exe "$mencoder" "mencoder=" - check_exe "$mplayer" "mplayer=" - mc=$mencoder - mp=$mplayer - fi - - # change the dvd-parameter to -dvd if the mencoder-version is 0.XX - if [ "$dvd" ] - then - local menc_ver=`$mc -v 2>/dev/null | grep "MEncoder" | sed "s/^MEncoder \(.\).*/\1/"` - if [ "$menc_ver" = "0" ] - then - dvd=`echo "$dvd" | sed "s/^dvd:\/\//-dvd /"` - fi - log_debug "dvd: $dvd" - fi - - # check needed tools - case "$container" in - "avi") - if [ "$acodec" = "ogg-vorbis" ] - then - log_error "ogg-vorbis isn't a valid audio-codec for a avi-container" - fi - ;; - "ogm") - check_exe "$vdrsync" "vdrsync=" - check_exe "$ogmmerge" "ogmmerge=" - - if [ "$acodec" = "lame" -o "$acodec" = "ogg-vorbis" ] - then - check_exe "$ffmpeg" "ffmpeg=" - fi - - if [ $filenumbers -gt 1 ] - then - check_exe "$ogmsplit" "ogmsplit=" - fi - ;; - "matroska") - check_exe "$vdrsync" "vdrsync=" - check_exe "$mkvmerge" "mkvmerge=" - - if [ "$acodec" = "lame" -o "$acodec" = "ogg-vorbis" ] - then - check_exe "$ffmpeg" "ffmpeg=" - fi - ;; - *) - log_error "unknown container $container" - ;; - esac -} - - -function calc_steps () { -# -# calculate the nuber of encoding-steps -# - if [ "$error" ]; then return - elif [ "$preview" = "1" ] - then - if [ "$container" = "avi" ]; then steps="2" - else steps="3"; fi - return - fi - - steps="8" - - if [ "$filenumbers" = "1" ]; then let steps=steps-1; fi - - case "$container" in - "avi") - let steps=steps-4 - if [ "$dvd" ]; then let steps=steps-1 - elif [ ! -e "$dir/002.vdr" ]; then let steps=steps-1; fi - ;; - "ogm") - let steps=steps-2 - if [ "$acodec" = "copy" -a $audio_id -ge 128 ] - then - let steps=steps-1 - fi - ;; - "matroska") - let steps=steps-2 - if [ "$acodec" = "copy" ]; then let steps=steps-1; fi - ;; - *) - ;; - esac -} - - -function preview () { -# -# get the preview values -# - if [ "$error" ]; then return - elif [ "$preview" != "1" ]; then return; fi - - name="$name(preview)" - shortname="$shortname(preview)" - - # start the preview in the middle of the movie - local length=`"$mp" -vo null -ao null -identify -frames 0 "$dir/001.vdr" 2>/dev/null | grep ID_LENGTH | cut -d"=" -f2` - let local ss=$(echo $length | sed -e s/[.,].*//)/2 - previewval="-ss $ss -endpos $previewlength" -} - - -function prepare() { -# -# prepares the encoding-process -# - if [ "$error" ]; then return - elif [ "$dvd" ]; then return; fi - - # Recreate $tempdir if removed by vdr housekeeping - mkdir -p "$tempdir" - if [ ! -d "$tempdir" ]; then return; fi - cd "$tempdir" - - case "$container" in - "avi") - # join all vdr-files to $tempdir/temp.vdr - if [ -e "$dir/002.vdr" -a "$preview" != "1" ] - then - log_info "joining all vdr-files from directory $dir" - evecho "joining vdr-files" - nice -+19 cat $dir/[0-9][0-9][0-9].vdr > "$tempdir/temp.vdr" - else - create_symbolic_link - fi - ;; - "ogm"|"matroska") - # demux vdr-recording with vdrsync - if [ "$preview" = "1" ] - then - create_symbolic_link - else - log_info "demuxing all vdr-files from directory $dir" - evecho "demuxing vdr-files" - execute "$vdrsync $dir -o $tempdir" - # vdrsync 0.1.2.2 developer version creates bd.mpa - if [ -e "$tempdir/bd.mpa" ] - then - mv "$tempdir/bd.mpa" "$tempdir/bd.ac3" - fi - fi - ;; - *) - ;; - esac -} - - -function create_symbolic_link() { -# -# creates a symbolic link of 001.vdr to $temdir/temp.vdr -# - if [ "$error" ]; then return - elif [ "$dvd" ]; then return; fi - - log_info "create a symbolic link from $dir/001.vdr to $tempdir/temp.vdr" - ln -s "$dir/001.vdr" "$tempdir/temp.vdr" - - if [ ! -e "$tempdir/temp.vdr" ] - then - log_info "could not create a symolic link" - log_info "try to copy $dir/001.vdr to $tempdir/temp.vdr" - execute "cp $dir/001.vdr $tempdir/temp.vdr" - fi -} - - -function check_exe () { -# -# checks if $1 is a executable and exit the queuehandler with -# rc $3, if this one is set -# - if [ ! -x "$1" ] - then - if [ "$1" ]; then log_error "$1 isn't a executable"; fi - log_error "set a valid path for $2 in the file $scriptdir/$cfgfile." $3 - fi -} - - -function encode () { -# -# encodes the movie -# - if [ "$error" ]; then return; fi - - # set mencoder audio values - case "$container" in - "avi") - case "$acodec" in - "lame") - if [ "$dvd" ] - then - local aopts="-oac mp3lame -lameopts br=$br_audio:abr:q=2:vol=8 -aid $audio_id" - else - local aopts="-oac mp3lame -lameopts br=$br_audio:abr:q=2 -aid $audio_id" - fi - ;; - "copy") - local aopts="-oac copy -aid $audio_id" - ;; - "ogg-vorbis") - # this shouldn't happen - ;; - *) - log_error "unknown audio codec $acodec" - ;; - esac - ;; - "ogm") - local aopts="-nosound" - case "$acodec" in - "lame"|"ogg-vorbis") - if [ "$dvd" ]; then dump_audio_mplayer; fi - encode_ffmpeg - ;; - "copy") - # convert mp2-files to ac3, because - # mp2 isn't supported by ogm - if [ "$dvd" ]; then dump_audio_mplayer; fi - if [ $audio_id -lt 128 ]; then encode_ffmpeg; fi - ;; - *) - log_error "unknown audio codec $acodec" - ;; - esac - ;; - "matroska") - local aopts="-nosound" - case "$acodec" in - "lame"|"ogg-vorbis") - if [ "$dvd" ]; then dump_audio_mplayer; fi - encode_ffmpeg - ;; - "copy") - if [ "$dvd" ]; then dump_audio_mplayer; fi - ;; - *) - log_error "unknown audio codec $acodec" - ;; - esac - ;; - *) - ;; - esac - - # set mencoder -vf values - if [ "$crop_w" = "-1" -a "$crop_h" = "-1" -a "$crop_x" = "-1" -a \ - "$crop_y" = "-1" -a "$scale_w" = "-1" -a "$scale_h" = "-1" ] - then - local vopopts="" - elif [ "$crop_w" = "-1" -a "$crop_h" = "-1" -a "$crop_x" = "-1" -a \ - "$crop_y" = "-1" ] - then - local vopopts="scale=$scale_w:$scale_h" - else - local vopopts="crop=$crop_w:$crop_h:$crop_x:$crop_y,scale=$scale_w:$scale_h" - fi - - if [ "$ppvalues" ] - then - local vopopts="-vf pp=$ppvalues,$vopopts" - elif [ "$vopopts" ] - then - local vopopts="-vf $vopopts" - fi - - # encode in two passes - for pass in 1 2 - do - if [ "$pass" = "1" ] - then - local ofile="-o /dev/null" - else - local ofile="-o $tempdir/$name.avi" - fi - - # set mencoder video values - case "$vcodec" in - "lavc") - local vopts="-ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=$br_video:vqmin=$min_q:vqmax=$max_q:vpass=$pass -sws 2" - ;; - "xvid") - local vopts="-ovc xvid -xvidencopts bitrate=$br_video:me_quality=6:pass=$pass -sws 2" - ;; - "divx4") - local vopts="-ovc divx4 -divx4opts br=$br_video:q=5:min_quant=$min_q:max_quant=$max_q:pass=$pass -sws 2" - ;; - *) - log_error "unknown video codec $vcodec" - ;; - esac - - # set mencoder input file - if [ "$dvd" ] - then - # dvd - local ifile="$dvd" - elif [ "$container" = "avi" -o "$preview" = "1" ] - then - # no dvd, avi container - local ifile="$tempdir/temp.vdr" - else - # no dvd, ogm/matroska container - - # search for the first video-file - local num=0 - while [ ! "$ifile" ] - do - if [ ! -e "$tempdir/e$num.mpv" ] - then - log_info "video-file $tempdir/e$num.mpv not found !" - if [ $num -ge 9 ] - then - log_error "no video-stream found !" - # exit loop - local ifile="dummy" - fi - let num=num+1 - else - log_info "video-file $tempdir/e$num.mpv found !" - local ifile="$tempdir/e$num.mpv" - fi - done - fi - - if [ "$error" ]; then return; fi - - log_info "encoding movie $shortname (pass: $pass)" - - if [ "$aopts" = "-nosound" ] - then - local encstr="video" - else - local encstr="video & audio" - fi - - evecho "enc. $encstr ($pass. pass)" - if [ "$useropts" ]; then log_info "\$useropts are set to \"$useropts\""; fi - execute "$mc $ifile $ofile $useropts $vopts $vopopts $aopts $previewval" - done -} - - -function dump_audio_mplayer() { -# -# dump audio-stream from dvd with mplayer -# - if [ "$error" ]; then return - elif [ "$preview" = "1" ]; then return - elif [ ! "$dvd" ]; then return; fi - - log_info "dumping audio-stream $audio_id from $dvd with $mp" - evecho "dumping audio-stream from dvd" - execute "$mp $dir -vo null -vc dummy -aid $audio_id -aop list=volnorm -dumpaudio -dumpfile $tempdir/bd.ac3" -} - - -function encode_ffmpeg() { -# -# encode the audio-stream with ffmpeg -# - if [ "$error" ]; then return - elif [ "$preview" = "1" ]; then return; fi - - if [ $audio_id -ge 128 ] - then - local ifile="$tempdir/bd.ac3" - else - local ifile="$tempdir/c$audio_id.mpa" - local forceinput="-f mp3" - fi - - case "$acodec" in - "lame") - local filetype="mp3" - ;; - "ogg-vorbis") - local filetype="ogg" - ;; - "copy") - log_info "ogm doesn't support mp2 audio-streams, i will convert it into ac3" - local filetype="ac3" - ;; - *) - ;; - esac - - log_info "converting $ifile into $filetype-format" - evecho "conv. audio into $filetype-format" - execute "$ffmpeg -hq -y $forceinput -i $ifile -ab $br_audio $tempdir/c$audio_id.$filetype" -} - - -function merge_ogm_mkv() { - if [ "$error" ]; then return; fi - if [ "$container" != "ogm" -a "$container" != "matroska" ]; then return; fi - - - case "$container" in - "ogm") - local merge="$ogmmerge" - local filetype="ogm" - ;; - "matroska") - local merge="$mkvmerge" - local filetype="mkv" - ;; - *) - ;; - esac - - - if [ "$preview" != "1" ] - then - case "$acodec" in - "lame") - local afile="$tempdir/c$audio_id.mp3" - ;; - "ogg-vorbis") - local afile="$tempdir/c$audio_id.ogg" - ;; - "copy") - if [ $audio_id -ge 128 ] - then - # ac3 - local afile="$tempdir/bd.ac3" - elif [ "$container" = "ogm" ] - then - # mpg2, container ogm - local afile="$tempdir/c$audio_id.ac3" - else - # mpg2 - local afile="$tempdir/c$audio_id.mpa" - fi - ;; - *) - ;; - esac - fi - - log_info "merging movie $shortname into $filetype-container" - evecho "merging into $filetype-container" - execute "$merge -o $tempdir/$name.$filetype $tempdir/$name.avi $afile" -} - - -function cleanup () { -# -# delete temp-files and reset variables -# - # temp. codec-files - rm -f "$tempdir/divx2pass.log" - rm -f "$tempdir/lavc_stats.txt" - rm -f "$tempdir/analyse.log" - rm -f "$tempdir/c:\\trace_b.txt" - rm -f "$tempdir/xvid-twopass.stats" - - # temp. movie-files - rm -f "$tempdir/temp.vdr" - if [ "$container" = "ogm" -o "$container" = "matroska" ] - then - rm -f "$tempdir/$name.avi" - fi - rm -f "$tempdir"/e[0-9].mpv - rm -f "$tempdir"/c[0-9].mpa - rm -f "$tempdir"/c[0-9].mp3 - rm -f "$tempdir"/c[0-9].ogg - rm -f "$tempdir"/c[0-9].ac3 - rm -f "$tempdir"/c[0-9][0-9][0-9].mp3 - rm -f "$tempdir"/c[0-9][0-9][0-9].ogg - rm -f "$tempdir"/bd.ac3 - - # temp. queuehandler-files - rm -f "$pluginsdir/encode.vdrrip" - rm -f /tmp/queuehandler.err - - - # reset variables - dir="" - name="" - filesize="" - filenumbers="" - vcodec="" - br_video="" - min_q="" - max_q="" - crop_w="" - crop_h="" - crop_x="" - crop_y="" - scale_w="" - scale_h="" - acodec="" - br_audio="" - audio_id="" - ppvalues="" - rename="" - container="" - preview="" - - mc="" - mp="" - - dvd="" - previewval="" - error="" - - step="0" -} - - -function del_queue () { -# -# delete first line from the queuefile -# - # waits until the queuefile is unlocked, and locks it - wait_unlock - lock - - if [ "$error" ] - then - head -n 1 "$queuefile" >> "$queuefile.rejected" - fi - - # delete first entry of the queuefile - local lines=`cat "$queuefile" | wc -l` - if [ "$lines" -le 1 ] - then - rm -f "$queuefile" - else - let lines=lines-1 - cp -a "$queuefile" /tmp/queuefile.tmp - tail -n $lines /tmp/queuefile.tmp > "$queuefile" - fi - - if [ "$error" ] - then - log_info "### moved movie $shortname to $queuefile.rejected ###" - else - log_info "### movie $shortname deleted from queuefile ###" - fi - - # unlock queuefile - unlock -} - - -function split () { -# -# splits the encoded movie into $filenumbers pieces -# - if [ "$error" ]; then return - elif [ "$filenumbers" = "1" -o "$preview" = "1" ]; then return; fi - - log_info "splitting $shortname in $filenumbers pieces" - evecho "splitting movie" - - case "$container" in - "avi") - local overlap=3 - - local count=1 - local splitpos=0 - - # workaround to get the correct filesize from mencoder with -endpos - let local splitsize=filesize*99/100 - - log_info "splitting $shortname in $filenumbers pieces" - while [ $count -le $filenumbers ] - do - local ofile="$name-$count.avi" - - if [ $count -eq $filenumbers ] - then - local endpos="" - else - local endpos="-endpos ${splitsize}mb" - fi - - # split file - execute "$mc -ovc copy -oac copy $tempdir/$name.avi \ - -ss $splitpos $endpos -o $tempdir/$ofile" - - # detect length of splitted file and add it to $splitpos - local length=`$mplayer -vo null -ao null -identify -frames 0 $tempdir/$ofile 2>/dev/null | \ - grep ID_LENGTH | cut -d= -f2` - let splitpos=splitpos+length-overlap - let count=count+1 - done - ;; - "ogm") - execute "$ogmsplit -s $filesize -n $filenumbers $tempdir/$name.ogm" - ;; - "matroska") - execute "$mkvmerge --split d${filesize}m --split-max-files \ - $filenumbers -o $tempdir/$ofile" - ;; - *) - ;; - esac -} - - -function vdrecho () { -# -# echo $1 in the vdr-infobar (or console) -# - - if [ -x "$svdrpsend" ] - then - $svdrpsend -d "$vdrhostname" "MESG $1" 2>/dev/null 1>/dev/null - elif [ -x "$netcat" ] - then - echo "MESG $1" | $netcat -q 1 "$vdrhostname" 2001 2>/dev/null 1>/dev/null - else - log_info "$1" - fi -} - - -function evecho () { -# -# echo $ in the file encode.vdrrip -# - let step=step+1 - local time=`date +"%k:%M h"` - echo "- step $step/$steps (since $time): $1" > "$pluginsdir/encode.vdrrip" -} - - -function log_error () { -# -# echo $1 on stderr and write it to the syslog with priority user.error -# - logger -s -p user.error -t [vdrrip-qh] "$1" - - if [ "$2" ] - then - vdrecho "$1" - exit "$2" - else - error="1" - fi -} - - -function log_info () { -# -# echo $1 on stdout and write it to the syslog with priority user.info -# - logger -s -p user.info -t [vdrrip-qh] "$1" 2>&1 -} - - -function log_debug () { -# -# echo $1 on stdout and write it to the syslog with priority user.debug -# - if [ "$debug" = "1" ] - then - logger -s -p user.debug -t [vdrrip-qh] "$1" - fi -} - - -function execute () { -# -# executes $1 and checks the rc -# - local cmd="$1" - - log_debug "execute command: $cmd" - - # execute $cmd and save the return-code: - if [ "$stdout" = "1" ] - then - nice -+19 $cmd 2>/tmp/queuehandler.err - local rc="$?" - else - nice -+19 $cmd 1>/dev/null 2>/tmp/queuehandler.err - local rc="$?" - fi - - if [ "$rc" != "0" ] - then - # display stderr if the return-code isn't 0 - log_error "an error occured (rc $rc) while processing the command: $cmd" - local err_message=`cat /tmp/queuehandler.err 2>/dev/null` - if [ "$err_message" ] - then - log_error "error message: $err_message" - fi - elif [ "$debug" = "1" ] - then - # display stderr if the debug-mode is set - local dbg_message=`cat /tmp/queuehandler.err 2>/dev/null` - if [ "$dbg_message" ] - then - log_debug "debug message: $dbg_message" - fi - fi -} - - -function rename () { -# -# renames the vdr recording to indicate it was encoded properly -# this function is written by memed@www.vdrportal.de -# - if [ "$error" ]; then return - elif [ "$dvd" ]; then return - elif [ "$preview" = "1" ]; then return - elif [ "$rename" = "0" ]; then return; fi - - new_dir="$(dirname $dir)${append_string}" - mkdir -p "$new_dir" - #move finished subdir to new folder - mv "$dir" "$new_dir" - #if all subdirs are empty, also delete dir one up - [ $(find $(dirname $dir) -type f|wc -l) -eq 0 ] && rm -rf $(dirname $dir) -} - - -function wait_unlock () { -# -# wait until the queuefile is unlocked -# - local lockstat - read lockstat 2>/dev/null < "$pluginsdir/lock.vdrrip" - - while [ -e "$pluginsdir/lock.vdrrip" -a "$lockstat" != "1" ] - do - echo - echo "queuefile is locked !" - echo "sleeping $lock seconds" - echo - sleep $lock - done -} - - -function lock () { -# -# locks the queuefile -# - local lockfile="$pluginsdir/lock.vdrrip" - echo 1 > $lockfile 2>/dev/null - - if [ ! -e "$lockfile" ] - then - log_error "couldn't write to $lockfile" 1 - fi -} - - -function unlock () { -# -# unlocks the queuefile -# - rm -f $pluginsdir/lock.vdrrip - - if [ -e "$lockfile" ] - then - log_error "couldn't delete $lockfile" 1 - fi -} - -function _trap () { -# -# this function is called if the queuehandler is killed -# - if [ "$debug" = "0" ]; then cleanup; fi - log_error "queuehandler was killed !" - vdrecho "queuehandler was killed !" -} - - -# -# this is the main part -# - -trap "_trap; exit" 2 9 15 - -initialize "$1" "$2" "$3" # make initial checks -cleanup # delete old temp-files - -while [ true ] -do - read_queue # read the first line from the queuefile - pre_check # make some checks before the encoding - calc_steps # calc the number of encoding-steps - preview # get the preview values - prepare # prepares the encoding - encode # encodes the movie - merge_ogm_mkv # merge ogm/mkv-files - split # splits the encoded movie - - if [ ! "$error" ] - then - mess="movie $shortname encoded" - log_info "$mess" - vdrecho "$mess" - else - mess="couldn't encode movie $shortname" - log_info "$mess" - vdrecho "$mess" - fi - - rename # rename dir-name of the vdr-recording - del_queue # delete first line from the queuefile - cleanup # delete temp-files -done diff --git a/scripts/queuehandler.sh.conf b/scripts/queuehandler.sh.conf deleted file mode 100755 index 5b01813..0000000 --- a/scripts/queuehandler.sh.conf +++ /dev/null @@ -1,71 +0,0 @@ -# -# queuehandler.sh.conf: -# this is the configuration-file of queuehandler.sh -# - qh_conf_ver="0.3.0" - - # set this to 1 to get debug-informations in the syslog and - # exit-messages of the queuehandler on the osd: - debug=0 - - # set this to 1 to see stdout while the queuehandler is executing an - # external programm - stdout=0 - - # resulting length (in seconds) of movies if the queuehandler is - # started in the preview-mode - previewlength=60 - - # check for new entries in queuefile (in seconds) - check=30 - - # check for unlocked queuefile (in seconds) - lock=5 - - - - # if you have set the setup-option "rename after encodings" - # to yes, this string will be appended to the recording-name - # after the movie is encoded. - append_string="_-_CONVERTED" - - - - # this pathes are used for the encoding of vdr-recordings & dvd's. - # they _must_ point to an unpatched mencoder & mplayer - mencoder="/usr/bin/mencoder" - mplayer="/usr/bin/mplayer" - - # this pathes are only used for encoding a vdr-recording with - # selected ac3-stream. - # they _must_ point to an ac3-patched mencoder & mplayer. - # if you don't use this feature you should deactivate the option - # AC3 Support (MPlayer-patch inst.) in the plugins setup-menu. - mencoder_ac3="/usr/local/bin/mencoder_ac3" - mplayer_ac3="/usr/local/bin/mplayer_ac3" - - - # this string is added to the mencoder-command in the - # queuehandler - useropts="" - - - - # optional tools (only needed for ogm/matroska-container) - vdrsync="/usr/bin/vdrsync.pl" - ffmpeg="/usr/bin/ffmpeg" - ogmmerge="/usr/bin/ogmmerge" - ogmsplit="/usr/bin/ogmsplit" - mkvmerge="/usr/bin/mkvmerge" - - - - # This (optional) command is used to display some informations - # from the queuehandler on your tv. - # You have to specify only $svdrpsend or $netcat. - # $netcat is only recommend, if perl isn't installed. - svdrpsend="/usr/lib/vdr/svdrpsend.pl" - #netcat="" - - vdrhostname="localhost" - -- cgit v1.2.3