summaryrefslogtreecommitdiffstats
path: root/abs/extra/removecommercials/removecommercials
blob: d7b910f450c377848278fe0f5b8c22e8d4160852 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#!/bin/sh
# remove commercials from recording
# version 0.1

# 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 "%DIR%" "%FILE%" "%CHANID%" "%STARTTIME%" "%JOBID%"

# 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"

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

# check for cutlist
MYTHCOMMFRAMES=`mythcommflag --getcutlist -f $VIDEODIR/$FILENAME | grep 'Cutlist:' | cut -d \  -f 2`
if [ -n "$MYTHCOMMFRAMES" ]; then
    echo "Extracting cutlist..."
    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"
        exit $ERROR
    fi

    check_myth_jobcmds
    # move temp file to output location
    echo "Moving file..."
    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 transcodeing"
        mv $VIDEODIR/$FILENAME $VIDEODIR/$FILENAME.old
    fi
    mv $TMPFILE $VIDEODIR/$FILENAME

    # file has changed, rebuild index
    echo "Rebuilding index..."
    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"
        exit $ERROR
    fi

    # remove old cutlist
    echo "Removing old cutlist..."
    update_comment "Removing old cutlist..."
    mythcommflag -c $CHANID -s $STARTTIME --clearcutlist
    ERROR=$?
    if [ $ERROR -eq 0 ]; then
        # Fix the database entry for the file
        `$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"
        exit $ERROR
    fi
    clean_up_files
    echo "Commercials Removed"
    update_status 272
    update_comment "Sucessfully Completed." 
else
    echo "No cutlist found."
fi