#!/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