Difference between revisions of "Mythcommflag-wrapper"

From MythTV Official Wiki
Jump to: navigation, search
m (Improvements)
m (Install wrapper script in place of mythcommflag: - expanded whitelist)
Line 24: Line 24:
 
# edit/tune these #
 
# edit/tune these #
 
# DB username and password
 
# DB username and password
# TODO AJB20110130 get these from $HOME/.mythtv/mysql.txt
 
 
MYTHUSER="mythtv"
 
MYTHUSER="mythtv"
 
MYTHPASS="mythtv"
 
MYTHPASS="mythtv"
 
# root of MythTV recordings
 
# root of MythTV recordings
# TODO AJB20110130 generate this automatically from the storagegroups table
 
 
RECORDINGSROOT="/srv/myth"
 
RECORDINGSROOT="/srv/myth"
 
# Allow ad breaks to be upto 400s long by coalescing non-silence
 
# Allow ad breaks to be upto 400s long by coalescing non-silence
Line 41: Line 39:
  
 
echo >>$LOGFILE "$0 run with [$*] at `date` by `whoami`"
 
echo >>$LOGFILE "$0 run with [$*] at `date` by `whoami`"
 +
#/usr/bin/mythcommflag run with [-j 584 -V 8213] at Sat Jan 29 17:26:58 GMT 2011 by root
 +
#select recorded.basename from recorded join jobqueue where jobqueue.id=584 and jobqueue.chanid=recorded.chanid and jobqueue.starttime=recorded.starttime;
  
 
silence_detect() {
 
silence_detect() {
Line 51: Line 51:
  
 
# From <http://www.mythtv.org/wiki/Silence-detect.sh>
 
# From <http://www.mythtv.org/wiki/Silence-detect.sh>
 +
 +
# AJB20110129 Have already checked for pre-existing cutlist, and this check doesn't work properly after --clearcutlist anyway
 +
# [[ "Cutlist: "  == `mythcommflag.fedora --getcutlist -f $filename  |grep Cutlist` ]] \
 +
#     || { echo already has cutlist && exit 1; }
  
 
cd $TMPDIR
 
cd $TMPDIR
Line 71: Line 75:
 
if [ $# -eq 0 ]; then
 
if [ $# -eq 0 ]; then
 
# run with no parameters, flag every unflagged recording
 
# run with no parameters, flag every unflagged recording
exec mythcommflag.orig
+
exec mythcommflag.fedora
 
exit $?
 
exit $?
 
else
 
else
Line 81: Line 85:
 
else
 
else
 
# we're being used in some other way, run the real mythcommmflag
 
# we're being used in some other way, run the real mythcommmflag
echo >>$LOGFILE "running mythcommflag.orig $*"
+
echo >>$LOGFILE "running mythcommflag.fedora $*"
exec mythcommflag.orig $*
+
exec mythcommflag.fedora $*
 
exit $?
 
exit $?
 
fi
 
fi
Line 101: Line 105:
 
echo >>$LOGFILE "filename is $FILENAME"
 
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
+
#safe list
 +
# 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
 +
# Channel 4 channels seem to work too, but sometimes last cut is too long?
 +
# if [ "$CALLSIGN" = "Channel 4" -o "$CALLSIGN" = "Channel 4+1" -o "$CALLSIGN" = "More 4" -o "$CALLSIGN" = "E4" -o "$CALLSIGN" = "E4+1" -o "$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
 +
# if [ "$CALLSIGN" = "FIVE USA" -o "$CALLSIGN" = "FIVER" -o "$CALLSIGN" = "FIVE" -o "$CALLSIGN" = "Channel 4" -o "$CALLSIGN" = "Channel 4+1" -o "$CALLSIGN" = "More 4" -o "$CALLSIGN" = "E4" -o "$CALLSIGN" = "E4+1" -o "$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
 +
# Fails on FIVER and cuts almost entire recording. Works for other FIVE channels with caveat that they include news bulletins which are't cut
 +
if [ "$CALLSIGN" = "FIVE USA" -o "$CALLSIGN" = "FIVE" -o "$CALLSIGN" = "Channel 4" -o "$CALLSIGN" = "Channel 4+1" -o "$CALLSIGN" = "More 4" -o "$CALLSIGN" = "E4" -o "$CALLSIGN" = "E4+1" -o "$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"
 
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}';"
 
mysql -u${MYTHUSER} -p${MYTHPASS} -e "use mythconverg; update recorded set commflagged=2 where chanid=$CHANID and starttime='${STARTTIME}';"
Line 119: Line 129:
 
else
 
else
 
# Not a whitelisted channel for silence_detect
 
# Not a whitelisted channel for silence_detect
echo >>$LOGFILE "won't run silence-detect, running mythcommflag.orig $*"
+
echo >>$LOGFILE "won't run silence-detect, running mythcommflag.fedora $*"
exec mythcommflag.orig $*
+
exec mythcommflag.fedora $*
 
exit $?
 
exit $?
 
fi
 
fi
 
fi
 
fi
 +
 
</pre>
 
</pre>
 
}}
 
}}

Revision as of 10:54, 31 January 2011


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 Version24.png  


Rename the existing mythcommflag binary

Mythbackend runs the commflag differently according to the configured name (i.e JobQueueCommFlagCommand in the 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)


Script.png mythcommflag-wrapper.sh

#!/bin/sh

# edit/tune these #
# DB username and password
MYTHUSER="mythtv"
MYTHPASS="mythtv"
# root of MythTV recordings
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`"
#/usr/bin/mythcommflag run with [-j 584 -V 8213] at Sat Jan 29 17:26:58 GMT 2011 by root
#select recorded.basename from recorded join jobqueue where jobqueue.id=584 and jobqueue.chanid=recorded.chanid and jobqueue.starttime=recorded.starttime;

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>

# AJB20110129 Have already checked for pre-existing cutlist, and this check doesn't work properly after --clearcutlist anyway
#		[[ "Cutlist: "  == `mythcommflag.fedora --getcutlist -f $filename  |grep Cutlist` ]] \
#		    || { echo already has cutlist && exit 1; }

		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.fedora
	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.fedora $*"
		exec mythcommflag.fedora $*
		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"	

#safe list
#	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
# Channel 4 channels seem to work too, but sometimes last cut is too long?
#	if [ "$CALLSIGN" = "Channel 4" -o "$CALLSIGN" = "Channel 4+1" -o "$CALLSIGN" = "More 4" -o "$CALLSIGN" = "E4" -o "$CALLSIGN" = "E4+1" -o "$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
#	if [ "$CALLSIGN" = "FIVE USA" -o "$CALLSIGN" = "FIVER" -o "$CALLSIGN" = "FIVE" -o "$CALLSIGN" = "Channel 4" -o "$CALLSIGN" = "Channel 4+1" -o "$CALLSIGN" = "More 4" -o "$CALLSIGN" = "E4" -o "$CALLSIGN" = "E4+1" -o "$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	
# Fails on FIVER and cuts almost entire recording. Works for other FIVE channels with caveat that they include news bulletins which are't cut
	if [ "$CALLSIGN" = "FIVE USA" -o "$CALLSIGN" = "FIVE" -o "$CALLSIGN" = "Channel 4" -o "$CALLSIGN" = "Channel 4+1" -o "$CALLSIGN" = "More 4" -o "$CALLSIGN" = "E4" -o "$CALLSIGN" = "E4+1" -o "$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.fedora $*"
		exec mythcommflag.fedora $*
		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.

Improvements

Fill in the TODOs.

Expand the channel whitelist ("Five" tested once and failed, others???)

Experiment with other mp3splt options for other channels

Merge this into the real mythcommflag. Will probably need a new column in the channels table to signify which commflagging method should be used, and that in turn will require some work to the channel-editor UI of mythtv-setup.