Mythcommflag-wrapper
Author | Cowbutt |
Description | A simple bash script based on Silence-detect.sh that wraps mythcommflag and can be used manually (via 'Begin Advert Detection' menu option in recording browser) to use silence detection for commflagging for certain UK TV channels. |
Supports |
Contents
Rename the existing mythcommflag binary
Mythbackend runs the commflag differently according to the configured name (i.e JobQueueCommFlagCommand<code> in the <code>settings
table). If it's not 'mythcommflag
', then it always runs the configured commflagger with no parameters (i.e. in "flag all uncommflagged recordings"). Therefore it's necessary for this script to replace and wrap mythcommflag
. e.g.
mv /usr/bin/mythcommflag /usr/bin/mythcommflag.orig
Install wrapper script in place of mythcommflag
Install this script as /usr/bin/mythcommflag (or wherever your original mythcommflag binary was located)
#!/bin/sh # edit/tune these # # DB username and password # TODO AJB20110130 get these from $HOME/.mythtv/mysql.txt MYTHUSER="mythtv" MYTHPASS="mythtv" # root of MythTV recordings # TODO AJB20110130 generate this automatically from the storagegroups table RECORDINGSROOT="/srv/myth" # Allow ad breaks to be upto 400s long by coalescing non-silence MAXCOMMBREAKSECS=400 # mytharchivehelper isn't frame-accurate, and mythcommflag won't add final cut pair if the end of the cut is greater # than the actual final frame, so subtract $ENDFUDGEFRAMES from the value mytharchivehelper returns ENDFUDGEFRAMES=75 # -70dB and minimum of 0.15s to be considered 'silent' MP3SPLT_OPTS="th=-70,min=0.15" # Log file LOGFILE="/var/log/mythtv/mythcommflag-wrapper" echo >>$LOGFILE "$0 run with [$*] at `date` by `whoami`" silence_detect() { local filename=$1 TMPDIR=`mktemp -d /tmp/mythcommflag.XXXXXX` || exit 1 # get frame count, less 3 seconds (75 frames) fudge factor let FRAMES=`mytharchivehelper -i $filename $TMPDIR/streaminfo.xml 1 2>&1 | grep " frames = " | awk -F"= " '{print $2}'`-${ENDFUDGEFRAMES} # From <http://www.mythtv.org/wiki/Silence-detect.sh> cd $TMPDIR touch `basename $filename`.touch ionice -c3 nice ffmpeg -i $filename -acodec copy sound.mp3 ionice -c3 nice mp3splt -s -p $MP3SPLT_OPTS sound.mp3 #AJB20110129 add '$FRAMES' because mythcommflag now requires *pairs* of frames CUTLIST=`tail --lines=+3 mp3splt.log|sort -g |\ awk 'BEGIN{start=0;ORS=","}{if($2-start<'$MAXCOMMBREAKSECS') {finish=$2} else {print int(start*25+1)"-"int(finish*25-25); start=$1; finish=$2;}}END{print int(start*25+1)"-"'$FRAMES'}'` echo >>$LOGFILE "silence-detect has generated cutlist: $CUTLIST" rm -rf $TMPDIR } if [ $# -eq 0 ]; then # run with no parameters, flag every unflagged recording exec mythcommflag.orig exit $? else if [ $# -eq 4 -a "$1" = "-j" -a "$3" = "-V" ]; then # this is a manual flag job # TODO AJB20110129 generate a filelist from recorded table where commflagged=0 and cutlist=0 # then run silence_detect over each filename JOB=$2 else # we're being used in some other way, run the real mythcommmflag echo >>$LOGFILE "running mythcommflag.orig $*" exec mythcommflag.orig $* exit $? fi echo >>$LOGFILE "running job $JOB" HASCUTLIST=`mysql -u${MYTHUSER} -p${MYTHPASS} -e "use mythconverg; select recorded.cutlist from recorded join jobqueue where jobqueue.id=$JOB and jobqueue.chanid=recorded.chanid and jobqueue.starttime=recorded.starttime;" | tail -n +2` if [ "$HASCUTLIST" = "1" ]; then echo "program already has (manual?) cutlist, exiting" exit 0 fi CALLSIGN=`mysql -u${MYTHUSER} -p${MYTHPASS} -e "use mythconverg; select channel.callsign from channel join jobqueue where jobqueue.id=$JOB and jobqueue.chanid=channel.chanid;" | tail -n +2` CHANID=`mysql -u${MYTHUSER} -p${MYTHPASS} -e "use mythconverg; select chanid from jobqueue where jobqueue.id=$JOB;" | tail -n +2` STARTTIME=`mysql -u${MYTHUSER} -p${MYTHPASS} -e "use mythconverg; select starttime from jobqueue where jobqueue.id=$JOB;" | tail -n +2` echo >>$LOGFILE "channel callsign is $CALLSIGN" echo >>$LOGFILE "chanid=$CHANID STARTTIME=$STARTTIME" BASENAME=`mysql -u${MYTHUSER} -p${MYTHPASS} -e "use mythconverg; select recorded.basename from recorded join jobqueue where jobqueue.id=$JOB and jobqueue.chanid=recorded.chanid and jobqueue.starttime=recorded.starttime;" | tail -n +2` echo >>$LOGFILE "basename is $BASENAME" FILENAME=`ionice -c3 nice find ${RECORDINGSROOT} -name $BASENAME` echo >>$LOGFILE "filename is $FILENAME" if [ "$CALLSIGN" = "Film4" -o "$CALLSIGN" = "ITV1" -o "$CALLSIGN" = "ITV1 +1" -o "$CALLSIGN" = "ITV2" -o "$CALLSIGN" = "ITV2 +1" -o "$CALLSIGN" = "ITV3" -o "$CALLSIGN" = "ITV4" -o "$CALLSIGN" = "Dave" -o "$CALLSIGN" = "Dave ja vu" ]; then echo >>$LOGFILE "Callsign in whitelist - will run silence_detect" mysql -u${MYTHUSER} -p${MYTHPASS} -e "use mythconverg; update recorded set commflagged=2 where chanid=$CHANID and starttime='${STARTTIME}';" CUTLIST="" echo >>$LOGFILE "silence_detect $FILENAME" silence_detect $FILENAME echo >>$LOGFILE "silect_detect() set CUTLIST to $CUTLIST" mythcommflag --setcutlist $CUTLIST -f $FILENAME RC=$? echo "mythcommflag --setcutlist returned $RC" if [ $RC -eq 0 ]; then mysql -u${MYTHUSER} -p${MYTHPASS} -e "use mythconverg; update recorded set commflagged=1 where chanid=$CHANID and starttime='${STARTTIME}';" else echo >>$LOGFILE "mythcommflag failed; returned $RC" mysql -u${MYTHUSER} -p${MYTHPASS} -e "use mythconverg; update recorded set commflagged=0 where chanid=$CHANID and starttime='${STARTTIME}';" fi else # Not a whitelisted channel for silence_detect echo >>$LOGFILE "won't run silence-detect, running mythcommflag.orig $*" exec mythcommflag.orig $* exit $? fi fi
Edit script variables
Edit the environment variables in the wrapper script according to your local installation.
Enable commflagging
Check that commflagging is allowed in mythtv-setup (i.e. the JobAllowCommFlag
setting should be 1) and that the commflag command (i.e. JobQueueCommFlagCommand
) is mythcommflag
.
Test
In the 'Watch Recordings' browser, select a recording that was from a channel included in the script's whitelist (Film4, Dave, Dave ja vu, ITV1-4, ITV1 +1, ITV2 +1), hit menu, then Jobs, then 'Begin Advert Detection'). Within a few minutes, that recording should be commflagged appropriately.