From e7ca4c28bfc6c8084dab195bea3bd408966859d8 Mon Sep 17 00:00:00 2001 From: Greg Frost Date: Wed, 5 Aug 2009 23:48:57 +0000 Subject: mkvtoolnix mythnuv2mkv: upgrade FS#476 --- abs/core-testing/system-templates/PKGBUILD | 2 +- abs/extra-testing/mkvtoolnix/PKGBUILD | 4 +- abs/extra-testing/mythnuv2mkv/PKGBUILD | 5 +- abs/extra-testing/mythnuv2mkv/mythnuv2mkv.sh | 2759 -------------------------- 4 files changed, 5 insertions(+), 2765 deletions(-) delete mode 100644 abs/extra-testing/mythnuv2mkv/mythnuv2mkv.sh diff --git a/abs/core-testing/system-templates/PKGBUILD b/abs/core-testing/system-templates/PKGBUILD index 829dcd3..8f25a66 100755 --- a/abs/core-testing/system-templates/PKGBUILD +++ b/abs/core-testing/system-templates/PKGBUILD @@ -1,6 +1,6 @@ pkgname=system-templates pkgver=1.0 -pkgrel=34 +pkgrel=35 conflicts=( ) pkgdesc="Templates used for system configuration" depends=() diff --git a/abs/extra-testing/mkvtoolnix/PKGBUILD b/abs/extra-testing/mkvtoolnix/PKGBUILD index 2ce5343..b328a32 100644 --- a/abs/extra-testing/mkvtoolnix/PKGBUILD +++ b/abs/extra-testing/mkvtoolnix/PKGBUILD @@ -3,7 +3,7 @@ # Contributor: 03/08/04 pkgname=mkvtoolnix -pkgver=2.9.5 +pkgver=2.9.7 pkgrel=1 pkgdesc="Set of tools to create, edit and inspect Matroska files" arch=('i686' 'x86_64') @@ -11,7 +11,7 @@ license=('GPL2') url="http://www.bunkus.org/videotools/mkvtoolnix/index.html" depends=('libmatroska>=0.8.1' 'flac>=1.1.4' 'libvorbis' 'wxgtk>=2.8.0.1' 'file' 'boost' 'lzo2') source=("http://www.bunkus.org/videotools/${pkgname}/sources/${pkgname}-${pkgver}.tar.bz2") -md5sums=('13f639048bd829214b2472703c495e4c') +md5sums=('eae428821c69e7a16b690f4eca6bf567') build() { cd ${srcdir}/${pkgname}-${pkgver}/ diff --git a/abs/extra-testing/mythnuv2mkv/PKGBUILD b/abs/extra-testing/mythnuv2mkv/PKGBUILD index e0e97e6..1c52820 100644 --- a/abs/extra-testing/mythnuv2mkv/PKGBUILD +++ b/abs/extra-testing/mythnuv2mkv/PKGBUILD @@ -1,16 +1,15 @@ pkgname=mythnuv2mkv -pkgver=1.44 +pkgver=1.48 pkgrel=1 conflicts=() pkgdesc="Converts MythTV nuv or mpg files to mkv, mp4 or avi files. It can be run as a MythTV User Job or at command line to convert MythTV recordings or stand alone files." depends=(perl mplayer wget bc imagemagick lame x264 faac faad2 mkvtoolnix vorbis-tools gpac ) arch=('i686') license=('GPL') -source=(mythnuv2mkv.sh) +source=(http://web.aanet.com.au/~auric/files2/V${pkgver}/mythnuv2mkv.sh) install='' build() { mkdir -p $startdir/pkg/usr/bin install -m 0755 mythnuv2mkv.sh $startdir/pkg/usr/bin/mythnuv2mkv.sh } - diff --git a/abs/extra-testing/mythnuv2mkv/mythnuv2mkv.sh b/abs/extra-testing/mythnuv2mkv/mythnuv2mkv.sh deleted file mode 100644 index 4d3e95f..0000000 --- a/abs/extra-testing/mythnuv2mkv/mythnuv2mkv.sh +++ /dev/null @@ -1,2759 +0,0 @@ -#!/bin/bash -# @(#)$Header: /home/mythtv/mythtvrep/scripts/mythnuv2mkv.sh,v 1.44 2009/03/18 20:11:57 mythtv Exp $ -# Auric 2007/07/10 http://web.aanet.com.au/auric/ -########################################################################################################## -# -# Convert MythRecording & MythVideo nuv or mpg files to mkv mp4 or avi. -# -######### Vars you may want to set for your environment ###################################################### -# Default aspect for Myth Recording mpg files. It will try to work it out but if it can't will use this. -readonly DEFAULTMPEG2ASPECT="NA" # 4:3 or 16:9 -# What to separate Title SeasonEpisode SubTitle with -readonly SEP="," -# Crop input -CROP="ON" # ON | OFF, can also change with --crop argument -# Delete recording after successful transcode. Only for transcode out of MythRecording. (Actually just sets to high priority autoexpire.) -DELETEREC="OFF" # ON | OFF, can also change with --deleterec argument -# Include denoise filter -DENOISE="OFF" # ON | OFF, can also change with --denoise argument -# Include deblock filter -DEBLOCK="OFF" # ON | OFF, can also change with --deblock argument -# Include deinterlace filter. -# SOURCENAME is ON for that source. Can have multiple. e.g. DEINTERLACE="Cabel,FTA1" -DEINTERLACE="ON" # ON | OFF | SOURCENAME,SOURCENAME can also change with --deinterlace argument. -# Include inverse Telecine filter (Experimental. Can someone from NTSC/ATSC land try this?). -# invtelecine filter is never added if deinterlace has been added. -INVTELECINE="OFF" # ON | OFF, can also change with --invtelecine argument. -# number passes -PASS="two" # one | two, can also change with --pass argument -# number of threads. Only used by lavc and xvid (x.264 auto calculates threads) -THREADS=1 -# avi encoder lavc or xvid -AVIVID="lavc" # lavc | xvid, can also change with --contype=avi,xvid argument -# container -CONTYPE="mkv" # mkv | mp4 | avi, can also change with --contype argument or name of script. -# mkv audio encoder aac or ogg -MKVAUD="aac" # aac | ogg, can also change with --contype=mkv,ogg argument -# add your own filters if you want -POSTVIDFILTERS="" #must include , at end -ENDVIDFILTERS="" #must include , at end -########################################################################################################## -USAGE='mythnuv2mkv.sh [--jobid=%JOBID%] [--contype=avi|mkv|mp4] [--quality=low|med|high|480|576|720|1080] [--pass=one|two] [--denoise=ON|OFF] [--deblock=ON|OFF] [--deleterec=ON|OFF] [--crop=ON|OFF] [--deinterlace=ON|OFF|SOURCENAME] [--invtelecine=ON|OFF] [--maxrunhours=int] [--findtitle=string] [--copydir=directory] "--chanid=chanid --starttime=starttime" | file ... -Must have either --chanid=chanid and --starttime=starttime or a plain filename. These can be mixed. e.g. - -mythnuv2mkv.sh --chanid=1232 --starttime=20071231235900 video1 video2 --chanid=1235 --starttime=20071231205900 ---jobid=%JOBID% - Add this when run as a User Job. Enables update status in the System Status Job Queue screen and the Job Queue Comments field in MythWeb. Also enables stop/pause/resume of job. ---contype=avi|mkv|mp4 (default name of script. e.g. mythnuv2mkv.sh will default to mkv. mythnuv2avi.sh will default to avi) - (Note Videos staying in MythRecord will always default to avi) - avi - Video mpeg4 Audio mp3 (--contype=avi,xvid will use xvid instead of lavc) - mkv - Video h.264 Audio aac (--contype=mkv,ogg will use ogg Vorbis Audio) - mp4 - Video h.264 Audio aac ---quality=low|med|high|720|1080 (default med) Mostly affects resolution. - low - 448x336(4:3) or 592x336(16:9) - med - 512x384(4:3) or 624x352(16:9) - high - 528x400(4:3) or 656x368(16:9) - 480 - 640x480(4:3) or 848x480(16:9) - 576 - 768x576(4:3) or 1024x576(16:9) - 720 - 1280x720(16:9) (You probably need VDAPU to play this) - 1080 - 1920x1088(16:9) (You probably need VDAPU to play this) ---pass=one|two (default two) - --quality --pass and --contype can be passed as any argument and will only take effect on files after them. - e.g. mythnuv2mkv.sh videofile1 --chanid=2033 --starttime=20070704135700 --pass=one video3 --quality=low video4 - videofile1 and chanid=2033/starttime=20070704135700 will be two pass med quality (defaults) - video3, one pass med quality - video4, one pass low quality ---maxrunhours=int (default process all files) - Stop processing files after int hours. (Will complete the current file it is processing.) ---findtitle="string" - Prints tile, chanid, starttime of programs matching string. ---copydir=directory - mkv/mp4/avi file will be created in directory. Source nuv will be retained. i.e you are copying the source rather than replacing it. - If the source was a CHANID/STARTIME it will be renamed to TITLE,S##E##,SUBTITLE. S##E## is the Season and Episode number. All punctuation characters are removed. - If directory is under MythVideoDir, imdb will be searched, a MythVideo db entry created and a coverfile file created if one was not available at imdb. ---denoise=[ON|OFF] (default OFF) - Include hqdn3d denoise filter. ---deblock=[ON|OFF] (default OFF) - Include pp7 deblock filter. ---deleterec=[ON|OFF] (default OFF) - Delete the recording after successful transcode. (Actually just sets high priority autoexpire and moves to Deleted group.) ---crop=[ON|OFF] (default ON) - Crop 8 pixels of each side. ---deinterlace==[ON|OFF|SOURCENAME] (default ON) - Include pp=fd deinterlace filter. - SOURCENAME is ON for that source. Can have multiple. e.g. DEINTERLACE="Cabel,FTA1" ---invtelecine=[ON|OFF] (default OFF) - Include pullup inverse telecine filter. - Note/ This filter will not be added if a deinterlace filter has been added. - -Logs to /var/tmp/mythnuv2mkvPID.log and to database if "log MythTV events to database" is enabled in mythtv. -Cutlists are always honored. -Sending the mythnuv2mkv.sh process a USR1 signal will cause it to stop after completing the current file. -e.g. kill -s USR1 PID -If run as a Myth Job, you can find the PID in the System Status Job Queue or Log Entries screens as [PID] - -Typical usage. - -Myth User Job -PATH/mythnuv2mkv.sh --jobid=%JOBID% --copydir /mythvideodirectory --chanid=%CHANID% --starttime=%STARTTIME% -This will convert nuv to mkv and copy it to /mythvideodirectory. -This is what I do. Record things in Myth Recording and anything I want to keep, use this to convert to mkv and store in Myth Video. -NOTE. System Status Job Queue screen and the Job Queue Comments field in MythWeb always report job Completed Successfully even if it actually failed. - -Myth Video -Record program -mythrename.pl --link --format %T-%S --underscores --verbose (mythrename.pl is in the mythtv contrib directory -cp from your mythstore/show_names/PROGRAM to your MythVideo directory -use video manager to add imdb details -nuv files work fine in MythVideo, but if you need to convert them to mkv/mp4/avi, or need to reduce their size -run mythnuv2mkv.sh MythVideo_file.nuv - -Myth Recording -Record program -run mythnuv2mkv.sh --findtitle="title name" -get chanid and starttime -run mythnuv2mkv.sh --chanid=chanid --starttime=starttime -NOTE You cannot edit a avi/mp4/mkv file in Myth Recording. So do all your editing in the nuv file before you convert to avi. -NOTE You cannot play a mkv/mp4 file in Myth Recording. -I would in general recommend leaving everything in Myth Recording as nuv. - -Version: $Revision: 1.44 $ $Date: 2009/03/18 20:11:57 $ -' -REQUIREDAPPS=' -Required Applications -For all contypes -mythtranscode. -perl -mplayer http://www.mplayerhq.hu/design7/news.html -mencoder http://www.mplayerhq.hu/design7/news.html -wget http://www.gnu.org/software/wget/ -ImageMagick http://www.imagemagick.org/script/index.php -For avi -mp3lame http://www.mp3dev.org -xvid http://www.xvid.org/ -For mkv and mp4 contypes -x264 http://www.videolan.org/developers/x264.html -faac http://sourceforge.net/projects/faac/ -faad2 http://sourceforge.net/projects/faac/ -For mkv contype -mkvtoolnix http://www.bunkus.org/videotools/mkvtoolnix/ -For mkv,ogg contype -vorbis-tools http://www.vorbis.com/ -For mp4 contype -MP4Box http://gpac.sourceforge.net/index.php -' -HELP=${USAGE}${REQUIREDAPPS} - -##### Mapping ############################################################################################# -# Maps tvguide categories to mythvideo ones. This will need to be managed individually. -# Either use the defaults below or create a mythnuv2mkv-category-mappings file in the same -# directory as this and enter data same format as below. -readonly CMAPFILE="$(dirname ${0})/mythnuv2mkv-category-mappings" -if [ -f "$CMAPFILE" ] -then - . "$CMAPFILE" -else - # NOTE: Remove any spaces from XMLTV category. e.g. "Mystery and Suspense" is MysteryandSuspense - # XMLTV Category ; Myth videocategory - readonly Animated=1 ; mythcat[1]="Animation" - readonly Biography=2 ; mythcat[2]="Documentary" - readonly Historical=3 ; mythcat[3]="Documentary" - readonly CrimeDrama=4 ; mythcat[4]="CrimeDrama" - readonly MysteryandSuspense=5 ; mythcat[5]="Mystery" - readonly Technology=6 ; mythcat[6]="Documentary" - readonly ScienceFiction=7 ; mythcat[7]="Sci-Fi" - readonly Science_Fiction=8 ; mythcat[8]="Sci-Fi" - readonly art=9 ; mythcat[9]="Musical" - readonly History=10 ; mythcat[10]="Documentary" - readonly SciFi=11 ; mythcat[11]="Sci-Fi" - readonly ScienceNature=12 ; mythcat[12]="Science" -fi - -########################################################################################################### -PATH=~mythtv/bin:${HOME}/bin:$PATH:/usr/local/bin -readonly AVIREQPROGS="mencoder mythtranscode mplayer perl wget convert" -readonly AVIREQLIBS="libmp3lame.so libxvidcore.so" -readonly MP4REQPROGS="mencoder mythtranscode mplayer perl wget convert faac MP4Box" -readonly MP4REQLIBS="libx264.so libfaac.so" -readonly MKVREQPROGS="mencoder mythtranscode mplayer perl wget convert faac oggenc mkvmerge" -readonly MKVREQLIBS="libx264.so libfaac.so" -########################################################### -readonly DENOISEFILTER="hqdn3d" -readonly DEBLOCKFILTER="pp7" -readonly DEINTERLACEFILTER="pp=fd" -readonly INVTELECINEFILTER="pullup" -readonly FAACCHANCONFIG="-I 5,6" -readonly CROPSIZE=8 -readonly TE_SCALE43="NA" # NA -readonly ST_SCALE43="NA" # NA -readonly FE_SCALE43="640:480" # 1.32 -readonly FS_SCALE43="768:576" # 1.32 -readonly HIGH_SCALE43=528:400 # 1.32 -readonly MED_SCALE43=512:384 # 1.333 -readonly LOW_SCALE43=448:336 # 1.333 -readonly TE_SCALE169="1920:1088" # 1.778 -readonly ST_SCALE169="1280:720" # 1.778 -readonly FE_SCALE169="848:480" # 1.766 -readonly FS_SCALE169="1024:576" # 1.778 -readonly HIGH_SCALE169=656:368 # 1.783 -readonly MED_SCALE169=624:352 # 1.773 -readonly LOW_SCALE169=592:336 # 1.762 -# Default -SCALE43=$MED_SCALE43 -SCALE169=$MED_SCALE169 -########################################################### -## CQ ## Quote from mencoder documentation -#The CQ depends on the bitrate, the video codec efficiency and the movie resolution. In order to raise the CQ, typically you would -#downscale the movie given that the bitrate is computed in function of the target size and the length of the movie, which are constant. -#With MPEG-4 ASP codecs such as Xvid and libavcodec, a CQ below 0.18 usually results in a pretty blocky picture, because there are -#not enough bits to code the information of each macroblock. (MPEG4, like many other codecs, groups pixels by blocks of several pixels -#to compress the image; if there are not enough bits, the edges of those blocks are visible.) It is therefore wise to take a CQ ranging -# from 0.20 to 0.22 for a 1 CD rip, and 0.26-0.28 for 2 CDs rip with standard encoding options. More advanced encoding options such as -#those listed here for libavcodec and Xvid should make it possible to get the same quality with CQ ranging from 0.18 to 0.20 for a 1 CD -#rip, and 0.24 to 0.26 for a 2 CD rip. With MPEG-4 AVC codecs such as x264, you can use a CQ ranging from 0.14 to 0.16 with standard -#encoding options, and should be able to go as low as 0.10 to 0.12 with x264's advanced encoding settings. -######################## -# These map to --quality=low|med|high option. -#### AVI lavc mpeg4 #### -readonly HIGH_LAVC_CQ=0.22 -readonly MED_LAVC_CQ=0.21 -readonly LOW_LAVC_CQ=0.20 -readonly HIGH_LAVC_OPTS="vcodec=mpeg4:threads=${THREADS}:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6" -# high, med & low will use same settings just CQ and resolution different -# This make encoding slow. Swap following if you want lower quality to also mean faster encoding speed. -#readonly MED_LAVC_OPTS="vcodec=mpeg4:mbd=2:trell:v4mv" -#readonly LOW_LAVC_OPTS="vcodec=mpeg4:mbd=2" -readonly MED_LAVC_OPTS="$HIGH_LAVC_OPTS" -readonly LOW_LAVC_OPTS="$HIGH_LAVC_OPTS" -#### AVI xvid mpeg4 #### -readonly HIGH_XVID_CQ=0.22 -readonly MED_XVID_CQ=0.21 -readonly LOW_XVID_CQ=0.20 -readonly HIGH_XVID_OPTS="threads=${THREADS}:quant_type=mpeg:me_quality=6:chroma_me:chroma_opt:trellis:hq_ac:vhq=4:bvhq=1" -readonly MED_XVID_OPTS="$HIGH_XVID_OPTS" -readonly LOW_XVID_OPTS="$HIGH_XVID_OPTS" -#### AVI lavc/xvid mp3 #### -readonly HIGH_MP3_ABITRATE=256 -readonly MED_MP3_ABITRATE=192 -readonly LOW_MP3_ABITRATE=128 -#### MP4/MKV h.263/aac,ogg #### -readonly HIGH_X264_CQ=0.15 -readonly MED_X264_CQ=0.14 -readonly LOW_X264_CQ=0.13 -# H.264 Extended profile (quicktime) level set in QLEVEL -readonly HIGH_X264EXT_OPTS="nocabac:bframes=2:nob_pyramid:threads=auto:direct_pred=auto:subq=6:frameref=5" -# high, med & low will use same settings just CQ and resolution different -# This make encoding slow. Swap following if you want lower quality to also mean faster encoding speed. -#readonly MED_X264EXT_OPTS="level_idc=31:nocabac:bframes=2:nob_pyramid:threads=auto:subq=5:frameref=4" -#readonly LOW_X264EXT_OPTS="level_idc=31:nocabac:bframes=2:nob_pyramid:threads=auto:subq=4:frameref=3" -readonly MED_X264EXT_OPTS="$HIGH_X264EXT_OPTS" -readonly LOW_X264EXT_OPTS="$HIGH_X264EXT_OPTS" -# H.264 High profile level set in QLEVEL -readonly HIGH_X264HIGH_OPTS="bframes=3:b_pyramid:weight_b:threads=auto:direct_pred=auto:subq=6:frameref=5:partitions=all:8x8dct:mixed_refs:me=umh:trellis=1" -# high, med & low will use same settings just CQ and resolution different -# This make encoding slow. Swap following if you want lower quality to also mean faster encoding speed. -#readonly MED_X264HIGH_OPTS="level_idc=31:bframes=3:b_pyramid:weight_b:threads=auto:subq=5:frameref=4:8x8dct" -#readonly LOW_X264HIGH_OPTS="level_idc=31:bframes=3:b_pyramid:weight_b:threads=auto:subq=4:frameref=3" -readonly MED_X264HIGH_OPTS="$HIGH_X264HIGH_OPTS" -readonly LOW_X264HIGH_OPTS="$HIGH_X264HIGH_OPTS" -# AAC -readonly HIGH_AAC_AQUAL=100 -readonly MED_AAC_AQUAL=90 -readonly LOW_AAC_AQUAL=80 -# OGG -readonly HIGH_OGG_AQUAL=6 -readonly MED_OGG_AQUAL=5 -readonly LOW_OGG_AQUAL=4 -# Defaults -LAVC_OPTS=$MED_LAVC_OPTS -LAVC_CQ=$MED_LAVC_CQ -XVID_OPTS=$MED_XVID_OPTS -XVID_CQ=$MED_XVID_CQ -MP3_ABITRATE=$MED_MP3_ABITRATE -AAC_AQUAL=$MED_AAC_AQUAL -OGG_AQUAL=$MED_OGG_AQUAL -X264EXT_OPTS="level_idc=31:$MED_X264EXT_OPTS" -X264_OPTS="level_idc=31:$MED_X264HIGH_OPTS" -X264_CQ=$MED_X264_CQ -if echo "$(basename $0)" | grep -i 'mkv' >/dev/null 2>&1 -then - CONTYPE="mkv" - QUICKTIME_MP4="NO" -elif echo "$(basename $0)" | grep -i 'mp4' >/dev/null 2>&1 -then - CONTYPE="mp4" - QUICKTIME_MP4="NO" -elif echo "$(basename $0)" | grep -i 'mov' >/dev/null 2>&1 -then - #TODO. Not working yet don't use mov - CONTYPE="mp4" - QUICKTIME_MP4="YES" -elif echo "$(basename $0)" | grep -i 'avi' >/dev/null 2>&1 -then - CONTYPE="avi" - QUICKTIME_MP4="NO" -fi -########################################################### -# ON or OFF -# debug mode -DEBUG="OFF" -DEBUGSQL="OFF" -DEBUGSG="OFF" -# Print INFO messages -INFO="ON" -# Save(via a rename) or delete nuv file. Only for transcode back into MythRecording. -SAVENUV="OFF" - -[ "$DEBUGSQL" = "ON" ] && DEBUG="ON" - -##### Functions ########################################### -scriptlog() { -local LEVEL="$1" -shift -local PRIORITY -local HIGHLIGHTON -local HIGHLIGHTOFF - if [ "$LEVEL" = "BREAK" ] - then - echo "--------------------------------------------------------------------------------" | tee -a $LOGFILE - return 0 - elif [ "$LEVEL" = "ERROR" ] - then - PRIORITY=4 - HIGHLIGHTON="${REDFG}" - HIGHLIGHTOFF="${COLOURORIG}" - # Global - FINALEXIT=1 - elif [ "$LEVEL" = "SUCCESS" ] - then - PRIORITY=5 - HIGHLIGHTON="${GREENFG}" - HIGHLIGHTOFF="${COLOURORIG}" - elif [ "$LEVEL" = "START" -o "$LEVEL" = "STOP" ] - then - PRIORITY=5 - HIGHLIGHTON="${BOLDON}" - HIGHLIGHTOFF="${ALLOFF}" - elif [ "$LEVEL" = "DEBUG" ] - then - [ "$DEBUG" = "ON" ] || return - PRIORITY=7 - HIGHLIGHTON="" - HIGHLIGHTOFF="" - elif [ "$LEVEL" = "NOHEADER" ] - then - # Also no db logging - echo "$*" | tee -a $LOGFILE - return - else - [ "$INFO" = "ON" ] || return - LEVEL="INFO" - PRIORITY=6 - HIGHLIGHTON="" - HIGHLIGHTOFF="" - fi - echo "${HIGHLIGHTON}$(date +%d/%m,%H:%M) [${$}] $LEVEL $*${HIGHLIGHTOFF}" | tee -a $LOGFILE - - [ "$DBLOGGING" -eq 1 ] && insertmythlogentry "$PRIORITY" "$LEVEL" "${$}" "$*" -} - -chkreqs() { -local REQPROGS="$1" -local REQLIBS="$2" -local TMP -local MENCODER - for TMP in $REQPROGS - do - if ! which "$TMP" >/dev/null 2>&1 - then - scriptlog ERROR "Can't find program $TMP." - scriptlog ERROR "$REQUIREDAPPS" - return 1 - fi - done - MENCODER=$(which mencoder) - for TMP in $REQLIBS - do - if ! ldd $MENCODER | grep -i "${TMP}.*=>.*${TMP}" >/dev/null 2>&1 - then - scriptlog ERROR "mencoder may not support $TMP." - scriptlog ERROR "$REQUIREDAPPS" - return 1 - fi - done - return 0 -} - -versioncheck() { -local PRODUCT="$1" - case $PRODUCT in - mkvmerge) - VER=$(mkvmerge -V | awk '/mkvmerge/ {print $2}') - OLDIFS="$IFS"; IFS="."; set - $VER; IFS="$OLDIFS" - MAJ=$(echo "$1" | tr -d [:alpha:]); MIN="$2"; PAT="$3" - MKVMERGE251BUG="NO" - if [ "$VER" = "v2.5.1" ] - then - scriptlog INFO "mkvmerge v2.5.1. There is a known bug with this version. Workaround applied." - MKVMERGE251BUG="YES" - elif [ "$MAJ" -lt 2 -o \( "$MAJ" -eq 2 -a "$MIN" -lt 2 \) ] - then - scriptlog INFO "mkvmerge $VER. This will not work with 29.97 fps video (NTSC). You need at least v2.2.0" - fi - scriptlog DEBUG "mkvmerge $VER" - ;; - esac -} - -calcbitrate() { -local ASPECT=$1 -local SCALE=$2 -local CQ=$3 -local W -local H -local BITRATE - W=$(echo $SCALE | cut -d ':' -f1) - H=$(echo $SCALE | cut -d ':' -f2) - BITRATE=$(echo "((($H^2 * $ASPECT * 25 * $CQ) / 16 ) * 16) / 1000" | bc) - echo $BITRATE -} - -getsetting() { -local VALUE="$1" -local HOST=$(hostname) -local DATA - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select data from settings where value = "$VALUE" and hostname like "${HOST}%"; - EOF) - if [ -z "$DATA" ] - then - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select data from settings where value = "$VALUE" and (hostname is NULL or hostname = ""); - EOF) - fi - echo "$DATA" -} - -getstoragegroupdirs() { - mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select distinct dirname from storagegroup; - EOF -} - -hascutlist() { -local CHANID="$1" -local STARTTIME="$2" -local DATA - [ -n "$CHANID" ] || return 1 - DATA=$(mysql --batch --skip-column-name --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select cutlist from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - [ "$DATA" -eq 1 ] && return 0 || return 1 -} - -getrecordfile() { -local CHANID="$1" -local STARTTIME="$2" -local DEBUG="$3" -local HOST=$(hostname) -local DATA -local RECFILE - [ -n "$CHANID" ] || return 1 - # Storage groups - if [ "$DEBUG" = "ON" ] - then - scriptlog INFO "CHANID $CHANID STARTTIME $STARTTIME HOST $HOST" - DATA=$(mysql --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select * from storagegroup; - select chanid,starttime,title,subtitle,basename,storagegroup from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - scriptlog INFO "Tables" - scriptlog NOHEADER "$DATA" - fi - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select concat(a.dirname, "/", b.basename) from storagegroup a, recorded b where b.chanid = $CHANID and b.starttime = "$STARTTIME" and b.storagegroup = a.groupname and a.hostname like "${HOST}%"; - EOF) - [ "$DEBUG" = "ON" ] && scriptlog INFO "Try 1 Data $DATA" - while read RECFILE - do - [ "$DEBUG" = "ON" ] && scriptlog INFO "Try 1 Check $RECFILE" - [ -f "${RECFILE}" ] && break - done < <(echo "$DATA") - if [ ! -f "$RECFILE" ] - then - # Pre Storage groups - local RFP=$(getsetting RecordFilePrefix) - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select concat("$RFP", "/", basename) from recorded where chanid = $CHANID and starttime = "$STARTTIME" limit 1; - EOF) - [ "$DEBUG" = "ON" ] && scriptlog INFO "Try 2 $RFP,$DATA" - RECFILE="$DATA" - fi - [ -f "$RECFILE" ] && echo "$RECFILE" -} - -getsourcename() { -local CHANID="$1" - [ -n "$CHANID" ] || return 1 - mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select b.displayname from channel a, cardinput b where a.chanid = $CHANID and a.sourceid = b.sourceid; - EOF -} - -gettitle() { -local CHANID="$1" -local STARTTIME="$2" - [ -n "$CHANID" ] || return 1 - mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select title, subtitle from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF -} - -findchanidstarttime() { -local SEARCHTITLE="$1" - mysql --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select title, subtitle, chanid, date_format(starttime, '%Y%m%d%H%i%s'), storagegroup from recorded where title like "%${SEARCHTITLE}%"; - EOF -} - -updatemetadata() { -local NEW="$1" -local CHANID="$2" -local STARTTIME="$3" -local NFSIZE - NFSIZE=$(stat -c %s "$NEW") - NEW=$(basename "$NEW") - mysql --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - update recorded set - basename = "$NEW", - filesize = $NFSIZE, - bookmark = 0, - editing = 0, - cutlist = 0, - commflagged = 0 - where chanid = $CHANID and starttime = "$STARTTIME"; - delete from recordedmarkup where chanid = $CHANID and starttime = "$STARTTIME"; - delete from recordedseek where chanid = $CHANID and starttime = "$STARTTIME"; - EOF -} - -createvideocover() { -local FILENAME="$1" -local ASPECT="$2" -local THDIR="${FIFODIR}/THDIR" -local THUMB_NAME=$(basename "$FILENAME" | sed -e 's/\.[am][vkp][iv4]$/\.png/') -local THUMB_PATH="${CFDIR}/${THUMB_NAME}" -local CURWD -local TH - { - CURWD=$(pwd) - mkdir $THDIR && cd $THDIR || return 1 - nice -19 mplayer -really-quiet -nojoystick -nolirc -nomouseinput -ss 00:02:00 -aspect $ASPECT -ao null -frames 50 -vo png:z=5 "$FILENAME" - TH=$(ls -1rt | tail -1) - [ -f "$TH" ] || return - if [ $ASPECT = "16:9" ] - then - convert "$TH" -resize 720x404! THWS.png - else - cp "$TH" THWS.png - fi - mv THWS.png "$THUMB_PATH" - cd $CURWD - rm -rf "$THDIR" - } >/dev/null 2>&1 - echo "$THUMB_PATH" -} - -getsearchtitle() { -local CHANID="$1" -local STARTTIME="$2" -local TI -local ST -local SEARCHTITLE - [ -n "$CHANID" ] || return 1 - TI=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select title from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - ST=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select subtitle from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - if [ -n "$TI" -a -n "$ST" ] - then - SEARCHTITLE="${TI}:${ST}" - elif [ -n "$TI" ] - then - SEARCHTITLE="${TI}" - fi - echo $SEARCHTITLE -} - -lookupinetref() { -# : is used to separate Title and SubTitle in SEARCHTITLE -local SEARCHTITLE="$1" -local CHANID="$2" -local STARTTIME="$3" -local IMDBCMD -local IMDBRES -local IMDBSTR="" -# INETREF will be 00000000 if not found -local INETREF=00000000 -local SERIES -local EPISODE -local YEAR -local TMP - { - IMDBCMD=$(getsetting MovieListCommandLine) - # This is dependent on imdb.pl and will not work with any MovieListCommandLine due to use of s=ep option. - set - $IMDBCMD - IMDBCMD="$1 $2" - IMDBRES=$($IMDBCMD "$SEARCHTITLE") - if [ -n "$IMDBRES" -a $(echo "$IMDBRES" | wc -l) -eq 1 ] - then - IMDBSTR="$IMDBRES" - elif [ -n "$CHANID" ] - then - YEAR=$(getyear $CHANID $STARTTIME) - if [ "$YEAR" -gt 1800 ] - then - for C in 0 1 -1 - do - TMP=$(echo "$IMDBRES" | grep $(( $YEAR + $C ))) - [ -n "$TMP" -a $(echo "$TMP" | wc -l) -eq 1 ] && IMDBSTR="$TMP" && break - done - fi - fi - if [ -n "$IMDBSTR" ] - then - INETREF=$(echo "$IMDBSTR" | awk -F'[^0-9]' '{print $1}') - echo $INETREF | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]*$' >/dev/null 2>&1 || INETREF=00000000 - fi - if [ "$INETREF" -eq 00000000 ] - then - # Try looking for episode - OLDIFS="$IFS"; IFS=":"; set - $SEARCHTITLE; IFS="$OLDIFS" - SERIES="$1" ; EPISODE="$2" - if [ -n "$SERIES" -a -n "$EPISODE" ] - then - # option s=ep is for episode lookup - IMDBSTR=$($IMDBCMD s=ep "$EPISODE") - if which agrep >/dev/null 2>&1 - then - IMDBSTR=$(echo "$IMDBSTR" | agrep -i -s -2 "$SERIES" | sort -n | head -1 | cut -d':' -f2-) - else - IMDBSTR=$(echo "$IMDBSTR" | grep -i "$SERIES") - fi - if [ $(echo "$IMDBSTR" | wc -l) -eq 1 ] - then - INETREF=$(echo "$IMDBSTR" | awk -F'[^0-9]' '{print $1}') - echo $INETREF | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]*$' >/dev/null 2>&1 || INETREF=00000000 - fi - fi - fi - scriptlog DEBUG "inetref $INETREF" - } >/dev/null 2>&1 - echo $INETREF -} - -getseriesepisode() { -local CHANID="$1" -local STARTTIME="$2" -local INETREF="$3" -local DATA -local SE - [ -n "$CHANID" ] || return 1 - { - # STARTTIME is not always the same in both tables for matching programs. ??? - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select syndicatedepisodenumber from recorded a,recordedprogram b - where a.chanid = $CHANID and a.starttime = "$STARTTIME" and a.chanid = b.chanid - and a.title = b.title and a.subtitle = b.subtitle; - EOF) - DATA=$(echo "$DATA" | awk -F '[SE]' '/S/ {printf("S%02dE%02d\n",$3,$2)}') - if echo "$DATA" | grep '^S[0-9][0-9]E[0-9][0-9]$' >/dev/null 2>&1 - then - SE="$DATA" - elif [ $INETREF -gt 0 ] - then - # Lets try passing imdb page - wget -o /dev/null -O "${FIFODIR}/${INETREF}.html" "http://www.imdb.com/title/tt${INETREF}/" - SE=$(awk '/Season.*Episode/ { - a=match($0,/Season ([0-9]+)/,s);b=match($0,/Episode ([0-9]+)/,e);if(a>0 && b>0){printf("S%02dE%02d\n",s[1],e[1]);exit} - }' "${FIFODIR}/${INETREF}.html") - fi - scriptlog DEBUG "series episode $SE" - } >/dev/null 2>&1 - echo "$SE" | grep '^S[0-9][0-9]E[0-9][0-9]$' -} - -createfiletitleSEsubtitle() { -local CHANID="$1" -local STARTTIME="$2" -local SE="$3" -local DATA -local T -local S - [ -n "$CHANID" ] || return 1 - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select title from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - T=$(echo $DATA | tr -d '[:cntrl:]' | tr -d '[:punct:]' | tr '[:space:]' '_') - - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select subtitle from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - S=$(echo $DATA | tr -d '[:cntrl:]' | tr -d '[:punct:]' | tr '[:space:]' '_') - - if [ -n "$T" -a -n "$SE" -a -n "$S" ] - then - echo "${T}${SEP}${SE}${SEP}${S}" - elif [ -n "$T" -a -n "$S" ] - then - echo "${T}${SEP}${S}" - else - echo "${T}" - fi -} - -createvideometadata() { -local FILENAME="$1" -local TITLE="$2" -local ASPECT="$3" -local CHANID="$4" -local STARTTIME="$5" -local INETREF="$6" -# SE may be null -local SE="$7" -local DIRECTOR="Unknown" -#local PLOT="None" -local PLOT="$(getplot $CHANID $STARTTIME)" -local MOVIERATING="NR" -#local YEAR=1895 -local YEAR="$(getyear $CHANID $STARTTIME)" -local USERRATING=0 -local RUNTIME=0 -local COVERFILE="No Cover" -local GENRES="" -local COUNTRIES="" -local CATEGORY="" -local TI -local ST -local IMDBCMD -local IMDBSTR -local GTYPE -local TH -local SE -local S -local E -local WHERE -local INSERT -local TMP -local IDS -local INTID -local COUNT - # Title name generation is a mess. Should do something better - if hasvideometadata "$FILENAME" - then - scriptlog INFO "$FILENAME already has a videometdata entry" - return 0 - else - # Since I strip special characters in TITLE, use chanid/starttime for metadata title. - if [ -n "$CHANID" ] - then - TI=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select title from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - ST=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select subtitle from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - if [ -n "$TI" -a -n "$SE" -a -n "$ST" ] - then - TITLE="\\\"${TI}\\\" ${SE} ${ST}" - elif [ -n "$TI" -a -n "$ST" ] - then - TITLE="\\\"${TI}\\\" ${ST}" - elif [ -n "$TI" ] - then - TITLE="${TI}" - fi - fi - if [ $INETREF -gt 0 ] - then - IMDBCMD=$(getsetting MovieDataCommandLine) - IMDBSTR=$($IMDBCMD $INETREF | sed -e 's/"/\\"/g') - TMP=$(echo "$IMDBSTR" | grep '^Title' | cut -d':' -f2- | sed -e 's/^ *//') - if [ -n "$TMP" ] - then - # Try and put series and episode number back in. Based on imdb placing quotes around series name. A bit dodgy - if [ -n "$SE" ] - then - TMP=$(echo "$TMP" | awk -v s=${SE} '{ - r=match($0,/"(.*)" (.*)/,m) - if(r>0) { print("\\\""m[1]"\\\" "s" "m[2]) } - else { print($0) } - }' | sed -e 's/\\\\"/\\"/g') - fi - TITLE="$TMP" - fi - TMP=$(echo "$IMDBSTR" | grep '^Year' | cut -d':' -f2- | sed -e 's/^ *//') - [ -n "$TMP" ] && YEAR="$TMP" - TMP=$(echo "$IMDBSTR" | grep '^Director' | cut -d':' -f2- | sed -e 's/^ *//') - [ -n "$TMP" ] && DIRECTOR="$TMP" - TMP=$(echo "$IMDBSTR" | grep '^Plot' | cut -d':' -f2- | sed -e 's/^ *//') - [ -n "$TMP" ] && PLOT="$TMP" - TMP=$(echo "$IMDBSTR" | grep '^UserRating' | grep -v '[<>\"]' | cut -d':' -f2- | sed -e 's/^ *//') - [ -n "$TMP" ] && USERRATING="$TMP" - TMP=$(echo "$IMDBSTR" | grep '^MovieRating' | cut -d':' -f2- | sed -e 's/^ *//') - [ -n "$TMP" ] && MOVIERATING="$TMP" - TMP=$(echo "$IMDBSTR" | grep '^Runtime' | cut -d':' -f2- | sed -e 's/^ *//') - [ -n "$TMP" ] && RUNTIME="$TMP" - IMDBCMD=$(getsetting MoviePosterCommandLine) - IMDBCOVER=$($IMDBCMD $INETREF) - if [ -n "$IMDBCOVER" ] - then - GTYPE=$(echo $IMDBCOVER | sed -e 's/.*\(\....\)/\1/') - wget -o /dev/null -O ${CFDIR}/${INETREF}${GTYPE} $IMDBCOVER - [ -f ${CFDIR}/${INETREF}${GTYPE} ] && COVERFILE="${CFDIR}/${INETREF}${GTYPE}" - fi - TMP=$(echo "$IMDBSTR" | grep '^Genres' | cut -d':' -f2- | sed -e 's/^ *//') - [ -n "$TMP" ] && GENRES="$TMP" - TMP=$(echo "$IMDBSTR" | grep '^Countries' | cut -d':' -f2- | sed -e 's/^ *//') - [ -n "$TMP" ] && COUNTRIES="$TMP" - fi - if ! [ -f "$COVERFILE" ] - then - scriptlog INFO "Creating cover file." - TH=$(createvideocover "$FILENAME" $ASPECT) - [ -f ${TH} ] && COVERFILE="${TH}" - fi - scriptlog INFO "Creating videometadata entry. Inetref:$INETREF. Title:$TITLE" - if [ "$DEBUGSQL" = "ON" ] - then - cat <<-EOF - insert into videometadata set - title = "$TITLE", - director = "$DIRECTOR", - plot = "$PLOT", - rating = "$MOVIERATING", - inetref = "$INETREF", - year = $YEAR, - userrating = $USERRATING, - length = $RUNTIME, - showlevel = 1, - filename = "$FILENAME", - coverfile = "$COVERFILE", - childid = -1, - browse = 1, - playcommand = NULL, - category = 0; - EOF - fi - mysql --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - insert into videometadata set - title = "$TITLE", - director = "$DIRECTOR", - plot = "$PLOT", - rating = "$MOVIERATING", - inetref = "$INETREF", - year = $YEAR, - userrating = $USERRATING, - length = $RUNTIME, - showlevel = 1, - filename = "$FILENAME", - coverfile = "$COVERFILE", - childid = -1, - browse = 1, - playcommand = NULL, - category = 0; - EOF - CATEGORY=$(getcategory "$CHANID" "$STARTTIME") - if [ -n "$GENRES" -o -n "$COUNTRIES" -o -n "$CATEGORY" ] - then - INTID=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select intid from videometadata where filename = "$FILENAME"; - EOF) - fi - if [ -n "$INTID" ] - then - # This will not create new genres, countries or categories. - if [ -n "$GENRES" ] - then - scriptlog DEBUG "Will check for genres $GENRES" - OLDIFS="$IFS"; IFS=','; set - $GENRES; IFS="$OLDIFS" - COUNT="$#" - WHERE="" - for TMP in "$@" - do - TMP=$(echo $TMP | tr [A-Z] [a-z]) - [ -n "$WHERE" ] && WHERE="$WHERE or lcase(genre) = \"$TMP\"" || WHERE="where lcase(genre) = \"$TMP\"" - done - [ "$DEBUGSQL" = "ON" ] && echo "select intid from videogenre $WHERE" - IDS=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select intid from videogenre $WHERE; - EOF) - for TMP in $IDS - do - INSERT="$INSERT insert into videometadatagenre set idvideo = $INTID, idgenre = $TMP;" - done - [ "$COUNT" -gt $(echo "$IDS" | wc -l) ] && scriptlog INFO "Not all genres $GENRES found" - fi - - if [ -n "$COUNTRIES" ] - then - scriptlog DEBUG "Will check for countries $COUNTRIES" - OLDIFS="$IFS"; IFS=','; set - $COUNTRIES; IFS="$OLDIFS" - COUNT="$#" - WHERE="" - for TMP in "$@" - do - TMP=$(echo $TMP | tr [A-Z] [a-z]) - [ -n "$WHERE" ] && WHERE="$WHERE or lcase(country) = \"$TMP\"" || WHERE="where lcase(country) = \"$TMP\"" - done - [ "$DEBUGSQL" = "ON" ] && echo "select intid from videocountry $WHERE" - IDS=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select intid from videocountry $WHERE; - EOF) - for TMP in $IDS - do - INSERT="$INSERT insert into videometadatacountry set idvideo = $INTID, idcountry = $TMP;" - done - [ "$COUNT" -gt $(echo "$IDS" | wc -l) ] && scriptlog INFO "Not all countries $COUNTRIES found" - fi - - if [ -n "$CATEGORY" ] - then - CATEGORY=$(echo "$CATEGORY" | tr -d ' ') - OLDIFS="$IFS"; IFS='/'; set - $CATEGORY; IFS="$OLDIFS" - for TMP in "$@" - do - # Use mappings - [ -n "${mythcat[$TMP]}" ] && TMP=${mythcat[$TMP]} - [ "$DEBUGSQL" = "ON" ] && echo "select intid from videocategory where lcase(category) = lcase("$TMP")" - IDS=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} mythconverg <<-EOF - select intid from videocategory where lcase(category) = lcase("$TMP"); - EOF) - if [ -n "$IDS" ] - then - INSERT="$INSERT update videometadata set category = $IDS where intid = $INTID;" - scriptlog INFO "Added to category $TMP" - # only 1 category - break - else - scriptlog INFO "Category $TMP does not exist" - fi - done - fi - - if [ -n "$INSERT" ] - then - [ "$DEBUGSQL" = "ON" ] && echo "$INSERT" - mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} mythconverg <<-EOF - $INSERT - EOF - fi - fi - fi - return 0 -} - -hasvideometadata() { -local FILENAME="$1" -local DATA - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select intid from videometadata where filename = "$FILENAME"; - EOF) - echo $DATA | grep '^[0-9][0-9][0-9]*$' >/dev/null 2>&1 && return 0 || return 1 -} - -deleterecording() { -local CHANID="$1" -local STARTTIME="$2" - [ -n "$CHANID" ] || return 1 - mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - update recorded set recgroup = "Deleted", autoexpire = 999 where chanid = $CHANID and starttime = "$STARTTIME"; - EOF -} - -insertmythlogentry() { -local PRIORITY="$1" -local LEVEL="$2" -local PID="$3" -local DETAILS="$(echo $4 | tr -d '[:cntrl:]' | tr -d '[\\\"]')" -local DATETIME=$(date '+%Y%m%d%H%M%S') -local HOST=$(hostname) - mysql --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - insert into mythlog set - module = "mythnuv2mkv.sh", - priority = $PRIORITY, - acknowledged = 0, - logdate = $DATETIME, - host = "$HOST", - message = "mythnuv2mkv.sh [$PID] $LEVEL", - details = "$DETAILS"; - EOF -} - -getjobqueuecmds() { -local JOBID="$1" -local DATA -local JQCMDSTR[0]="RUN" -local JQCMDSTR[1]="PAUSE" -local JQCMDSTR[2]="RESUME" -local JQCMDSTR[4]="STOP" -local JQCMDSTR[8]="RESTART" - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select cmds from jobqueue where id = $JOBID; - EOF) - echo ${JQCMDSTR[$DATA]} -} - -setjobqueuecmds() { -local JOBID="$1" -local CMDSSTR="$2" -local CMDS - if echo "$CMDSSTR" | egrep '^[0-9]+$' >/dev/null 2>&1 - then - CMDS=$CMDSSTR - elif [ "$CMDSSTR" = "RUN" ] - then - CMDS=0 - fi - if [ -n "$CMDS" ] - then - mysql --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - update jobqueue set cmds = $CMDS where id = $JOBID; - EOF - else - scriptlog ERROR "Invalid Job Queue Command." - fi -} - -getjobqueuestatus() { -local JOBID="$1" -local DATA -local JQSTATUSSTR[0]="UNKNOWN" -local JQSTATUSSTR[1]="QUEUED" -local JQSTATUSSTR[2]="PENDING" -local JQSTATUSSTR[3]="STARTING" -local JQSTATUSSTR[4]="RUNNING" -local JQSTATUSSTR[5]="STOPPING" -local JQSTATUSSTR[6]="PAUSED" -local JQSTATUSSTR[7]="RETRY" -local JQSTATUSSTR[8]="ERRORING" -local JQSTATUSSTR[9]="ABORTING" -local JQSTATUSSTR[256]="DONE" -local JQSTATUSSTR[272]="FINISHED" -local JQSTATUSSTR[288]="ABORTED" -local JQSTATUSSTR[304]="ERRORED" -local JQSTATUSSTR[320]="CANCELLED" - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select status from jobqueue where id = $JOBID; - EOF) - echo ${JQSTATUSSTR[$DATA]} -} - -setjobqueuestatus() { -local JOBID="$1" -local STATUSSTR="$2" -local STATUS - if echo "$STATUSSTR" | egrep '^[0-9]+$' >/dev/null 2>&1 - then - STATUS=$STATUSSTR - elif [ "$STATUSSTR" = "RUNNING" ] - then - STATUS=4 - elif [ "$STATUSSTR" = "PAUSED" ] - then - STATUS=6 - elif [ "$STATUSSTR" = "ABORTING" ] - then - STATUS=9 - elif [ "$STATUSSTR" = "FINISHED" ] - then - STATUS=272 - elif [ "$STATUSSTR" = "ERRORED" ] - then - STATUS=304 - fi - if [ -n "$STATUS" ] - then - mysql --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - update jobqueue set status = $STATUS where id = $JOBID; - EOF - else - scriptlog ERROR "Invalid Job Queue Status." - fi -} - -getjobqueuecomment() { -local JOBID="$1" -local COMMENT="$2" - mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select comment from jobqueue where id = $JOBID; - EOF -} - -setjobqueuecomment() { -local JOBID="$1" -local COMMENT="$2" - mysql --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - update jobqueue set comment = "$COMMENT" where id = $JOBID; - EOF -} - -# My channelprofiles table for setting aspect at channel level. -# See http://web.aanet.com.au/auric/?q=node/1 -# You probably don't have it. -getchannelaspect() { -local CHANID=$1 -local DATA - { - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} ${DBName} <<-EOF - select aspectratio from channelprofiles - where channum = (select channum from channel where chanid = $CHANID) - and sourceid = (select sourceid from channel where chanid = $CHANID); - EOF) - case $DATA in - 16:9|4:3) true ;; - '') DATA=$DEFAULTMPEG2ASPECT ;; - *) DATA=NA ;; - esac - } >/dev/null 2>&1 - echo $DATA -} - -# aspect ratio of the V4L or MPEG capture card associated with CHANID -# No good for any other type of card. e.g. DVB. -querycardaspect() { -local CHANID=$1 -local DATA - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} ${DBName} <<-EOF - select value from codecparams where name = 'mpeg2aspectratio' - and profile = (select id from recordingprofiles where name = 'default' - and profilegroup = (select id from profilegroups - where cardtype = (select cardtype from capturecard - where cardid = (select cardid from cardinput - where sourceid = (select sourceid from channel - where chanid = $CHANID) - ) - ) - ) - ); - EOF) - [ "$DATA" != "4:3" -a "$DATA" != "16:9" ] && DATA="NA" - echo $DATA -} - -getaviinfo() { -local FILE="$1" -shift -local PROPS="$@" -local MPOP -local TMP -local p -local RES -local ASPECTFOUNDIN -readonly width=1 ; infokey[1]="ID_VIDEO_WIDTH" -readonly height=2 ; infokey[2]="ID_VIDEO_HEIGHT" -readonly fps=3 ; infokey[3]="ID_VIDEO_FPS" -readonly audio_sample_rate=4 ; infokey[4]="ID_AUDIO_RATE" -readonly audio_channels=5 ; infokey[5]="ID_AUDIO_NCH" -readonly aspect=6 ; infokey[6]="ID_VIDEO_ASPECT" - MPOP=$(mplayer -really-quiet -nojoystick -nolirc -nomouseinput -vo null -ao null -frames 0 -identify "$FILE" 2>/dev/null) - for p in $PROPS - do - [ -n "${infokey[$p]}" ] && p=${infokey[$p]} - case $p in - "finfo") - TMP="NA" - ;; - "ID_VIDEO_ASPECT") - TMP="$(echo "$MPOP" | awk -F'=' '/ID_VIDEO_ASPECT/ {if($2>1.1 && $2<1.5)print "4:3";if($2>1.6 && $2<2)print "16:9"}')" - [ "$TMP" != "4:3" -a "$TMP" != "16:9" ] && TMP="NA" - ASPECTFOUNDIN="File" - if [ "$TMP" = "NA" ] && echo "$FILE" | grep '\.mpg$' >/dev/null 2>&1 && [ -n "$CHANID" ] - then - TMP=$(getchannelaspect $CHANID) - ASPECTFOUNDIN="Channel" - fi - if [ "$TMP" = "NA" ] && echo "$FILE" | grep '\.mpg$' >/dev/null 2>&1 && [ -n "$CHANID" ] - then - TMP=$(querycardaspect $CHANID) - ASPECTFOUNDIN="Card" - fi - if [ "$TMP" = "NA" ] && echo "$FILE" | grep '\.mpg$' >/dev/null 2>&1 - then - TMP=$DEFAULTMPEG2ASPECT - ASPECTFOUNDIN="Default" - fi - TMP="$TMP,$ASPECTFOUNDIN" - ;; - "ID_VIDEO_HEIGHT") - TMP="$(echo "$MPOP" | grep $p | tail -1 | cut -d'=' -f2)" - [ "$TMP" = "1080" ] && TMP="1088" # HD FIX - ;; - *) - TMP="$(echo "$MPOP" | grep $p | tail -1 | cut -d'=' -f2)" - ;; - esac - [ -z "$RES" ] && RES="$TMP" || RES="${RES}:${TMP}" - done - echo "$RES" -} - -getnuvinfo() { -export NUVINFOFILE="$1" -shift -export NUVINFOPROPS="$@" - PROPS=$(sed -n '/^#STARTNUVINFO$/,/#ENDNUVINFO/p' $CMD | perl) - echo "$PROPS" -} - -getvidinfo() { -local FILE="$1" -shift -local PROPS="$@" -local RES - if echo "$FILE" | grep '\.nuv' >/dev/null 2>&1 - then - RES=$(getnuvinfo "$FILE" $PROPS) - else - RES=$(getaviinfo "$FILE" $PROPS) - fi - echo "$RES" -} - -getaspect() { -local FILE="$1" -local ASPECT="NA" - ASPECT=$(getvidinfo "$FILE" aspect) - echo "$ASPECT" | grep ',' >/dev/null 2>&1 || ASPECT="$ASPECT,File" - echo "$ASPECT" -} - -stoptime() { -local STARTSECS=$1 -local MAXRUNHOURS=$2 -local CURSECS -local ENDSECS - [ "$MAXRUNHOURS" = "NA" ] && return 1 - CURSECS=$(date +%s) - ENDSECS=$(( $STARTSECS + ( $MAXRUNHOURS * 60 * 60 ) )) - [ "$ENDSECS" -gt "$CURSECS" ] && return 1 || return 0 -} - -checkoutput() { -local INPUT="$1" -local OUTPUT="$2" -local MENCODERRES=$3 -local VIDFOR -local OUTSIZE -local INSIZE -local RAT -local SCANOUTFILE -local LCOUNT -local ECOUNT -local INFRAMES -local OUTFRAMES -local DIFF - VIDFOR=$(getvidinfo "$OUTPUT" ID_VIDEO_FORMAT) - if [ "$VIDFOR" != "FMP4" -a "$VIDFOR" != "h264" -a "$VIDFOR" != "avc1" -a "$VIDFOR" != "avc1" -a "$VIDFOR" != "XVID" ] - then - scriptlog ERROR "$OUTPUT does not look like correct avi/mp4/mkv file." - return 1 - fi - - OUTSIZE=$(stat -c %s "$OUTPUT" 2>/dev/null || echo 0) - if [ "$OUTSIZE" -eq 0 ] - then - scriptlog ERROR "$OUTPUT zero length." - return 1 - fi - - INSIZE=$(stat -c %s "$INPUT" 2>/dev/null || echo 0) - RAT=$(( $INSIZE / $OUTSIZE )) - if ! hascutlist $CHANID $STARTTIME && [ "$RAT" -gt 16 ] - then - scriptlog ERROR "ratio between $INPUT and $OUTPUT sizes greater than 16." - return 1 - fi - - SCANOUTFILE="${FIFODIR}/mplayerscan-out" - nice mplayer -benchmark -nojoystick -nolirc -nomouseinput -vo null -ao null -speed 10 "$OUTPUT" 2>&1 | tr '\r' '\n' >$SCANOUTFILE 2>&1 - LCOUNT=$(wc -l $SCANOUTFILE 2>/dev/null | awk '{T=$1} END {if(T>0){print T}else{print 0}}') - if [ "$LCOUNT" -lt 1000 ] - then - scriptlog ERROR "mplayer line count ($LCOUNT) to low on $OUTPUT." - return 1 - fi - ECOUNT=$(egrep -ic 'sync|error|skip|damaged|overflow' $SCANOUTFILE) - if [ "$ECOUNT" -gt 5 ] - then - scriptlog ERROR "mplayer error count ($ECOUNT) to great on $OUTPUT." - return 1 - fi - - # Latest mplayer does not output frame count - #if [ -f "$MENCODERRES" ] - #then - # OUTFRAMES=$(tail -40 $SCANOUTFILE | awk '/A-V:/ {if(match($5,"/"))F=$5;if(match($6,"/"))F=$6;if(match($7,"/"))F=$7;if(match($8,"/"))F=$8;if(match($9,"/"))F=$9} END {print substr(F,index(F,"/")+1)}') - # INFRAMES=$(tail -40 $MENCODERRES | awk '/Video stream:/ {F=$12} END {print F}') - # scriptlog INFO "Frames $INFRAMES $INPUT." - # scriptlog INFO "Frames $OUTFRAMES $OUTPUT." - # if echo ${INFRAMES} : ${OUTFRAMES} | grep '[0-9] : [0-9]' >/dev/null 2>&1 - # then - # DIFF=$([ $INFRAMES -gt $OUTFRAMES ] && echo $(( $INFRAMES - $OUTFRAMES )) || echo $(( $OUTFRAMES - $INFRAMES ))) - # else - # DIFF=100000 - # fi - # if [ "$DIFF" -gt 10 ] - # then - # scriptlog ERROR "Frame count difference of $DIFF to big on $OUTPUT." - # return 1 - # fi - #fi - - return 0 -} - -getcategory() { -local CHANID="$1" -local STARTTIME="$2" -local DATA - [ -n "$CHANID" ] || return 1 - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select category from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - echo $DATA | tr -d '[:cntrl:]' | tr -d '[:punct:]' -} - -getplot() { -local CHANID="$1" -local STARTTIME="$2" -local DATA - [ -n "$CHANID" ] || return 1 - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select description from recorded where chanid = $CHANID and starttime = "$STARTTIME"; - EOF) - echo $DATA | tr -d '[:cntrl:]' | tr -d '[:punct:]' -} - -getyear() { -local CHANID="$1" -local STARTTIME="$2" -local DATA - [ -n "$CHANID" ] || return 1 - # STARTTIME is not always the same in both tables for matching programs. ??? - DATA=$(mysql --batch --skip-column-names --user=${DBUserName} --password=${DBPassword} -h ${DBHostName} ${DBName} <<-EOF - select airdate from recorded a,recordedprogram b - where a.chanid = $CHANID and a.starttime = "$STARTTIME" and a.chanid = b.chanid - and a.title = b.title and a.subtitle = b.subtitle; - EOF) - [ -n "$DATA" -a $DATA -gt 1800 ] && echo $DATA || echo $(date +%Y) -} - -encloseincontainer() { -local OUTBASE="$1" -local FPS="$2" -local AUDEXT="$3" -local CONTYPE="$4" -local ASPECT="$5" -local TITLE="$6" - if [ -f "${OUTBASE}_video.h264" -o "${OUTBASE}_audio.${AUDEXT}" ] - then - if [ "$CONTYPE" = "mkv" ] - then - if [ "$MKVMERGE251BUG" = "YES" ] - then - LANG=C mkvmerge --default-duration 0:${FPS}fps --aspect-ratio 0:${ASPECT} --title "$TITLE" \ - "${OUTBASE}_video.h264" "${OUTBASE}_audio.${AUDEXT}" -o "${OUTBASE}.mkv" - RET=$? ; [ $RET -eq 1 ] && RET=0 # mkvmerge return code of 1 is only a warning - else - mkvmerge --default-duration 0:${FPS}fps --aspect-ratio 0:${ASPECT} --title "$TITLE" \ - "${OUTBASE}_video.h264" "${OUTBASE}_audio.${AUDEXT}" -o "${OUTBASE}.mkv" - RET=$? ; [ $RET -eq 1 ] && RET=0 # mkvmerge return code of 1 is only a warning - fi - elif [ "$CONTYPE" = "mp4" ] - then - MP4Box -add "${OUTBASE}_video.h264:par=1:1" -add "${OUTBASE}_audio.${AUDEXT}" -fps $FPS "${OUTBASE}.mp4" - RET=$? - fi - if [ $RET -eq 0 ] - then - [ "$DEBUG" != "ON" ] && rm -f "${OUTBASE}_video.h264" "${OUTBASE}_audio.${AUDEXT}" - else - [ "$DEBUG" != "ON" ] && rm -f "${OUTBASE}_video.h264" "${OUTBASE}_audio.${AUDEXT}" "${OUTBASE}.mkv" >/dev/null 2>&1 - return 1 - fi - else - scriptlog ERROR "${OUTBASE}_video.h264 or ${OUTBASE}_audio.${AUDEXT} does not exist." - return 1 - fi - return 0 -} - -logtranstime () { -local START=$1 -local END=$2 -local ORIGINALFILESIZE=$3 -local NEWFILESIZE=$4 - TMP=$(( $(date -u -d"${END}" +%s) - $(date -u -d"${START}" +%s) )) - DAYS=$(( $TMP / 60 / 60 / 24 )) - HOURS=$(( $TMP / 60 / 60 - ($DAYS * 24) )) - MINUTES=$(( $TMP / 60 - ( ($HOURS * 60)+($DAYS * 24 * 60) ) )) - SECONDS=$(( $TMP - ( ($MINUTES * 60)+($HOURS * 60 * 60)+($DAYS * 24 * 60 * 60) ) )) - scriptlog INFO "RUNTIME: $DAYS days $HOURS hours $MINUTES minutes and $SECONDS seconds. Original filesize: $ORIGINALFILESIZE New filesize: $NEWFILESIZE" -} - -cleanup() { -local SIG="$1" -local JOBID="$2" -local OUTPUT="$3" -local OUTBASE -local TRANPID - scriptlog DEBUG "$SIG Clean up." - if [ "$SIG" = "ABRT" ] - then - scriptlog ERROR "Job Aborted. Removing incomplete $OUTPUT." - OUTBASE=$(echo "$OUTPUT" | sed -e 's/\.[ma][pv][4i]$//') - [ "$DEBUG" != "ON" ] && rm -f "${OUTBASE}.avi" "${OUTBASE}_video.h264" "${OUTBASE}_audio.aac" "${OUTBASE}_audio.ogg" "${OUTBASE}.mp4" "${OUTBASE}.mkv" >/dev/null 2>&1 - fi - - TRANPID=$(jobs -l | awk '/mythtranscode/ {P=$2" "P} END {print P}') - if [ -n "$TRANPID" ] - then - scriptlog DEBUG "Killing mythtranscode [$TRANPID]" - ps -p $TRANPID >/dev/null 2>&1 && kill $TRANPID >/dev/null 2>&1 - fi - - if [ "$FINALEXIT" -eq 0 ] - then - [ "$DEBUG" != "ON" ] && rm -rf "$FIFODIR" >/dev/null 2>&1 - scriptlog INFO "Exiting. Successful." - if [ "$JOBID" -ne 99999999 ] - then - setjobqueuestatus "$JOBID" "FINISHED" - setjobqueuecomment "$JOBID" "[${$}] Successfully Completed" - fi - exit 0 - else - scriptlog INFO "Exiting. Errored." - if [ "$JOBID" -ne 99999999 ] - then - setjobqueuestatus "$JOBID" "ERRORED" - setjobqueuecomment "$JOBID" "[${$}] Errored" - fi - #exit 1 - #exit 304 - # Only error code jobqueue.cpp interprets is 246. This is translated to "unable to find executable". - scriptlog ERROR "This error could be for many reasons. Mythtv will report unable to find executable, this is incorrect." - exit 246 - fi -} - -MYSQLLIST="~mythtv/.mythtv/mysql.txt ~/.mythtv/mysql.txt /.mythtv/mysql.txt /usr/local/share/mythtv/mysql.txt /usr/share/mythtv/mysql.txt /etc/mythtv/mysql.txt /usr/local/etc/mythtv/mysql.txt mysql.txt" -for m in $MYSQLLIST -do - [ -f $m ] && . $m && break -done -if [ -z "$DBName" ] -then - echo "Can't find mysql.txt" - exit 1 -fi - -##### BG Monitor ##################################### -# This will be fired off in background to update the jobqueue comment and process stop/pause/resume requests. -if echo "$1" | egrep -i '\-\-monitor=' >/dev/null 2>&1 -then - readonly MONJOBID=$(echo "$1" | cut -d'=' -f2) - readonly MONPID="$2" - readonly MONTRANSOP="$3" - readonly LOGFILE="$4" - readonly DBLOGGING=$(getsetting "LogEnabled") - - [ "$MONJOBID" -ne 99999999 -a -n "$MONPID" ] || exit 1 - - PAUSEALREADYPRINTED="" ; RESUMEALREADYPRINTED="" - - scriptlog INFO "Starting monitoring process." - sleep 5 - while ps -p $MONPID >/dev/null 2>&1 - do - JQCMD=$(getjobqueuecmds "$MONJOBID") - if [ "$JQCMD" = "PAUSE" ] - then - JQSTATUS=$(getjobqueuestatus "$MONJOBID") - if [ "$JQSTATUS" != "PAUSED" ] - then - MENCODERPID=$(ps --ppid $MONPID | awk '/mencoder/ {print $1}') - if [ -n "$MENCODERPID" ] - then - PAUSEALREADYPRINTED="" - STARTPAUSESECS=$(date +%s) - kill -s STOP $MENCODERPID - setjobqueuestatus "$MONJOBID" "PAUSED" - SAVEDCC=$(getjobqueuecomment "$MONJOBID") - setjobqueuecomment "$MONJOBID" "[$MONPID] Paused for 0 Seconds" - scriptlog STOP "Job Paused due to job queue pause request." - else - [ -z "$PAUSEALREADYPRINTED" ] && scriptlog ERROR "Sorry, could not pause. Will keep trying" - PAUSEALREADYPRINTED=TRUE - fi - else - NOW=$(date +%s) - PAUSESECS=$(( $NOW - $STARTPAUSESECS )) - PAUSEMINS=$(( $PAUSESECS / 60 )) - PAUSEHOURS=$(( $PAUSEMINS / 60 )) - PAUSEMINS=$(( $PAUSEMINS - ( $PAUSEHOURS * 60 ) )) - PAUSESECS=$(( $PAUSESECS - ( ( $PAUSEHOURS * 60 * 60 ) + ( $PAUSEMINS * 60 ) ) )) - setjobqueuecomment "$MONJOBID" "[$MONPID] Paused for $PAUSEHOURS Hrs $PAUSEMINS Mins $PAUSESECS Secs" - fi - elif [ "$JQCMD" = "RESUME" ] - then - JQSTATUS=$(getjobqueuestatus "$MONJOBID") - if [ "$JQSTATUS" != "RUNNING" ] - then - MENCODERPID=$(ps --ppid $MONPID | awk '/mencoder/ {print $1}') - if [ -n "$MENCODERPID" ] - then - RESUMEALREADYPRINTED="" - kill -s CONT $MENCODERPID - setjobqueuestatus "$MONJOBID" "RUNNING" - setjobqueuecomment "$MONJOBID" "$SAVEDCC" - scriptlog START "Job resumed due to job queue resume request." - setjobqueuecmds "$MONJOBID" "RUN" - else - [ -z "$RESUMEALREADYPRINTED" ] && scriptlog ERROR "Sorry, could not resume. Will keep trying" - RESUMEALREADYPRINTED=TRUE - fi - fi - elif [ "$JQCMD" = "STOP" ] - then - setjobqueuestatus "$MONJOBID" "ABORTING" - setjobqueuecomment "$MONJOBID" "[$MONPID] Stopping" - scriptlog STOP "Stopping due to job queue stop request." - setjobqueuecmds "$MONJOBID" "RUN" - kill -s ABRT $MONPID - sleep 2 - kill $MONPID - elif [ "$JQCMD" = "RESTART" ] - then - scriptlog ERROR "Sorry, can't restart job." - setjobqueuecmds "$MONJOBID" "RUN" - else - CC=$(getjobqueuecomment "$MONJOBID") - if echo "$CC" | grep 'audio pass' >/dev/null 2>&1 - then - PASSNU="audio pass" - elif echo "$CC" | grep 'Single video pass' >/dev/null 2>&1 - then - PASSNU="Single video pass" - elif echo "$CC" | grep '1st video pass' >/dev/null 2>&1 - then - PASSNU="1st video pass" - elif echo "$CC" | grep '2nd video pass' >/dev/null 2>&1 - then - PASSNU="2nd video pass" - else - sleep 15 - continue - fi - PCTLINE=$(tail -10 $MONTRANSOP | grep 'mythtranscode:' | cut -c39- | tail -1) - [ -n "$PASSNU" -a -n "$PCTLINE" ] && setjobqueuecomment "$MONJOBID" "[$MONPID] $PASSNU $PCTLINE" - fi - sleep 15 - done - exit -fi - -##### Globals ######################################## -readonly CMD="$0" -readonly LOGFILE="/var/tmp/mythnuv2mkv${$}.log" -readonly FIFODIR="/var/tmp/mythnuv2mkv${$}" -readonly MENCODEROP="${FIFODIR}/mencoder.op" -readonly TRANSOP="${FIFODIR}/transcode.op" -readonly STOPREQUEST="${FIFODIR}/STOPREQUEST" -readonly CFDIR=$(getsetting "VideoArtworkDir") -if ! tty >/dev/null 2>&1 -then - readonly BOLDON="" - readonly ALLOFF="" - readonly REDFG="" - readonly GREENFG="" - readonly COLOURORIG="" - [ "$DEBUG" = "ON" ] && exec 3>/var/tmp/DEBUG || exec 3>/dev/null - exec 1>&3 - exec 2>&3 -else - readonly BOLDON=`tput bold` - readonly ALLOFF=`tput sgr0` - readonly REDFG=`tput setaf 1` - readonly GREENFG=`tput setaf 2` - readonly COLOURORIG=`tput op` -fi -# DBLOGGING is reverse to shell true/false -DBLOGGING=0 -OUTPUT="" -JOBID=99999999 -FINALEXIT=0 -STARTSECS="NA" -MAXRUNHOURS="NA" - -##### Main ########################################### -if echo "$1" | egrep -i '\-help|\-usage|\-\?' >/dev/null 2>&1 -then - echo "$HELP" - exit 1 -fi - -if [ "$CONTYPE" = "mkv" ] -then - chkreqs "$MKVREQPROGS" "$MKVREQLIBS" || exit 1 - versioncheck "mkvmerge" -elif [ "$CONTYPE" = "mp4" ] -then - chkreqs "$MP4REQPROGS" "$MP4REQLIBS" || exit 1 -elif [ "$CONTYPE" = "avi" ] -then - chkreqs "$AVIREQPROGS" "$AVIREQLIBS" || exit 1 -fi - -trap 'cleanup ABRT "$JOBID" "$OUTPUT"' INT ABRT -trap 'touch $STOPREQUEST ; scriptlog INFO "USR1 received. Will stop after current file completes."' USR1 -trap 'cleanup EXIT "$JOBID"' EXIT -mkdir ${FIFODIR} >/dev/null 2>&1 - -for INPUT in "$@" -do - if stoptime $STARTSECS $MAXRUNHOURS - then - scriptlog STOP "Stopping due to max runtime $MAXRUNHOURS." - scriptlog BREAK - break - fi - if [ -f "$STOPREQUEST" ] - then - scriptlog STOP "Stopping due to USR1 request." - scriptlog BREAK - break - fi - - # Jobid from myth user job %JOBID% - if echo "$INPUT" | grep -i '\-\-jobid=' >/dev/null 2>&1 - then - JOBID=$(echo "$INPUT" | cut -d'=' -f2) - DBLOGGING=$(getsetting "LogEnabled") - continue - fi - - if echo "$INPUT" | grep -i '\-\-findtitle=' >/dev/null 2>&1 - then - SEARCHTITLE=$(echo "$INPUT" | cut -d'=' -f2) - MATCHTITLE=$(findchanidstarttime "$SEARCHTITLE") - echo "$MATCHTITLE" - exit 0 - fi - - if echo "$INPUT" | grep -i '\-\-maxrunhours=' >/dev/null 2>&1 - then - STARTSECS=$(date +%s) - MAXRUNHOURS=$(echo "$INPUT" | cut -d'=' -f2) - scriptlog INFO "Max Run Hours set to $MAXRUNHOURS." - continue - fi - - if echo "$INPUT" | grep -i '\-\-debugsg' >/dev/null 2>&1 - then - DEBUGSG="ON" - scriptlog INFO "DEBUGSG set ON." - continue - fi - if echo "$INPUT" | grep -i '\-\-debug=' >/dev/null 2>&1 - then - DEBUG=$(echo "$INPUT" | cut -d'=' -f2 | tr [a-z] [A-Z]) - scriptlog INFO "Debug set to $DEBUG." - continue - fi - if echo "$INPUT" | grep -i '\-\-info=' >/dev/null 2>&1 - then - INFO=$(echo "$INPUT" | cut -d'=' -f2 | tr [a-z] [A-Z]) - scriptlog INFO "Info set to $INFO." - continue - fi - if echo "$INPUT" | grep -i '\-\-savenuv=' >/dev/null 2>&1 - then - SAVENUV=$(echo "$INPUT" | cut -d'=' -f2 | tr [a-z] [A-Z]) - scriptlog INFO "SaveNUV set to $SAVENUV." - continue - fi - - if echo "$INPUT" | grep -i '\-\-denoise=' >/dev/null 2>&1 - then - DENOISE=$(echo "$INPUT" | cut -d'=' -f2 | tr [a-z] [A-Z]) - if echo "$DENOISE" | egrep -i 'ON|YES' >/dev/null 2>&1 - then - POSTVIDFILTERS="${POSTVIDFILTERS}${DENOISEFILTER}," - scriptlog INFO "Denoise filter added." - else - POSTVIDFILTERS=$(echo ${POSTVIDFILTERS} | sed -e 's/'${DENOISEFILTER}',//') - scriptlog INFO "Denoise filter removed." - fi - continue - fi - - if echo "$INPUT" | grep -i '\-\-deblock=' >/dev/null 2>&1 - then - DEBLOCK=$(echo "$INPUT" | cut -d'=' -f2 | tr [a-z] [A-Z]) - if echo "$DEBLOCK" | egrep -i 'ON|YES' >/dev/null 2>&1 - then - POSTVIDFILTERS="${POSTVIDFILTERS}${DEBLOCKFILTER}," - scriptlog INFO "Deblock filter added." - else - POSTVIDFILTERS=$(echo ${POSTVIDFILTERS} | sed -e 's/'${DEBLOCKFILTER}',//') - scriptlog INFO "Deblock filter removed." - fi - continue - fi - - if echo "$INPUT" | grep -i '\-\-deinterlace=' >/dev/null 2>&1 - then - DEINTERLACE=$(echo "$INPUT" | cut -d'=' -f2 | tr [a-z] [A-Z]) - if echo "$DEINTERLACE" | egrep -i 'ON|YES' >/dev/null 2>&1 - then - scriptlog INFO "Deinterlace filter made available." - else - scriptlog INFO "Deinterlace filter made unavailable." - fi - continue - fi - - if echo "$INPUT" | grep -i '\-\-invtelecine=' >/dev/null 2>&1 - then - INVTELECINE=$(echo "$INPUT" | cut -d'=' -f2 | tr [a-z] [A-Z]) - if echo "$INVTELECINE" | egrep -i 'ON|YES' >/dev/null 2>&1 - then - scriptlog INFO "Invtelecine filter made available." - else - scriptlog INFO "Invtelecine filter made unavailable." - fi - continue - fi - - if echo "$INPUT" | grep -i '\-\-crop=' >/dev/null 2>&1 - then - CROP=$(echo "$INPUT" | cut -d'=' -f2 | tr [a-z] [A-Z]) - scriptlog INFO "Crop set to $CROP." - continue - fi - - if echo "$INPUT" | grep -i '\-\-deleterec=' >/dev/null 2>&1 - then - DELETEREC=$(echo "$INPUT" | cut -d'=' -f2 | tr [a-z] [A-Z]) - scriptlog INFO "Delete Recording set to $DELETEREC." - continue - fi - - if echo "$INPUT" | grep -i '\-\-copydir=' >/dev/null 2>&1 - then - COPYDIR=$(echo "$INPUT" | cut -d'=' -f2) - if [ -d "$COPYDIR" -a -w "$COPYDIR" ] - then - scriptlog INFO "Video will be located in $COPYDIR." - else - scriptlog ERROR "$COPYDIR does not exist or is not writable. Continuing but result will be left in source directory unless $COPYDIR is created before job completes." - fi - continue - fi - - if echo "$INPUT" | grep -i '\-\-contype=' >/dev/null 2>&1 - then - TMP=$(echo "$INPUT" | cut -d'=' -f2 | tr [A-Z] [a-z]) - OLDIFS="$IFS"; IFS=","; set - $TMP; IFS="$OLDIFS" - TMP1="$1" ; TMP2="$2" - if [ "$TMP1" = "mp4" ] - then - if [ -n "$CHANID" -a -z "$COPYDIR" ] - then - scriptlog ERROR "Changed to $TMP1 failed. mp4 not supported in MythRecord." - elif ! chkreqs "$MP4REQPROGS" "$MP4REQLIBS" - then - scriptlog ERROR "Changed to $TMP1 failed. Missing Requirements." - else - CONTYPE="mp4" - QUICKTIME_MP4="NO" - scriptlog INFO "Changed to $CONTYPE." - fi - elif [ "$TMP1" = "mov" ] - then - if [ -n "$CHANID" -a -z "$COPYDIR" ] - then - scriptlog ERROR "Changed to $TMP1 failed. mov not supported in MythRecord." - elif ! chkreqs "$MP4REQPROGS" "$MP4REQLIBS" - then - scriptlog ERROR "Changed to $TMP1 failed. Missing Requirements." - else - CONTYPE="mp4" - QUICKTIME_MP4="YES" - scriptlog INFO "Changed to $CONTYPE (mov)." - fi - elif [ "$TMP1" = "mkv" ] - then - if [ -n "$CHANID" -a -z "$COPYDIR" ] - then - scriptlog ERROR "Changed to $TMP1 failed. mkv not supported in MythRecord." - elif ! chkreqs "$MKVREQPROGS" "$MKVREQLIBS" - then - scriptlog ERROR "Changed to $TMP1 failed. Missing Requirements." - else - CONTYPE="mkv" - QUICKTIME_MP4="NO" - [ "$TMP2" = "ogg" ] && MKVAUD="ogg" - [ "$TMP2" = "acc" ] && MKVAUD="acc" - scriptlog INFO "Changed to ${CONTYPE},${MKVAUD}." - fi - elif [ "$TMP1" = "avi" ] - then - if ! chkreqs "$AVIREQPROGS" "$AVIREQLIBS" - then - scriptlog ERROR "Changed to $TMP1 failed. Missing Requirements." - else - CONTYPE="avi" - QUICKTIME_MP4="NO" - [ "$TMP2" = "xvid" ] && AVIVID="xvid" - [ "$TMP2" = "lavc" ] && AVIVID="lavc" - [ "$TMP2" = "divx" ] && AVIVID="lavc" - scriptlog INFO "Changed to ${CONTYPE},${AVIVID}." - fi - else - scriptlog ERROR "Changed to $TMP1 failed. Invalid contype." - fi - continue - fi - - if echo "$INPUT" | grep -i '\-\-pass=' >/dev/null 2>&1 - then - TMP=$(echo "$INPUT" | cut -d'=' -f2 | tr [A-Z] [a-z]) - if [ "$TMP" = "one" -o "$TMP" = "1" ] - then - scriptlog INFO "Changed to $TMP pass." - PASS="one" - elif [ "$TMP" = "two" -o "$TMP" = "2" ] - then - scriptlog INFO "Changed to $TMP pass." - PASS="two" - else - scriptlog ERROR "Changed to $TMP failed. Invalid contype." - fi - continue - fi - - if echo "$INPUT" | grep -i '\-\-quality=' >/dev/null 2>&1 - then - QLEVEL=$(echo "$INPUT" | cut -d'=' -f2) - if echo "$QLEVEL" | grep -i "high" >/dev/null 2>&1 - then - SCALE43=$HIGH_SCALE43 - SCALE169=$HIGH_SCALE169 - LAVC_CQ=$HIGH_LAVC_CQ - LAVC_OPTS=$HIGH_LAVC_OPTS - XVID_CQ=$HIGH_XVID_CQ - XVID_OPTS=$HIGH_XVID_OPTS - MP3_ABITRATE=$HIGH_MP3_ABITRATE - X264_CQ=$HIGH_X264_CQ - X264EXT_OPTS="level_idc=31:$HIGH_X264EXT_OPTS" - X264_OPTS="level_idc=31:$HIGH_X264HIGH_OPTS" - AAC_AQUAL=$HIGH_AAC_AQUAL - OGG_AQUAL=$HIGH_OGG_AQUAL - elif echo "$QLEVEL" | grep -i "med" >/dev/null 2>&1 - then - SCALE43=$MED_SCALE43 - SCALE169=$MED_SCALE169 - LAVC_CQ=$MED_LAVC_CQ - LAVC_OPTS=$MED_LAVC_OPTS - XVID_CQ=$MED_XVID_CQ - XVID_OPTS=$MED_XVID_OPTS - MP3_ABITRATE=$MED_MP3_ABITRATE - X264_CQ=$MED_X264_CQ - X264EXT_OPTS="level_idc=31:$MED_X264EXT_OPTS" - X264_OPTS="level_idc=31:$MED_X264HIGH_OPTS" - AAC_AQUAL=$MED_AAC_AQUAL - OGG_AQUAL=$MED_OGG_AQUAL - elif echo "$QLEVEL" | grep -i "low" >/dev/null 2>&1 - then - SCALE43=$LOW_SCALE43 - SCALE169=$LOW_SCALE169 - LAVC_CQ=$LOW_LAVC_CQ - LAVC_OPTS=$LOW_LAVC_OPTS - XVID_CQ=$LOW_XVID_CQ - XVID_OPTS=$LOW_XVID_OPTS - MP3_ABITRATE=$LOW_MP3_ABITRATE - X264_CQ=$LOW_X264_CQ - X264EXT_OPTS="level_idc=31:$LOW_X264EXT_OPTS" - X264_OPTS="level_idc=31:$LOW_X264HIGH_OPTS" - AAC_AQUAL=$LOW_AAC_AQUAL - OGG_AQUAL=$LOW_OGG_AQUAL - elif echo "$QLEVEL" | egrep -i "480" >/dev/null 2>&1 - then - # 720 scale, high everything else - SCALE43=$FE_SCALE43 - SCALE169=$FE_SCALE169 - LAVC_CQ=$HIGH_LAVC_CQ - LAVC_OPTS=$HIGH_LAVC_OPTS - XVID_CQ=$HIGH_XVID_CQ - XVID_OPTS=$HIGH_XVID_OPTS - MP3_ABITRATE=$HIGH_MP3_ABITRATE - X264_CQ=$HIGH_X264_CQ - X264EXT_OPTS="level_idc=31:$HIGH_X264EXT_OPTS" - X264_OPTS="level_idc=31:$HIGH_X264HIGH_OPTS" - AAC_AQUAL=$HIGH_AAC_AQUAL - OGG_AQUAL=$HIGH_OGG_AQUAL - elif echo "$QLEVEL" | egrep -i "576" >/dev/null 2>&1 - then - # 720 scale, high everything else - SCALE43=$FS_SCALE43 - SCALE169=$FS_SCALE169 - LAVC_CQ=$HIGH_LAVC_CQ - LAVC_OPTS=$HIGH_LAVC_OPTS - XVID_CQ=$HIGH_XVID_CQ - XVID_OPTS=$HIGH_XVID_OPTS - MP3_ABITRATE=$HIGH_MP3_ABITRATE - X264_CQ=$HIGH_X264_CQ - X264EXT_OPTS="level_idc=31:$HIGH_X264EXT_OPTS" - X264_OPTS="level_idc=31:$HIGH_X264HIGH_OPTS" - AAC_AQUAL=$HIGH_AAC_AQUAL - OGG_AQUAL=$HIGH_OGG_AQUAL - elif echo "$QLEVEL" | egrep -i "720" >/dev/null 2>&1 - then - # 720 scale, high everything else - SCALE43=$ST_SCALE43 - SCALE169=$ST_SCALE169 - LAVC_CQ=$HIGH_LAVC_CQ - LAVC_OPTS=$HIGH_LAVC_OPTS - XVID_CQ=$HIGH_XVID_CQ - XVID_OPTS=$HIGH_XVID_OPTS - MP3_ABITRATE=$HIGH_MP3_ABITRATE - X264_CQ=$HIGH_X264_CQ - X264EXT_OPTS="level_idc=31:$HIGH_X264EXT_OPTS" - X264_OPTS="level_idc=31:$HIGH_X264HIGH_OPTS" - AAC_AQUAL=$HIGH_AAC_AQUAL - OGG_AQUAL=$HIGH_OGG_AQUAL - elif echo "$QLEVEL" | grep -i "1080" >/dev/null 2>&1 - then - # 1080 scale, high everything else - SCALE43=$TE_SCALE43 - SCALE169=$TE_SCALE169 - LAVC_CQ=$HIGH_LAVC_CQ - LAVC_OPTS=$HIGH_LAVC_OPTS - XVID_CQ=$HIGH_XVID_CQ - XVID_OPTS=$HIGH_XVID_OPTS - MP3_ABITRATE=$HIGH_MP3_ABITRATE - X264_CQ=$HIGH_X264_CQ - X264EXT_OPTS="level_idc=41:$HIGH_X264EXT_OPTS" - X264_OPTS="level_idc=41:$HIGH_X264HIGH_OPTS" - AAC_AQUAL=$HIGH_AAC_AQUAL - OGG_AQUAL=$HIGH_OGG_AQUAL - fi - scriptlog INFO "Changed to $QLEVEL quality." - continue - fi - - if echo "$INPUT" | grep -i '\-\-chanid=' >/dev/null 2>&1 - then - CHANID=$(echo "$INPUT" | cut -d'=' -f2) - continue - fi - if echo "$INPUT" | grep -i '\-\-starttime=' >/dev/null 2>&1 - then - STARTTIME=$(echo "$INPUT" | cut -d'=' -f2) - if [ -z "$CHANID" ] - then - scriptlog ERROR "Skipping $STARTTIME. chanid not specified." - scriptlog ERROR "--chanid must be specified before --starttime." - scriptlog BREAK - unset STARTTIME - continue - fi - if [ "$DEBUGSG" = "ON" ] - then - INPUT=$(getrecordfile "$CHANID" "$STARTTIME" "$DEBUGSG") - scriptlog INFO "$INPUT" - scriptlog BREAK - exit $FINALEXIT - fi - INPUT=$(getrecordfile "$CHANID" "$STARTTIME") - if [ -z "$INPUT" ] - then - scriptlog ERROR "Skipping $CHANID $STARTTIME. Did not match a recording." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - if [ ! -f "$INPUT" ] - then - scriptlog ERROR "Could not find Recording. ($INPUT)" - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - TITLE=$(gettitle $CHANID $STARTTIME) - MTINFILE="" - MTSOURCE="--chanid $CHANID --starttime $STARTTIME" - hascutlist $CHANID $STARTTIME && MTSOURCE="--honorcutlist $MTSOURCE" - scriptlog INFO "$CHANID $STARTTIME matches $TITLE ($INPUT)" - else - echo "$INPUT" | grep '^\/' >/dev/null 2>&1 || INPUT="`pwd`/${INPUT}" - MTINFILE="--infile" - MTSOURCE="$INPUT" - fi - - if [ ! -f "$INPUT" ] - then - scriptlog ERROR "Skipping $INPUT does not exist." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - - if echo "$INPUT" | grep -v '\.[nm][up][vg]$' >/dev/null 2>&1 - then - scriptlog ERROR "Skipping $INPUT not a nuv or mpg file." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - - OUTBASE=$(echo "$INPUT" | sed -e 's/\.[nm][up][vg]$//') - OUTPUT="${OUTBASE}.${CONTYPE}" - if [ -f "$OUTPUT" ] - then - scriptlog ERROR "Skipping $INPUT. $OUTPUT already exists." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - - INSIZE=$(( `stat -c %s "${INPUT}"` / 1024 )) - FREESPACE=$(df -k "$INPUT" | awk 'END {print $3}') - if [ $(( $FREESPACE - $INSIZE )) -lt 10000 ] - then - scriptlog ERROR "Stopping due to disk space shortage." - scriptlog BREAK - break - fi - - [ "$QUICKTIME_MP4" = "YES" ] && X264_OPTS="$X264EXT_OPTS" - - FILEINFO=$(getvidinfo "$INPUT" width height fps audio_sample_rate audio_channels) - OLDIFS="$IFS"; IFS=":"; set - $FILEINFO; IFS="$OLDIFS" - INWIDTH="$1"; INHEIGHT="$2"; INFPS="$3"; INARATE="$4"; CHANNELS="$5" - if [ "$#" -ne 5 ] - then - scriptlog ERROR "Skipping $INPUT. Could not obtain vid format details" - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - if [ "$INWIDTH" = 720 -a "$INHEIGHT" = 576 ] - then - FORMAT="576i or 576p" - elif [ "$INWIDTH" = 720 -a "$INHEIGHT" = 480 ] - then - FORMAT="480i or 480p" - elif [ "$INWIDTH" = 1280 -a "$INHEIGHT" = 720 ] - then - FORMAT="720p" - elif [ "$INWIDTH" = 1920 -a "$INHEIGHT" = 1088 ] - then - FORMAT="1080i or 1080p" - else - FORMAT="Unknown" - fi - - ASPECTSTR="NA";ASPECTFOUNDIN="NA" - TMP=$(getaspect "$INPUT") - ASPECTSTR=$(echo "$TMP" | cut -d',' -f1) - ASPECTFOUNDIN=$(echo "$TMP" | cut -d',' -f2) - if [ "$ASPECTSTR" != "4:3" -a "$ASPECTSTR" != "16:9" ] - then - scriptlog ERROR "Skipping $INPUT. Aspect is $ASPECTSTR must be 16:9 or 4:3." - scriptlog ERROR "If this is a mpg file make sure to set DEFAULTMPEG2ASPECT at top of this script." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - scriptlog INFO "$FORMAT ${INWIDTH}x${INHEIGHT} $ASPECTSTR (Found in $ASPECTFOUNDIN) $INFPS FPS Audio Rate $INARATE Channels $CHANNELS" - - # Channel mapping - FAACCCOPT="" - case "$CHANNELS" in - 1*|2*|3*|4*) true ;; - 5*|6*) FAACCCOPT="$FAACCHANCONFIG" ;; - *) scriptlog ERROR "Audio channels $CHANNELS invalid." - scriptlog BREAK - unset CHANID STARTTIME - continue - ;; - esac - - # Aspect/Scale/Crop opts - if [ "$ASPECTSTR" = "4:3" ] - then - ASPECT=1.333333333 - SCALE=$SCALE43 - if [ "$SCALE" = "NA" ] - then - scriptlog ERROR "Skipping $INPUT Aspect 4:3 which is not supported for quality $QLEVEL" - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - elif [ "$ASPECTSTR" = "16:9" ] - then - ASPECT=1.77777777778 - SCALE=$SCALE169 - fi - SCALESTR=$( echo $SCALE | tr ':' 'x' ) - SCALEMEN="scale=${SCALE}," - - OLDIFS="$IFS"; IFS=":"; set - $SCALE; IFS="$OLDIFS" - OUTWIDTH="$1"; OUTHEIGHT="$2" - if [ "$OUTWIDTH" = "$INWIDTH" -a "$OUTHEIGHT" = "$INHEIGHT" ] - then - CROPSCALE="" - scriptlog INFO "Input and Output same resolution. crop,scale disabled." - elif echo "$CROP" | egrep -i 'ON|YES' >/dev/null 2>&1 - then - if [ "$OUTWIDTH" -gt "$INWIDTH" -o "$OUTHEIGHT" -gt "$INHEIGHT" ] - then - scriptlog INFO "Output is a greater scale than input. This is not sensible." - fi - CROPX=$CROPSIZE - CROPY=$CROPSIZE - CROPW=$(( $INWIDTH - ( 2 * $CROPX ) )) - CROPH=$(( $INHEIGHT - ( 2 * $CROPY ) )) - CROPVAL="${CROPW}:${CROPH}:${CROPX}:${CROPY}" - CROPMEN="crop=${CROPVAL}," - CROPSCALE="${CROPMEN}${SCALEMEN}" - scriptlog INFO "Crop to $CROPVAL. Scale to $SCALESTR." - else - CROPSCALE="${SCALEMEN}" - scriptlog INFO "Scale to $SCALESTR." - fi - - # Filter opts - OUTFPS="$INFPS" ; MENOUTFPS="" - POSTVIDFILTERS=$(echo ${POSTVIDFILTERS} | sed -e 's/'"${INVTELECINEFILTER}"',//') - POSTVIDFILTERS=$(echo ${POSTVIDFILTERS} | sed -e 's/'"${DEINTERLACEFILTER}"',//') - [ -n "$CHANID" ] && SOURCENAME=$(getsourcename $CHANID) - # Progressive then skip Deinterlace/Invtelecine - if echo $INFPS | egrep '^23|^24' >/dev/null 2>&1 - then - # Keep 23.976 FPS otherwise mencoder will convert to 29.97 - OUTFPS="23.976" - scriptlog INFO "Input $INFPS FPS. OUTFPS set to $OUTFPS." - elif [ "$FORMAT" = "720p" -o "$FORMAT" = "1080p" ] - then - scriptlog INFO "$FORMAT. Deinterlace/Invtelecine filter not needed." - # Deinterlace options - elif echo "$DEINTERLACE" | egrep -i 'ON|YES' >/dev/null 2>&1 - then - POSTVIDFILTERS="${POSTVIDFILTERS}${DEINTERLACEFILTER}," - scriptlog INFO "Deinterlace filter added." - echo "$INFPS" | grep '^29' >/dev/null 2>&1 && - scriptlog INFO "You may need Invtelecine rather than Deinterlace. (--deinterlace=NO --invtelecine=YES)." - echo "$FORMAT" | egrep -i '576p|480p|720p|1080p' >/dev/null 2>&1 && - scriptlog INFO "If progressive this is wrong use --deinterlace=NO." - elif [ -n "$SOURCENAME" ] && echo "$DEINTERLACE" | grep -i "$SOURCENAME" >/dev/null 2>&1 - then - POSTVIDFILTERS="${POSTVIDFILTERS}${DEINTERLACEFILTER}," - scriptlog INFO "Source $SOURCENAME. Deinterlace filter added." - echo "$INFPS" | grep '^29' >/dev/null 2>&1 && - scriptlog INFO "You may need Invtelecine rather than Deinterlace. (--deinterlace=NO --invtelecine=YES)." - echo "$FORMAT" | egrep -i '576p|480p|720p|1080p' >/dev/null 2>&1 && - scriptlog INFO "If progressive this is wrong use --deinterlace=NO." - # Invtelecine options - elif echo "$INVTELECINE" | egrep -i 'ON|YES' >/dev/null 2>&1 && echo $INFPS | egrep '^24|^25' >/dev/null 2>&1 - then - # Very unusual to have PAL/DVB telecine video - scriptlog INFO "Input $INFPS FPS. Invtelecine filter not supported." - elif echo "$INVTELECINE" | egrep -i 'ON|YES' >/dev/null 2>&1 - then - POSTVIDFILTERS="${POSTVIDFILTERS}${INVTELECINEFILTER}," - OUTFPS="23.976" - scriptlog INFO "Invtelecine filter added." - fi - [ "$OUTFPS" = "23.976" ] && MENOUTFPS="-ofps 24000/1001" - [ -n "$POSTVIDFILTERS" ] && POSTVIDFILTERS="${POSTVIDFILTERS}softskip," - - # Encoder opts - # Force avi for videos staying in MythRecord - if [ "$CONTYPE" = "avi" ] || [ -n "$CHANID" -a -z "$COPYDIR" ] - then - if [ "$AVIVID" = "xvid" ] - then - VBITRATE=$(calcbitrate $ASPECT $SCALE $XVID_CQ) - PASSCMD="pass" - VIDEOCODEC="-ovc xvid -xvidencopts ${XVID_OPTS}:bitrate=${VBITRATE}" - VIDEXT="xvid" - elif [ "$AVIVID" = "lavc" ] - then - VBITRATE=$(calcbitrate $ASPECT $SCALE $LAVC_CQ) - PASSCMD="vpass" - VIDEOCODEC="-ovc lavc -lavcopts ${LAVC_OPTS}:vbitrate=${VBITRATE}" - VIDEXT="lavc" - else - scriptlog ERROR "Skipping $INPUT. Unsupported avi encoder" - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - ABITRATE=$MP3_ABITRATE - AUDIOCODEC="-oac mp3lame -lameopts vbr=2:br=${ABITRATE}" - AUDEXT="mp3" - MENOUT1STPASS="-aspect $ASPECT -force-avi-aspect $ASPECTSTR -o /dev/null" - MENOUTOPT="-aspect $ASPECT -force-avi-aspect $ASPECTSTR -o" - MENOUTFILE="$OUTPUT" - elif [ "$CONTYPE" = "mp4" ] - then - VBITRATE=$(calcbitrate $ASPECT $SCALE $X264_CQ) - AQUAL=$AAC_AQUAL - PASSCMD="pass" - VIDEOCODEC="-ovc x264 -x264encopts ${X264_OPTS}:bitrate=${VBITRATE}" - VIDEXT="h264" - AUDIOCODEC="-oac copy" - AUDEXT="aac" - MENOUT1STPASS="-of rawvideo -o /dev/null" - MENOUTOPT="-of rawvideo -o" - MENOUTFILE="${OUTBASE}_video.h264" - elif [ "$CONTYPE" = "mkv" ] - then - VBITRATE=$(calcbitrate $ASPECT $SCALE $X264_CQ) - if [ "$MKVAUD" = "ogg" ] - then - AQUAL=$OGG_AQUAL - AUDEXT="ogg" - elif [ "$MKVAUD" = "aac" ] - then - AQUAL=$AAC_AQUAL - AUDEXT="aac" - else - scriptlog ERROR "Skipping $INPUT. Unsupported mkv encoder" - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - PASSCMD="pass" - VIDEOCODEC="-ovc x264 -x264encopts ${X264_OPTS}:bitrate=${VBITRATE}" - VIDEXT="h264" - AUDIOCODEC="-oac copy" - MENOUT1STPASS="-of rawvideo -o /dev/null" - MENOUTOPT="-of rawvideo -o" - MENOUTFILE="${OUTBASE}_video.h264" - else - scriptlog ERROR "Skipping $INPUT. Incorrect video contype selected. $CONTYPE" - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - - MENOPTS="${VIDEOCODEC} \ - ${AUDIOCODEC} \ - -vf ${POSTVIDFILTERS}${CROPSCALE}${ENDVIDFILTERS}harddup -sws 7 $MENOUTFPS" - scriptlog INFO "MENCODEROPTS: $MENOPTS." - - RETCODE=0 - # Fireoff a background monitoring job to update the job queue details - [ "$JOBID" -ne 99999999 ] && $CMD --monitor=$JOBID ${$} $TRANSOP $LOGFILE & - - #Start time - ENCSTARTTIME=$(date +%Y-%m-%d\ %H:%M:%S) - ORIGINALFILESIZE=$(du -h "$INPUT" | cut -f1) - - # mp4/mkv have seperate Audio/Video transcodes. - if [ "$AUDEXT" = "aac" ] - then - scriptlog START "Starting $AUDEXT audio trans of $INPUT. quality $AQUAL." - [ "$JOBID" -ne 99999999 ] && setjobqueuecomment "$JOBID" "[${$}] audio pass started" - - if [ ! -f "${OUTBASE}_audio.${AUDEXT}" ] - then - rm -f ${FIFODIR}/*out $TRANSOP $MENCODEROP - if [ -n "$MTINFILE" ] - then - nice -n 19 mythtranscode --profile autodetect $MTINFILE "$MTSOURCE" --fifodir $FIFODIR | tee -a $TRANSOP & - else - nice -n 19 mythtranscode --profile autodetect $MTSOURCE --fifodir $FIFODIR | tee -a $TRANSOP & - fi - sleep 10 - # Throw away video - nice -n 19 dd bs=512k if=${FIFODIR}/vidout of=/dev/null & - nice -n 19 faac ${FIFODIR}/audout -P -R $INARATE -C $CHANNELS $FAACCCOPT -X -q $AQUAL --mpeg-vers 4 -o "${OUTBASE}_audio.${AUDEXT}" - RETCODE=$? - sleep 10 - if [ $RETCODE -ne 0 ] - then - scriptlog ERROR "Skipping $INPUT. Problem with audio pass." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - fi - elif [ "$AUDEXT" = "ogg" ] - then - scriptlog START "Starting $AUDEXT audio trans of $INPUT. quality $AQUAL." - [ "$JOBID" -ne 99999999 ] && setjobqueuecomment "$JOBID" "[${$}] audio pass started" - - if [ ! -f "${OUTBASE}_audio.${AUDEXT}" ] - then - rm -f ${FIFODIR}/*out $TRANSOP $MENCODEROP - if [ -n "$MTINFILE" ] - then - nice -n 19 mythtranscode --profile autodetect $MTINFILE "$MTSOURCE" --fifodir $FIFODIR | tee -a $TRANSOP & - else - nice -n 19 mythtranscode --profile autodetect $MTSOURCE --fifodir $FIFODIR | tee -a $TRANSOP & - fi - sleep 10 - # Throw away video - nice -n 19 dd bs=512k if=${FIFODIR}/vidout of=/dev/null & - nice -n 19 oggenc --raw-chan=${CHANNELS} --raw-rate=${INARATE} --quality=${AQUAL} -o "${OUTBASE}_audio.${AUDEXT}" ${FIFODIR}/audout - RETCODE=$? - sleep 10 - if [ $RETCODE -ne 0 ] - then - scriptlog ERROR "Skipping $INPUT. Problem with audio pass." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - fi - fi - - if [ "$PASS" = "one" ] - then - [ "$JOBID" -ne 99999999 ] && setjobqueuecomment "$JOBID" "[${$}] Single video pass started." - scriptlog START "Starting $VIDEXT Single video pass trans of $INPUT. vbr $VBITRATE abr $ABITRATE." - if [ ! -f "$MENOUTFILE" ] - then - rm -f ${FIFODIR}/*out $TRANSOP $MENCODEROP - if [ -n "$MTINFILE" ] - then - nice -n 19 mythtranscode --profile autodetect $MTINFILE "$MTSOURCE" --fifodir $FIFODIR | tee -a $TRANSOP & - else - nice -n 19 mythtranscode --profile autodetect $MTSOURCE --fifodir $FIFODIR | tee -a $TRANSOP & - fi - sleep 10 - nice -n 19 mencoder -idx -noskip \ - ${FIFODIR}/vidout -demuxer rawvideo -rawvideo w=${INWIDTH}:h=${INHEIGHT}:fps=${INFPS} \ - -audiofile ${FIFODIR}/audout -audio-demuxer rawaudio -rawaudio rate=${INARATE}:channels=${CHANNELS} \ - ${VIDEOCODEC} \ - ${AUDIOCODEC} \ - -vf ${POSTVIDFILTERS}${CROPSCALE}${ENDVIDFILTERS}harddup -sws 7 $MENOUTFPS \ - $MENOUTOPT "$MENOUTFILE" | tee -a $MENCODEROP - RETCODE=$? - sleep 10 - fi - else - scriptlog START "Starting $VIDEXT 1st video pass trans of $INPUT. vbr $VBITRATE abr $ABITRATE." - [ "$JOBID" -ne 99999999 ] && setjobqueuecomment "$JOBID" "[${$}] 1st video pass started." - if [ ! -f "$MENOUTFILE" ] - then - rm -f ${FIFODIR}/*out $TRANSOP $MENCODEROP - if [ -n "$MTINFILE" ] - then - nice -n 19 mythtranscode --profile autodetect $MTINFILE "$MTSOURCE" --fifodir $FIFODIR | tee -a $TRANSOP & - else - nice -n 19 mythtranscode --profile autodetect $MTSOURCE --fifodir $FIFODIR | tee -a $TRANSOP & - fi - sleep 10 - nice -n 19 mencoder -idx \ - ${FIFODIR}/vidout -demuxer rawvideo -rawvideo w=${INWIDTH}:h=${INHEIGHT}:fps=${INFPS} \ - -audiofile ${FIFODIR}/audout -audio-demuxer rawaudio -rawaudio rate=${INARATE}:channels=${CHANNELS} \ - ${VIDEOCODEC}:${PASSCMD}=1:turbo -passlogfile ${FIFODIR}/2pass.log \ - ${AUDIOCODEC} \ - -vf ${POSTVIDFILTERS}${CROPSCALE}${ENDVIDFILTERS}harddup -sws 7 $MENOUTFPS \ - $MENOUT1STPASS - RETCODE=$? - sleep 10 - if [ $RETCODE -ne 0 ] - then - scriptlog ERROR "Skipping $INPUT. Problem with 1st video pass of 2." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - fi - - scriptlog START "Starting $VIDEXT 2nd video pass trans of $INPUT. vbr $VBITRATE abr $ABITRATE." - [ "$JOBID" -ne 99999999 ] && setjobqueuecomment "$JOBID" "[${$}] 2nd video pass started." - if [ ! -f "$MENOUTFILE" ] - then - rm -f ${FIFODIR}/*out $TRANSOP $MENCODEROP - if [ -n "$MTINFILE" ] - then - nice -n 19 mythtranscode --profile autodetect $MTINFILE "$MTSOURCE" --fifodir $FIFODIR | tee -a $TRANSOP & - else - nice -n 19 mythtranscode --profile autodetect $MTSOURCE --fifodir $FIFODIR | tee -a $TRANSOP & - fi - sleep 10 - nice -n 19 mencoder -idx -noskip \ - ${FIFODIR}/vidout -demuxer rawvideo -rawvideo w=${INWIDTH}:h=${INHEIGHT}:fps=${INFPS} \ - -audiofile ${FIFODIR}/audout -audio-demuxer rawaudio -rawaudio rate=${INARATE}:channels=${CHANNELS} \ - ${VIDEOCODEC}:${PASSCMD}=2 -passlogfile ${FIFODIR}/2pass.log \ - ${AUDIOCODEC} \ - -vf ${POSTVIDFILTERS}${CROPSCALE}${ENDVIDFILTERS}harddup -sws 7 $MENOUTFPS \ - $MENOUTOPT "$MENOUTFILE" | tee -a $MENCODEROP - RETCODE=$? - sleep 10 - fi - fi - - if [ $RETCODE -ne 0 ] - then - scriptlog ERROR "Skipping $INPUT. Problem with final video pass. $OUTPUT may exist." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - - if [ -n "$CHANID" ] - then - SEARCHTITLE=$(getsearchtitle "$CHANID" "$STARTTIME") - INETREF=$(lookupinetref "$SEARCHTITLE" "$CHANID" "$STARTTIME") - SERIESEPISODE=$(getseriesepisode "$CHANID" "$STARTTIME" "$INETREF") - TITLE=$(createfiletitleSEsubtitle "$CHANID" "$STARTTIME" "$SERIESEPISODE") - else - TITLE=$(basename "$OUTPUT" | sed -e 's/\.[am][vkp][iv4]$//') - fi - - if [ "$CONTYPE" = "mp4" -o "$CONTYPE" = "mkv" ] - then - scriptlog START "Joining ${OUTBASE}_video.h264 ${OUTBASE}_audio.${AUDEXT} in $CONTYPE container." - [ "$JOBID" -ne 99999999 ] && setjobqueuecomment "$JOBID" "[${$}] Joining in $CONTYPE container." - if ! encloseincontainer "$OUTBASE" $OUTFPS $AUDEXT $CONTYPE $ASPECTSTR $TITLE - then - scriptlog ERROR "$CONTYPE container Failed for $OUTPUT." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - fi - - scriptlog START "Checking $OUTPUT." - [ "$JOBID" -ne 99999999 ] && setjobqueuecomment "$JOBID" "[${$}] Checking result." - if ! checkoutput "$INPUT" "$OUTPUT" "$MENCODEROP" - then - mv "$OUTPUT" "${OUTPUT}-SUSPECT" - scriptlog ERROR "$OUTPUT may be faulty. Saved as ${OUTPUT}-SUSPECT. $INPUT kept." - scriptlog BREAK - unset CHANID STARTTIME - continue - fi - - if [ -n "$COPYDIR" ] - then - # Is this a good idea? - #CATEGORY=$(getcategory "$CHANID" "$STARTTIME") - #[ -n "$CATEGORY" ] - #then - # COPYDIR="${COPYDIR}/${CATEGORY}" - #fi - [ -d "$COPYDIR" ] || mkdir -p "$COPYDIR" - COPYFILE="${TITLE}.${CONTYPE}" - while [ -f "${COPYDIR}/${COPYFILE}" ] - do - COUNT=$(( ${COUNT:=0} + 1 )) - COPYFILE="${TITLE}_${COUNT}.${CONTYPE}" - done - if cp "$OUTPUT" "${COPYDIR}/${COPYFILE}" - then - rm -f "$OUTPUT" - scriptlog SUCCESS "Successful trans. $INPUT trans to ${COPYDIR}/${COPYFILE}. $INPUT kept" - MYTHVIDDIR=$(getsetting VideoStartupDir) - if [ "$QUICKTIME_MP4" = "YES" ] - then - OLDFILE="${COPYDIR}/${COPYFILE}" - COPYFILE=$(echo "$COPYFILE" | sed -e 's/mp4$/mov/') - mv "$OLDFILE" "${COPYDIR}/${COPYFILE}" - fi - if echo "$COPYDIR" | grep "$MYTHVIDDIR" >/dev/null 2>&1 - then - createvideometadata "${COPYDIR}/${COPYFILE}" "$TITLE" "$ASPECTSTR" "$CHANID" "$STARTTIME" "$INETREF" "$SERIESEPISODE" - fi - if echo "$DELETEREC" | egrep -i 'ON|YES' >/dev/null 2>&1 - then - scriptlog INFO "Deleting recording." - deleterecording "$CHANID" "$STARTTIME" - fi - NEWFILESIZE=$(du -h "${COPYDIR}/${COPYFILE}" | cut -f1) - else - scriptlog ERROR "Successful trans but copy to ${COPYDIR}/${COPYFILE} bad. $INPUT trans to $OUTPUT. $INPUT kept" - fi - else - if [ -n "$CHANID" ] - then - scriptlog INFO "Updating MythRecord db to $OUTPUT." - updatemetadata "$OUTPUT" "$CHANID" "$STARTTIME" - # mythcommflag --rebuild does not work correctly for avi files. - # Without this you can't edit files, but with it seeks don't work correctly. - #scriptlog INFO "Rebuilding seektable for $OUTPUT." - #mythcommflag --chanid "$CHANID" --starttime "$STARTTIME" --rebuild >/dev/null - rm -f "${INPUT}.png" - fi - [ "$DEBUG" = "ON" -o "$SAVENUV" = "ON" ] && mv "$INPUT" "${INPUT}OK-DONE" - [ "$DEBUG" != "ON" -a "$SAVENUV" != "ON" ] && rm -f "$INPUT" - scriptlog SUCCESS "Successful trans to $OUTPUT. $INPUT removed." - NEWFILESIZE=$(du -h "$OUTPUT" | cut -f1) - fi - # End time - ENCENDTIME=$(date +%Y-%m-%d\ %H:%M:%S) - logtranstime "$ENCSTARTTIME" "$ENCENDTIME" "$ORIGINALFILESIZE" "$NEWFILESIZE" - scriptlog BREAK - unset CHANID STARTTIME -done -exit $FINALEXIT - - -#STARTNUVINFO -#!/usr/bin/perl -# $Date: 2009/03/18 20:11:57 $ -# $Revision: 1.44 $ -# $Author: mythtv $ -# -# mythtv::nuvinfo.pm -# -# exports one routine: nuv_info($path_to_nuv) -# This routine inspects a specified nuv file, and returns information about -# it, gathered either from its nuv file structure -# -# Auric grabbed from nuvexport and Modified. Thanks to the nuvexport guys, I never would have been able to work this out -# -# finfo version width height desiredheight desiredwidth pimode aspect fps videoblocks audioblocks textsblocks keyframedist video_type audio_type audio_sample_rate audio_bits_per_sample audio_channels audio_compression_ratio audio_quality rtjpeg_quality rtjpeg_luma_filter rtjpeg_chroma_filter lavc_bitrate lavc_qmin lavc_qmax lavc_maxqdiff seektable_offset keyframeadjust_offset - -# Byte swap a 32-bit number from little-endian to big-endian - sub byteswap32 { - # Read in a 4-character string - my $in = shift; - my $out = $in; - - if ($Config{'byteorder'} == 4321) { - substr($out, 0, 1) = substr($in, 3, 1); - substr($out, 3, 1) = substr($in, 0, 1); - substr($out, 1, 1) = substr($in, 2, 1); - substr($out, 2, 1) = substr($in, 1, 1); - } - - return $out; - } - -# Byte swap a 64-bit number from little-endian to big-endian - sub byteswap64 { - # Read in a 8-character string - my $in = shift; - my $out = $in; - - if ($Config{'byteorder'} == 4321) { - substr($out, 4, 4) = byteswap32(substr($in, 0, 4)); - substr($out, 0, 4) = byteswap32(substr($in, 4, 4)); - } - - return $out; - } - -# Opens a .nuv file and returns information about it - sub nuv_info { - my $file = shift; - my(%info, $buffer); - # open the file - open(DATA, $file) or die "Can't open $file: $!\n\n"; - # Read the file info header - read(DATA, $buffer, 72); - # Byte swap the buffer - if ($Config{'byteorder'} == 4321) { - substr($buffer, 20, 4) = byteswap32(substr($buffer, 20, 4)); - substr($buffer, 24, 4) = byteswap32(substr($buffer, 24, 4)); - substr($buffer, 28, 4) = byteswap32(substr($buffer, 28, 4)); - substr($buffer, 32, 4) = byteswap32(substr($buffer, 32, 4)); - substr($buffer, 40, 8) = byteswap64(substr($buffer, 40, 8)); - substr($buffer, 48, 8) = byteswap64(substr($buffer, 48, 8)); - substr($buffer, 56, 4) = byteswap32(substr($buffer, 56, 4)); - substr($buffer, 60, 4) = byteswap32(substr($buffer, 60, 4)); - substr($buffer, 64, 4) = byteswap32(substr($buffer, 64, 4)); - substr($buffer, 68, 4) = byteswap32(substr($buffer, 68, 4)); - } - # Unpack the data structure - ($info{'finfo'}, # "NuppelVideo" + \0 - $info{'version'}, # "0.05" + \0 - $info{'width'}, - $info{'height'}, - $info{'desiredheight'}, # 0 .. as it is - $info{'desiredwidth'}, # 0 .. as it is - $info{'pimode'}, # P .. progressive, I .. interlaced (2 half pics) [NI] - $info{'aspect'}, # 1.0 .. square pixel (1.5 .. e.g. width=480: width*1.5=720 for capturing for svcd material - $info{'fps'}, - $info{'videoblocks'}, # count of video-blocks -1 .. unknown 0 .. no video - $info{'audioblocks'}, # count of audio-blocks -1 .. unknown 0 .. no audio - $info{'textsblocks'}, # count of text-blocks -1 .. unknown 0 .. no text - $info{'keyframedist'} - ) = unpack('Z12 Z5 xxx i i i i a xxx d d i i i i', $buffer); - # Perl occasionally over-reads on the previous read() - seek(DATA, 72, 0); - # Read and parse the first frame header - read(DATA, $buffer, 12); - # Byte swap the buffer - if ($Config{'byteorder'} == 4321) { - substr($buffer, 4, 4) = byteswap32(substr($buffer, 4, 4)); - substr($buffer, 8, 4) = byteswap32(substr($buffer, 8, 4)); - } - my ($frametype, - $comptype, - $keyframe, - $filters, - $timecode, - $packetlength) = unpack('a a a a i i', $buffer); - # Parse the frame - die "Illegal nuv file format: $file\n\n" unless ($frametype eq 'D'); - # Read some more stuff if we have to - read(DATA, $buffer, $packetlength) if ($packetlength); - # Read the remaining frame headers - while (12 == read(DATA, $buffer, 12)) { - # Byte swap the buffer - if ($Config{'byteorder'} == 4321) { - substr($buffer, 4, 4) = byteswap32(substr($buffer, 4, 4)); - substr($buffer, 8, 4) = byteswap32(substr($buffer, 8, 4)); - } - # Parse the frame header - ($frametype, - $comptype, - $keyframe, - $filters, - $timecode, - $packetlength) = unpack('a a a a i i', $buffer); - # Read some more stuff if we have to - read(DATA, $buffer, $packetlength) if ($packetlength); - # Look for the audio frame - if ($frametype eq 'X') { - # Byte swap the buffer - if ($Config{'byteorder'} == 4321) { - substr($buffer, 0, 4) = byteswap32(substr($buffer, 0, 4)); - substr($buffer, 12, 4) = byteswap32(substr($buffer, 12, 4)); - substr($buffer, 16, 4) = byteswap32(substr($buffer, 16, 4)); - substr($buffer, 20, 4) = byteswap32(substr($buffer, 20, 4)); - substr($buffer, 24, 4) = byteswap32(substr($buffer, 24, 4)); - substr($buffer, 28, 4) = byteswap32(substr($buffer, 28, 4)); - substr($buffer, 32, 4) = byteswap32(substr($buffer, 32, 4)); - substr($buffer, 36, 4) = byteswap32(substr($buffer, 36, 4)); - substr($buffer, 40, 4) = byteswap32(substr($buffer, 40, 4)); - substr($buffer, 44, 4) = byteswap32(substr($buffer, 44, 4)); - substr($buffer, 48, 4) = byteswap32(substr($buffer, 48, 4)); - substr($buffer, 52, 4) = byteswap32(substr($buffer, 52, 4)); - substr($buffer, 56, 4) = byteswap32(substr($buffer, 56, 4)); - substr($buffer, 60, 8) = byteswap64(substr($buffer, 60, 8)); - substr($buffer, 68, 8) = byteswap64(substr($buffer, 68, 8)); - } - my $frame_version; - ($frame_version, - $info{'video_type'}, - $info{'audio_type'}, - $info{'audio_sample_rate'}, - $info{'audio_bits_per_sample'}, - $info{'audio_channels'}, - $info{'audio_compression_ratio'}, - $info{'audio_quality'}, - $info{'rtjpeg_quality'}, - $info{'rtjpeg_luma_filter'}, - $info{'rtjpeg_chroma_filter'}, - $info{'lavc_bitrate'}, - $info{'lavc_qmin'}, - $info{'lavc_qmax'}, - $info{'lavc_maxqdiff'}, - $info{'seektable_offset'}, - $info{'keyframeadjust_offset'} - ) = unpack('ia4a4iiiiiiiiiiiill', $buffer); - # Found the audio data we want - time to leave - last; - } - # Done reading frames - let's leave - else { - last; - } - } - # Close the file - close DATA; - # Make sure some things are actually numbers - $info{'width'} += 0; - $info{'height'} += 0; - # HD fix - if ($info{'height'} == 1080) { - $info{'height'} = 1088; - } - # Make some corrections for myth bugs - $info{'audio_sample_rate'} = 44100 if ($info{'audio_sample_rate'} == 42501 || $info{'audio_sample_rate'} =~ /^44\d\d\d$/); - # NEIL Don't know why he hard set it? - # $info{'aspect'} = '4:3'; - # Cleanup - $info{'aspect'} = aspect_str($info{'aspect'}); - $info{'aspect_f'} = aspect_float($info{'aspect'}); - # Return - return %info; - } - - sub aspect_str { - my $aspect = shift; - # Already in ratio format - return $aspect if ($aspect =~ /^\d+:\d+$/); - # European decimals... - $aspect =~ s/\,/\./; - # Parse out decimal formats - if ($aspect == 1) { return '1:1'; } - elsif ($aspect =~ m/^1.3/) { return '4:3'; } - elsif ($aspect =~ m/^1.7/) { return '16:9'; } - elsif ($aspect == 2.21) { return '2.21:1'; } - # Unknown aspect - print STDERR "Unknown aspect ratio: $aspect\n"; - return $aspect.':1'; - } - - sub aspect_float { - my $aspect = shift; - # European decimals... - $aspect =~ s/\,/\./; - # In ratio format -- do the math - if ($aspect =~ /^\d+:\d+$/) { - my ($w, $h) = split /:/, $aspect; - return $w / $h; - } - # Parse out decimal formats - if ($aspect eq '1') { return 1; } - elsif ($aspect =~ m/^1.3/) { return 4 / 3; } - elsif ($aspect =~ m/^1.7/) { return 16 / 9; } - # Unknown aspect - return $aspect; - } - -my %info = nuv_info($ENV{'NUVINFOFILE'}); -my $c = 0; -foreach my $key (split(' ', $ENV{'NUVINFOPROPS'})) { - ($c++ < 1) and print "$info{$key}" or print ":$info{$key}"; -} -print "\n"; -#ENDNUVINFO - -########################################################################################################### -License Notes: --------------- - -This software product is licensed under the GNU General Public License -(GPL). This license gives you the freedom to use this product and have -access to the source code. You can modify this product as you see fit -and even use parts in your own software. If you choose to do so, you -also choose to accept that a modified product or software that use any -code from mythnuv2mkv.sh MUST also be licensed under the GNU General Public -License. - -In plain words, you can NOT sell or distribute mythnuv2mkv.sh, a modified -version or any software product based on any parts of mythnuv2mkv.sh as a -closed source product. Likewise you cannot re-license this product and -derivates under another license other than GNU GPL. - -See also the article, "Free Software Matters: Enforcing the GPL" by -Eben Moglen. http://emoglen.law.columbia.edu/publications/lu-13.html -########################################################################################################### -- cgit v0.12