#!/bin/sh # remove commercials from recordings using the user generated cutlist or # optionally using the mythcommflag generated cutlist. # version 0.3 9/1/2010 # usage: # first parameter must be %DIR% of the recording # second parameter must be %FILE% of the recording # third parameter must be %CHANID% # fourth parameter must be %STARTTIME% # fifth parameter must be %JOBID% for the User Job status to be updated in MythTV # in the mythtv setup screen invoke this script like this: # MYTHTV User Job Command: # /usr/LH/bin/removecommercials.sh "%DIR%" "%FILE%" "%CHANID%" "%STARTTIME%" "%JOBID%" #-------OPTIONS---------------- # If no cutlist is found USE_MYTHCOMMFLAG_CUTLIST=YES will use mythcommflag # to generate a cutlist. # WARNING: Using this option could result in part of the recording being cut if # mythcommflag incorrectly flagged the commercial. # The USE_MYTHCOMMFLAG_CUTLIST option is saved in ~/.removecommercials.cfg and will # not be overwritten by updates to this script. The ~/.removecommercials.cfg # will be created by this script if it doesn't exist. # To enable set USE_MYTHCOMMFLAG_CUTLIST=YES in ~/.removecommercials.cfg [[ ! -f ~/.removecommercials.cfg ]] && printf "# If no cutlist is found USE_MYTHCOMMFLAG_CUTLIST=YES will use mythcommflag\n# to generate a cutlist.\n# WARNING: Using this option could result in part of the recording being cut if\n# mythcommflag incorrectly flagged the commercial.\nUSE_MYTHCOMMFLAG_CUTLIST=NO" > ~/.removecommercials.cfg . ~/.removecommercials.cfg # Auguments passed from command line VIDEODIR=$1 FILENAME=$2 CHANID=$3 STARTTIME=$4 JOBID=$5 # database settings BACKEND_HOSTNAME=${BACKEND_HOSTNAME:-"localhost"} DBUSERNAME=${DBUSERNAME:-"mythtv"} DBPASSWORD=${DBPASSWORD:-"mythtv"} SQLCMD="mysql -u $DBUSERNAME --password=$DBPASSWORD -h $BACKEND_HOSTNAME mythconverg -e" LOG="/dev/null" #LOG="/var/log/mythtv/removecommercials.log" #------FUNCTIONS--------------- update_comment() # Arg_1 = COMMENT { if [ $NO_JOBID = 0 ]; then `$SQLCMD "update jobqueue set comment=\"$1\" where id=\"$JOBID\";"` fi } update_status() # Arg_1 = status code { if [ $NO_JOBID = 0 ]; then `$SQLCMD "update jobqueue set status=\"$1\" where id=\"$JOBID\";"` fi } check_myth_jobcmds() # check the myth database for stop pause or resume commands { if [ $NO_JOBID = 0 ]; then CURRENT_CMD=`$SQLCMD "select cmds from jobqueue where id=\"$JOBID\";" | sed '/[0-9]/!d'` case "$CURRENT_CMD" in # JOB_RUN 0) ;; # JOB_PAUSE 1) update_status 6 kill -s STOP $TPID ;; # JOB_RESUME 2) update_status 4 `$SQLCMD "update jobqueue set cmds=\"0\" where id=\"$JOBID\";"` kill -s CONT $TPID ;; # JOB_STOP 4) update_status 5 `$SQLCMD "update jobqueue set cmds=\"0\" where id=\"$JOBID\";"` kill -9 $TPID clean_up_files echo "Cancelled" update_status 320 exit ;; esac fi } check_background_progress() #check progress in background { while [ `tail -1 $STATUSFILE | grep -c "Done"` = 0 ] do sleep 5 check_myth_jobcmds current_status=`tail -1 $STATUSFILE` if [ `expr match "$current_status" '.*\complete'` -ne 0 ]; then prog_percent=`echo "$current_status" | awk '{print $3}'` if [ -n "$prog_percent" ]; then echo "Removing Commercials - $prog_percent Completed" update_comment "Removing Commercials - $prog_percent Completed" fi fi done } get_pid() { process_name="" i1=1 while [ "$process_name" != "found" ]; do if [ "`ps $TPID | grep mythtranscode | sed 's_.*\(mythtranscode\).*_\1_'`" = "mythtranscode" ]; then process_name="found" else TPID=`expr $TPID + 1` fi i1=`expr $i1 + 1` if [ $i1 -gt 20 ]; then break fi done } clean_up_files() # clean up left over files { unlink $TMPFILE 2> /dev/null unlink $TMPFILE.map 2> /dev/null unlink $STATUSFILE 2> /dev/null unlink $VIDEODIR/$FILENAME.tmp 2> /dev/null } #-------MAIN SCRIPT------------ # check if %JOBID% is passed from command line JOBID=$5 if [ -z "$JOBID" ]; then NO_JOBID=1 else NO_JOBID=0 fi # check if file is a .mpg if [ `expr match "$FILENAME" '.*\.mpg'` -ne 0 ]; then MPEG="--mpeg2" else MPEG="" fi # create temp filename so multiple instances won't conflict TMPNAME=rmvCOMMS-$$ TMPFILE=$VIDEODIR/$FILENAME-$$ STATUSFILE=/myth/tmp/$TMPNAME-status.log touch $STATUSFILE update_status 4 check_myth_jobcmds echo "" >> $LOG date >> $LOG $VIDEODIR/$FILENAME >> $LOG # check for cutlist MYTHCOMMFRAMES=`mythcommflag --getcutlist -f $VIDEODIR/$FILENAME | grep 'Cutlist:' | cut -d \ -f 2` if [ $USE_MYTHCOMMFLAG_CUTLIST=YES ] && [ -z "$MYTHCOMMFRAMES" ]; then echo "Generating cutlist..." >> $LOG update_comment "Generating cutlist..." /usr/bin/nice -n19 /usr/bin/mythcommflag --gencutlist -f $VIDEODIR/$FILENAME MYTHCOMMFRAMES=`mythcommflag --getcutlist -f $VIDEODIR/$FILENAME | grep 'Cutlist:' | cut -d \ -f 2` fi if [ -n "$MYTHCOMMFRAMES" ]; then echo "Removing Commercials..." >> $LOG update_comment "Removing Commercials..." ( /usr/bin/nice -n19 /usr/bin/mythtranscode -c $CHANID -s $STARTTIME -o $TMPFILE $MPEG --honorcutlist --showprogress > $STATUSFILE 2>&1 ; echo "Done" >> $STATUSFILE ) & TPID=$! get_pid check_background_progress ERROR=$? if [ $ERROR -ne 0 ]; then echo "Transcoding failed for ${FILENAME} with error $ERROR" >> $LOG exit $ERROR fi check_myth_jobcmds # move temp file to output location echo "Moving file..." >> $LOG update_comment "Moving file..." if [ `$SQLCMD "select data from settings where value='SaveTranscoding';" | sed '/[0-9]/!d'` = 1 ]; then echo "DB is set to save transcoding" >> $LOG mv $VIDEODIR/$FILENAME $VIDEODIR/$FILENAME.old fi mv $TMPFILE $VIDEODIR/$FILENAME # file has changed, rebuild index echo "Rebuilding index..." >> $LOG update_comment "Rebuilding index..." mythcommflag -c $CHANID -s $STARTTIME --rebuild ERROR=$? if [ $ERROR -ne 0 ]; then echo "Rebuilding seek list failed for ${FILENAME} with error $ERROR" >> $LOG exit $ERROR fi # remove old cutlist echo "Removing old cutlist..." >> $LOG update_comment "Removing old cutlist..." mythcommflag -c $CHANID -s $STARTTIME --clearcutlist ERROR=$? if [ $ERROR -eq 0 ]; then # Fix the database entry for the file echo "Fixing database entry..." >> $LOG `$SQLCMD "UPDATE recorded SET cutlist = 0, filesize = $(ls -l $VIDEODIR/$FILENAME | awk '{print $5}') WHERE basename = '$FILENAME';"` > /dev/null else echo "Clearing cutlist failed for ${FILENAME} with error $ERROR" >> $LOG clean_up_files update_status 272 update_comment "Error: Clearing cutlist failed." exit $ERROR fi # clear autoskip list echo "Clearing autoskip list..." >> $LOG `$SQLCMD "DELETE FROM recordedmarkup WHERE CONCAT( chanid, starttime ) IN (SELECT CONCAT( chanid, starttime ) FROM recorded WHERE basename = '$FILENAME');"` > /dev/null clean_up_files echo "Commercials Removed" >> $LOG update_status 272 update_comment "Sucessfully Completed." else echo "No cutlist found." >> $LOG fi