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 --- scripts/queuehandler | 1035 ++++++++++++++++++++++++++++++++++++++++++ scripts/queuehandler.conf | 72 +++ scripts/queuehandler.sh | 1034 ----------------------------------------- scripts/queuehandler.sh.conf | 71 --- 4 files changed, 1107 insertions(+), 1105 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 (limited to 'scripts') 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