From 4629a7669ffba21068576ca8aac2c2051d360536 Mon Sep 17 00:00:00 2001 From: Michael Hanson Date: Tue, 4 May 2010 00:25:19 +0000 Subject: fuzemux & linhes-scripts: initial fuzemux include / Added user job script myth2fuze --- abs/core-testing/linhes-scripts/PKGBUILD | 6 +- abs/core-testing/linhes-scripts/myth2fuze | 334 +++++++++++++++++++++ abs/extra-testing/community/fuzemux/PKGBUILD | 42 +++ .../community/fuzemux/fuzemux-svn.install | 5 + 4 files changed, 385 insertions(+), 2 deletions(-) create mode 100755 abs/core-testing/linhes-scripts/myth2fuze create mode 100644 abs/extra-testing/community/fuzemux/PKGBUILD create mode 100644 abs/extra-testing/community/fuzemux/fuzemux-svn.install diff --git a/abs/core-testing/linhes-scripts/PKGBUILD b/abs/core-testing/linhes-scripts/PKGBUILD index 6ecf501..b5d9d7e 100644 --- a/abs/core-testing/linhes-scripts/PKGBUILD +++ b/abs/core-testing/linhes-scripts/PKGBUILD @@ -3,7 +3,7 @@ pkgname=linhes-scripts pkgver=1 -pkgrel=66 +pkgrel=67 pkgdesc="Various scripts that help to make LinHES, LinHES." arch=('i686' 'x86_64') license=('GPL2') @@ -40,6 +40,7 @@ upgrade_to_0.22.sh remove_php_mythvideo.sh removecommercials.sh system-cleanup.sh +myth2fuze ) build() { @@ -81,4 +82,5 @@ md5sums=('f56985b2d602e11dc1e10d3e7848b2a5' 'ea5492d4dab8271db20cb84416c001dc' '87b0dc855181f98516acb18a7d551601' '25c1baeb97a49656456ae33f7e7a9f06' - '2fb25aef03ffd1282414d8cca3df7056') + '2fb25aef03ffd1282414d8cca3df7056' + '945fa126b426eafe7e75df07426b9611') diff --git a/abs/core-testing/linhes-scripts/myth2fuze b/abs/core-testing/linhes-scripts/myth2fuze new file mode 100755 index 0000000..f4d1ce2 --- /dev/null +++ b/abs/core-testing/linhes-scripts/myth2fuze @@ -0,0 +1,334 @@ +#!/bin/bash +# convert recording to avi compatable with San Disk Sansa Fuze +# Based on and/or inspired by myth2xvid, the video4fuze project: +# http://code.google.com/p/video4fuze +# and the fuzemux project: +# http://code.google.com/p/fuzemux +# +# version 0.1 +# +# usage: +# first parameter must be %DIR%/%FILE% of the recording +# second parameter must be the desired base name of the output +# third parameter must be %CHANID% if you set USECUTLIST=Y +# fourth parameter must be %STARTTIME% if you set USECUTLIST=Y +# 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/bin/myth2fuze "%DIR%/%FILE%" "%TITLE% - %SUBTITLE%" "%CHANID%" "%STARTTIME%" "%JOBID%" + +# options: +USECUTLIST=Y # Y or N + +# check prerequesites +for APP in {fuzemux,mencoder,ffmpeg,mythcommflag,mythtranscode,mysql}; do + /usr/bin/which $APP &>/dev/null + ERROR=$? + if [ $ERROR -ne 0 ]; then + echo "$APP not found in your PATH! Aborting! ERROR: $ERROR" >> $LOGFILE + update_status 304 + update_comment "$APP not found in your PATH! Aborting! Exit status: $ERROR" + exit 1 + fi +done + +# where the converted video is stored +OUT_DIR=/myth/md0/video/fuze + +# Ensure output directory exists +if [ ! -d $OUT_DIR ] ; then + mkdir -p -m777 $OUT_DIR +fi + +# 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_background_progress() +# check mencoder progress in background +# Arg_1 = PROGRESS CALCULATION +{ +while [ `tail -1 $STATUSFILE | grep -cE "^Audio stream:|^Video stream:"` = 0 ] +do + sleep 10 + check_myth_jobcmds + current_status=`tail -1 $STATUSFILE | grep "([ 0-9]\{1,\}%)"` + prog_percent=`echo "$current_status" | sed 's_.*(\([ 0-9][ 0-9]\)%).*_\1_'` + current_FPS=`echo "$current_status" | sed 's_.*\([ 0-9][ 0-9].[ 0-9][ 0-9]\)fps.*_\1_'` + if [ -n "$prog_percent" ]; then + prog_percent=`expr $prog_percent / $1` + echo "$prog_percent% Completed @ $current_FPS fps" + update_comment "$prog_percent% Completed @ $current_FPS fps" + fi + sleep 10 +done +} + +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 $mencoder_pid ;; + # JOB_RESUME + 2) update_status 4 + `$SQLCMD "update jobqueue set cmds=\"0\" where id=\"$JOBID\";"` + kill -s CONT $mencoder_pid ;; + # JOB_STOP + 4) update_status 5 + `$SQLCMD "update jobqueue set cmds=\"0\" where id=\"$JOBID\";"` + kill -9 $mencoder_pid $command_pid + clean_up_files + echo "Encode Cancelled" >> $LOGFILE + update_status 320 + exit ;; + esac +fi +} + +get_mencoder_pid() +{ +process_name="" +i1=1 +while [ "$process_name" != "found" ]; do + if [ "`ps $mencoder_pid | grep mencoder | sed 's_.*\(mencoder\).*_\1_'`" = "mencoder" ]; then + process_name="found" + else + mencoder_pid=`expr $mencoder_pid + 1` + fi + i1=`expr $i1 + 1` + if [ $i1 -gt 20 ]; then + break + fi +done +} + +run_fuzemux() +# Remux avi to fuze compatable avi +{ +/usr/bin/fuzemux ${TMPFILE} ${OUTPUTFILE} >> $LOGFILE || return 1 +} + +create_thumbnail() +# Create a thumbnail image for the fuze +{ +/usr/bin/ffmpeg -y -v -1 -i ${OUTPUTFILE} -t 1 -ss 3 -s 224x176 -f image2 ${OUTPUTFILE%.*}.thm >> $LOGFILE +} + +clean_up_files() +# clean up left over files +{ +unlink $TMPFILE 2> /dev/null +unlink $TMPCUTFILE 2> /dev/null +unlink $TMPCUTFILE.map 2> /dev/null +unlink $TWOPASSFILE 2> /dev/null +unlink $TWOPASSFILE.tmp 2> /dev/null +unlink $STATUSFILE 2> /dev/null +unlink $MENCODER_RETURN_CODE 2> /dev/null +unlink $MENCODER_RETURN_CODE_2 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 + +# create temp filename so multiple instances won't conflict +TMPNAME=toFUZE-$$ +TMPFILE=/myth/md0/tmp/$TMPNAME.avi +TMPCUTFILE=/myth/md0/tmp/$TMPNAME.mpg +MENINPUTFILE=$1 +TWOPASSFILE=/tmp/$TMPNAME-2pass.log +STATUSFILE=/tmp/$TMPNAME-status.log +MENCODER_RETURN_CODE=/tmp/$TMPNAME-mencoder_return_code +MENCODER_RETURN_CODE_2=/tmp/$TMPNAME-mencoder_return_code_2 + +# log file location +LOGFILE=/var/log/mythtv/myth2fuze.log +CDate="`date`" +echo "" >> $LOGFILE +echo $CDate >> $LOGFILE +echo "File to encode: $MENINPUTFILE Name: $2" >> $LOGFILE + +# start timer +beforetime="$(date +%s)" + +check_myth_jobcmds + +# check if using cutlist +if [ $USECUTLIST = Y ]; then + MYTHCOMMFRAMES=`mythcommflag --getcutlist -f $MENINPUTFILE | grep 'Cutlist:' | cut -d \ -f 2` + if [ -n "$MYTHCOMMFRAMES" ]; then + echo "Extracting Cutlist..." >> $LOGFILE + update_comment "Extracting Cutlist" + /usr/bin/nice -n19 /usr/bin/mythtranscode --chanid "$3" --starttime "$4" --outfile "$TMPCUTFILE" --mpeg2 --honorcutlist + MENINPUTFILE=$TMPCUTFILE + fi +fi + +# run mencoder in background to do 1st pass conversion +echo "Encoding 1st Pass for the Fuze..." >> $LOGFILE +( /usr/bin/nice -n19 /usr/bin/mencoder $MENINPUTFILE -passlogfile $TWOPASSFILE \ +-ffourcc DX50 -ofps 20 -vf pp=li,expand=:::::224/176,scale=224:176,harddup \ +-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=683:vmax_b_frames=0:keyint=15:turbo:vpass=1 \ +-nosound -o /dev/null > $STATUSFILE 2>&1 ; echo $? > $MENCODER_RETURN_CODE ) & +mencoder_pid=$! +command_pid=$mencoder_pid +get_mencoder_pid + +check_background_progress "2" + +if [ `cat $MENCODER_RETURN_CODE` -ne 0 ]; then + echo "Mencoder pass #1 exited with error $MENCODER_RETURN_CODE. Encoding fa$ + update_status 304 + update_comment "ERROR: Mencoder pass #1 exited with error $MENCODER_RETURN_C$ + clean_up_files + exit 1 +fi + +# run mencoder in background to do 2nd pass conversion +echo "Encoding 2nd Pass for the Fuze..." >> $LOGFILE +( /usr/bin/nice -n19 /usr/bin/mencoder $MENINPUTFILE -passlogfile $TWOPASSFILE \ +-ffourcc DX50 -ofps 20 -vf pp=li,expand=:::::224/176,scale=224:176,harddup \ +-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=683:vmax_b_frames=0:keyint=15:vpass=2 \ +-srate 44100 -af resample=44100:0:1,format=s16le -oac mp3lame \ +-lameopts cbr:br=128 -o "$TMPFILE" > $STATUSFILE 2>&1 ; echo $? \ +> $MENCODER_RETURN_CODE_2 ) & +mencoder_pid=$! +command_pid=$mencoder_pid +get_mencoder_pid + +check_background_progress "2" + +if [ `cat $MENCODER_RETURN_CODE_2` -ne 0 ]; then + echo "Mencoder pass #1 exited with error $MENCODER_RETURN_CODE. Encoding fa$ + update_status 304 + update_comment "ERROR: Mencoder pass #1 exited with error $MENCODER_RETURN_C$ + clean_up_files + exit 1 +fi + +# make output filename unique, remove punctuation and "special" characters, +# replace spaces with underscores and force lowercase names +FILENAME=$( echo ${2} | tr -d '[:punct:]' | tr -d "\"" | tr -d "\!" \ + | tr -d "\`" | tr -s '[:blank:]' '[_]' \ + | tr '[:upper:]' '[:lower:]' )_fuze.avi | tr -s '[_]' +ERROR=$? + +if [ $ERROR -ne 0 ]; then + echo "Creating unique file name exited with error $ERROR" >> $LOGFILE + update_status 304 + update_comment "ERROR: Creating unique file name exited with error $ERROR Job Failed!" + clean_up_files + exit 1 +fi + +OUTPUTFILE=${OUT_DIR}/${FILENAME} +ERROR=$? + +if [ $ERROR -ne 0 ]; then + echo "Setting output file name exited with error $ERROR" >> $LOGFILE + update_status 304 + update_comment "ERROR: Setting output file name exited with error $ERROR Job failed!" + clean_up_files + exit 1 +fi + +i=1 +while [ -e "$OUTPUTFILE" ] +do + FILENAME=$( echo ${2} | tr -d '[:punct:]' | tr -d "\"" | tr -d "\!" \ + | tr -d "\`" | tr -s '[:blank:]' '[_]' \ + | tr '[:upper:]' '[:lower:]' )_fuze-$i.avi + OUTPUTFILE=${OUT_DIR}/${FILENAME} + i=`expr $i + 1` +done +ERROR=$? + +if [ $ERROR -ne 0 ]; then + echo "Setting output file name exited with error $ERROR" >> $LOGFILE + update_status 304 + update_comment "ERROR: Setting output file name exited with error $ERROR Job failed!" + clean_up_files + exit 1 +fi + +run_fuzemux +ERROR=$? + +if [ $ERROR -ne 0 ]; then + echo "Fuzemux exited with error $ERROR" >> $LOGFILE + update_status 304 + update_comment "ERROR: Fuzemux exited with error $ERROR Job Failed!" + clean_up_files + exit 1 +fi + +# ensure mythtv owns the final avi +chown mythtv ${OUTPUTFILE} +ERROR=$? + +if [ $ERROR -ne 0 ]; then + echo "Changing ownership of avi to mythtv exited with error $ERROR" + update_status 304 + update_comment "ERROR: Changing ownership of avi to mythtv exited with error $ERROR Job failed!" + clean_up_files + exit 1 +fi + +create_thumbnail + +# ensure mythtv owns the thumbnail +chown mythtv ${OUTPUTFILE%.*}.thm +ERROR=$? + +if [ $ERROR -ne 0 ]; then + echo "Changing ownership of thumbnail to mythtv exited with error $ERROR" + update_status 304 + update_comment "ERROR: Changing ownership of thumbnail to mythtv exited with error $ERROR Job failed!" + clean_up_files + exit 1 +fi + +# stop timer +aftertime="$(date +%s)" +seconds="$(expr $aftertime - $beforetime)" + echo "File Encoded Successfully: $OUTPUTFILE" >> $LOGFILE + hours=$((seconds / 3600)) + seconds=$((seconds % 3600)) + minutes=$((seconds / 60)) + seconds=$((seconds % 60)) + echo "Encoding took $hours hour(s) $minutes minute(s) $seconds second(s) @ $current_FPS fps." >> $LOGFILE + update_status 272 + update_comment "Encode Successful. Encoding Time: $hours hour(s) $minutes minute(s) $seconds second(s)" + +clean_up_files diff --git a/abs/extra-testing/community/fuzemux/PKGBUILD b/abs/extra-testing/community/fuzemux/PKGBUILD new file mode 100644 index 0000000..5cce2d0 --- /dev/null +++ b/abs/extra-testing/community/fuzemux/PKGBUILD @@ -0,0 +1,42 @@ +# Contributor: Michael Hanson +# Maintainer: Michael Hanson +pkgname=fuzemux-svn +pkgver=11 +pkgrel=1 +pkgdesc="A tool to remux AVI video files for the San Disk Sansa Fuze portable media player" +arch=('i686' 'x86_64') +url="http://code.google.com/p/fuzemux" +license=('GPL3') +#depends=() +makedepends=('subversion' 'autoconf') +provides=('fuzemux') +install=('fuzemux-svn.install') + +_svntrunk=http://fuzemux.googlecode.com/svn/trunk/ +_svnmod=fuzemux + +build() { + cd "$srcdir" + + if [ -d $_svnmod/.svn ]; then + (cd $_svnmod && svn up -r $pkgver) + else + svn co $_svntrunk --config-dir ./ -r $pkgver $_svnmod + fi + + msg "SVN checkout done or server timeout" + msg "Starting make..." + + rm -rf "$srcdir/$_svnmod-build" + cp -r "$srcdir/$_svnmod" "$srcdir/$_svnmod-build" + cd "$srcdir/$_svnmod-build" + + # + # BUILD + # + /usr/bin/autoreconf --install + ./configure --prefix=/usr + make || return 1 + make DESTDIR="$pkgdir/" install +} +md5sums=() diff --git a/abs/extra-testing/community/fuzemux/fuzemux-svn.install b/abs/extra-testing/community/fuzemux/fuzemux-svn.install new file mode 100644 index 0000000..877ec1b --- /dev/null +++ b/abs/extra-testing/community/fuzemux/fuzemux-svn.install @@ -0,0 +1,5 @@ +post_install() { + echo ">>>" + echo ">>> A user job script is supplied at /usr/LH/bin/myth2fuze" + echo ">>>" +} -- cgit v0.12