From cace87216a88208a87e4ef3a2f8fc24f9022988f Mon Sep 17 00:00:00 2001 From: Britney Fransen Date: Sun, 16 Dec 2012 17:00:42 -0600 Subject: mythplugins: mythburn.py patch for aspect ratio and video storage groups support. Updated for mythtv .25 --- abs/core/mythtv/stable-0.25/mythplugins/PKGBUILD | 6 +- .../stable-0.25/mythplugins/mythburn.py.patch | 279 ++++++++++----------- 2 files changed, 130 insertions(+), 155 deletions(-) diff --git a/abs/core/mythtv/stable-0.25/mythplugins/PKGBUILD b/abs/core/mythtv/stable-0.25/mythplugins/PKGBUILD index f8b7cbb..356e6c7 100644 --- a/abs/core/mythtv/stable-0.25/mythplugins/PKGBUILD +++ b/abs/core/mythtv/stable-0.25/mythplugins/PKGBUILD @@ -12,7 +12,7 @@ pkgname=('mytharchive' 'mythweather' 'mythzoneminder') pkgver=0.25 -pkgrel=6 +pkgrel=7 arch=('i686' 'x86_64') url="http://www.mythtv.org" @@ -61,7 +61,7 @@ package_mytharchive() { # replaces=('mytharchive') cd "${srcdir}/${_gitname}/${pkgbase}/mytharchive" -# patch mythburn/scripts/mythburn.py < $srcdir/mythburn.py.patch || return 1 + patch mythburn/scripts/mythburn.py < $srcdir/mythburn.py.patch || return 1 make INSTALL_ROOT="${pkgdir}" install || return 1 } @@ -134,4 +134,4 @@ package_mythzoneminder() { make INSTALL_ROOT="${pkgdir}" install || return 1 } -md5sums=('cc7e6887acda167fcc5336af33f29411') +md5sums=('8a0e5e6a7fba3a7d03040fc23556f717') diff --git a/abs/core/mythtv/stable-0.25/mythplugins/mythburn.py.patch b/abs/core/mythtv/stable-0.25/mythplugins/mythburn.py.patch index abac7df..7b385b3 100644 --- a/abs/core/mythtv/stable-0.25/mythplugins/mythburn.py.patch +++ b/abs/core/mythtv/stable-0.25/mythplugins/mythburn.py.patch @@ -1,23 +1,32 @@ ---- mythburn.py.orig 2011-09-16 13:41:43.000000000 -0500 -+++ mythburn.py 2011-09-17 10:51:36.000000000 -0500 -@@ -38,7 +38,7 @@ - #****************************************************************************** +--- mythburn.py.orig 2012-12-16 15:23:41.000000000 -0600 ++++ mythburn.py 2012-12-16 15:33:37.000000000 -0600 +@@ -44,7 +44,7 @@ + # version of script - change after each update --VERSION="0.1.20101206-1" -+VERSION="0.1.20110821-1" +-VERSION="0.1.20120304-1" ++VERSION="0.1.20121210-1" # keep all temporary files for debugging purposes # set this to True before a first run through when testing -@@ -75,6 +75,7 @@ +@@ -93,6 +93,7 @@ from fcntl import ioctl import CDROM from shutil import copy +from subprocess import Popen, PIPE - # media types (should match the enum in mytharchivewizard.h) - DVD_SL = 0 -@@ -606,7 +607,7 @@ + import MythTV + from MythTV.altdict import OrdDict +@@ -425,7 +426,7 @@ + os.remove(os.path.join(root, name)) + + ############################################################# +-# Romoves all the objects from a directory ++# Removes all the objects from a directory + + def deleteEverythingInFolder(folder): + for root, dirs, files in os.walk(folder, topdown=False): +@@ -615,7 +616,7 @@ # of a video file from its stream info file def getVideoParams(folder): @@ -26,7 +35,7 @@ #open the XML containing information about this file infoDOM = xml.dom.minidom.parse(os.path.join(folder, 'streaminfo.xml')) -@@ -642,14 +643,14 @@ +@@ -651,14 +652,14 @@ # Gets the aspect ratio of a video file from its stream info file def getAspectRatioOfVideo(index): @@ -44,65 +53,78 @@ video = infoDOM.getElementsByTagName("file")[0].getElementsByTagName("streams")[0].getElementsByTagName("video")[0] if video.attributes["aspectratio"].value != 'N/A': aspect_ratio = float(video.attributes["aspectratio"].value) -@@ -1762,6 +1763,37 @@ +@@ -679,7 +680,7 @@ + + #error out if its the wrong XML + if infoDOM.documentElement.tagName != "file": +- fatalError("Stream info file doesn't look right (%s)" % os.path.join(getItemTempPath(index), 'streaminfo_orig.xml')) ++ fatalError("Stream info file doesn't look right (%s)" % os.path.join(getItemTempPath(index), 'streaminfo.xml')) + + video = infoDOM.getElementsByTagName("file")[0].getElementsByTagName("streams")[0].getElementsByTagName("video")[0] + video_start = float(video.attributes["start_time"].value) +@@ -1432,9 +1433,18 @@ + + data.rating = str(vid.userrating) + +- if doesFileExist(vid.coverfile): ++ #Check filename for valid path. If valid return nothing. ++ if doesFileExist(str(vid.coverfile)): ++ write("Coverart is in local directory: %s" % vid.coverfile) + data.coverfile = vid.coverfile +- ++ else: ++ # iterate through storage group directories to get Coverart ++ for sg in DB.getStorageGroup(groupname='Coverart', hostname=DB.gethostname()): ++ if doesFileExist(os.path.join(sg.dirname, str(vid.coverfile))): ++ write("Coverart is in Storage Groups: %s%s" % (sg.dirname, vid.coverfile)) ++ data.coverfile = os.path.join(sg.dirname, str(vid.coverfile)) ++ break ++ + elif file.attributes["type"].value=="file": + data.type = file.attributes["type"].value + data.filename = file.attributes["filename"].value +@@ -1485,6 +1495,28 @@ ############################################################# -+# Finds the path of a video file from the local video path -+# or Storage Group ++# Finds the path of a video file from a Storage Group + +def getVideoPath(filename): -+ # connect -+ db = getDatabaseConnection() -+ # create a cursor -+ cursor = db.cursor() -+ # execute SQL statement -+ cursor.execute("""SELECT dirname -+ FROM storagegroup -+ WHERE groupname='Videos'""") -+ # get the resultset as a tuple -+ result = cursor.fetchall() -+ # make result a list and add local video path if exists -+ result = [videopath] + list(result) -+ -+ # iterate through result set -+ for sg in result: -+ if doesFileExist(os.path.join("".join(sg), filename)) == True: -+ filepath = "".join(sg) -+ write("Video Path: %s" % filepath) -+ return (filepath) -+ break ++ ++ filepath = None + -+ db.close() -+ del db -+ del cursor ++ #Check filename for valid path. If valid return nothing. ++ if doesFileExist(filename): ++ write("Video is in local video dir: %s" % filename) ++ return (filepath) ++ else: ++ # iterate through storage group directories ++ for sg in DB.getStorageGroup(groupname='Videos', hostname=DB.gethostname()): ++ wholepath = os.path.join(sg.dirname, filename) ++ if doesFileExist(wholepath): ++ write("Video is in Storage Groups: %s" % wholepath) ++ filepath = "".join(sg.dirname) ++ return (filepath) ++ break + + +############################################################# # Pre-process a single video/recording file def preProcessFile(file, folder, count): -@@ -1775,11 +1807,11 @@ - #3. Extract a single frame from the video to use as a thumbnail and resolution check - mediafile="" - -- if file.attributes["type"].value == "recording": -+ if file.attributes["type"].value=="recording": +@@ -1501,7 +1533,7 @@ + if file.attributes["type"].value == "recording": mediafile = file.attributes["filename"].value -- elif file.attributes["type"].value == "video": + elif file.attributes["type"].value == "video": - mediafile = os.path.join(videopath, file.attributes["filename"].value) -- elif file.attributes["type"].value == "file": -+ elif file.attributes["type"].value=="video": + mediafile = os.path.join(getVideoPath(file.attributes["filename"].value), file.attributes["filename"].value) -+ elif file.attributes["type"].value=="file": + elif file.attributes["type"].value == "file": mediafile = file.attributes["filename"].value else: - fatalError("Unknown type of video file it must be 'recording', 'video' or 'file'.") -@@ -1935,9 +1967,39 @@ +@@ -1661,6 +1693,37 @@ + fatalError("Failed while running mytharchivehelper to get stream information.\n" + "Result: %d, Command was %s" % (result, command)) - if result <> 0: - fatalError("Failed while running mytharchivehelper to get stream information from %s" % filename) -+ + #open the XML containing information about this file + infoDOM = xml.dom.minidom.parse(xmlFilename) + @@ -114,7 +136,7 @@ + video = infoDOM.getElementsByTagName("file")[0].getElementsByTagName("streams")[0].getElementsByTagName("video")[0] + + #use ffmpeg to get display aspect ratio (DAR) of video -+ cmd = path_ffmpeg[0] + " -i " + quoteFilename(file.attributes["filename"].value) + " 2>&1" ++ cmd = "mythffmpeg -i " + quoteCmdArg(file.attributes["filename"].value) + " 2>&1" + aspect_ratio = Popen(cmd, shell=True, stdout=PIPE).stdout.read() + if "DAR" in aspect_ratio: + #clean DAR string @@ -133,74 +155,66 @@ + video.setAttribute("aspectratio",str(aspect_ratio)) + + WriteXMLToFile (infoDOM,xmlFilename) - ++ # print out the streaminfo.xml file to the log -- infoDOM = xml.dom.minidom.parse(xmlFilename) - write("streaminfo.xml :-\n" + infoDOM.toprettyxml(" ", ""), False) + infoDOM = xml.dom.minidom.parse(xmlFilename) + write(xmlFilename + ":-\n" + infoDOM.toprettyxml(" ", ""), False) +@@ -1707,7 +1770,7 @@ + write("Using cutlist: %s" % cutlist_s) - ############################################################# -@@ -2322,7 +2384,7 @@ + if (localfile != ""): +- localfile = quoteFilename(localfile) ++ localfile = quoteCmdArg(localfile) + if usecutlist == True: + command = "mythtranscode --mpeg2 --honorcutlist %s --infile %s --outfile %s" % (cutlist_s, quoteCmdArg(localfile), quoteCmdArg(destination)) + else: +@@ -1973,7 +2036,7 @@ ############################################################# # Re-encodes a file to mpeg2 -def encodeVideoToMPEG2(source, destvideofile, video, audio1, audio2, aspectratio, profile): +def encodeVideoToMPEG2(source, destvideofile, video, folder, audio1, audio2, aspectratio, profile): - """Encodes an unknown video source file eg. AVI to MPEG2 video and AC3 audio, use ffmpeg""" + """Encodes an unknown video source file eg. AVI to MPEG2 video and AC3 audio, use mythffmpeg""" profileNode = findEncodingProfile(profile) -@@ -2347,6 +2409,18 @@ - value = quoteFilename(destvideofile) +@@ -1998,7 +2061,36 @@ + value = quoteCmdArg(destvideofile) if value == "%aspect": value = aspectratio + if value == "720x480" or value == "720x576": -+ #add padding to correct for aspects > than 1.9:1 + videores, fps, videoAR = getVideoParams(folder) ++ videoWidth = int(videores.split("x")[0]) ++ videoHeight = int(videores.split("x")[1]) ++ ++ #add padding to correct for aspects > than 1.9:1 + if float(videoAR) >= 1.9: ++ #check which video type and set the correct height + if videomode == "ntsc": -+ videoheight = 480 ++ videoModeHeight = 480 + else: -+ videoheight = 576 -+ -+ croppixels = videoheight - (720 / float(videoAR)) -+ write("CropPixels Total: %s" % croppixels) -+ value = "720x%d -vf pad=720:%d:0:%d:black" % (videoheight - croppixels, videoheight, croppixels / 2) ++ videoModeHeight = 576 ++ #calculate the video height based on the aspect ratio of the video ++ #multiply by 1.185 to compensate for dvds non-square pixels ++ calVideoHeight = int(round((720 / float(videoAR)) * 1.185)) ++ if calVideoHeight % 2 == 1: ++ calVideoHeight = calVideoHeight + 1 ++ #write("calVideoHeight: %s" % calVideoHeight) ++ ++ #use original video height if the calculated video height is close ++ if (calVideoHeight + 20 < videoHeight) or (calVideoHeight - 20 > videoHeight): ++ videoHeight = calVideoHeight ++ ++ cropPixels = videoModeHeight - videoHeight ++ ++ write("Crop Pixels Total: %s" % cropPixels) ++ name = "-vf" ++ value = "\"scale=720:%d, setsar=1:1, pad=720:%d:0:%d:black\"" % (videoModeHeight - cropPixels, videoModeHeight, cropPixels / 2) ++ # only re-encode the audio if it is not already in AC3 format if audio1[AUDIO_CODEC] == "AC3": -@@ -2383,12 +2457,12 @@ - command += " -newaudio" - - #make sure we get the correct stream(s) that we want -- command += " -map 0:%d -map 0:%d " % (video[VIDEO_INDEX], audio1[AUDIO_INDEX]) -+ command += " -map 0:%d -map 0:%d" % (video[VIDEO_INDEX], audio1[AUDIO_INDEX]) - if audio2[AUDIO_ID] != -1: - command += "-map 0:%d" % (audio2[AUDIO_INDEX]) - - if passes == 1: -- write(command) -+ write("Running ffmpeg: %s" % command) - result = runCommand(command) - if result!=0: - fatalError("Failed while running ffmpeg to re-encode video.\n" -@@ -2399,7 +2473,7 @@ - - pass1 = string.replace(command, "%passno","1") - pass1 = string.replace(pass1, "%passlogfile", passLog) -- write("Pass 1 - " + pass1) -+ write("Running ffmpeg Pass 1: %s" % pass1) - result = runCommand(pass1) - - if result!=0: -@@ -2411,7 +2485,7 @@ - - pass2 = string.replace(command, "%passno","2") - pass2 = string.replace(pass2, "%passlogfile", passLog) -- write("Pass 2 - " + pass2) -+ write("Running ffmpeg Pass 2: %s" % pass2) - result = runCommand(pass2) - - if result!=0: -@@ -2443,10 +2517,6 @@ + if name == "-acodec": +@@ -2094,10 +2186,6 @@ outaudiosamplerate = 48000 outaudiocodec = "ac3" deinterlace = 0 @@ -211,7 +225,7 @@ qmin = 5 qmax = 31 qdiff = 31 -@@ -2470,14 +2540,6 @@ +@@ -2121,14 +2209,6 @@ outvideores = value if name == "-deinterlace": deinterlace = 1 @@ -226,78 +240,39 @@ if name == "-qmin": qmin = value if name == "-qmax": -@@ -2526,7 +2588,6 @@ - command += "-aspect %s -r %s " % (aspectratio, fps) - if (deinterlace == 1): - command += "-deinterlace " -- command += "-croptop %s -cropright %s -cropbottom %s -cropleft %s " % (croptop, cropright, cropbottom, cropleft) - command += "-s %s -b %s -vcodec mpeg2video " % (outvideores, outvideobitrate) - command += "-qmin %s -qmax %s -qdiff %s " % (qmin, qmax, qdiff) - command += "-ab %s -ar %s -acodec %s " % (outaudiobitrate, outaudiosamplerate, outaudiocodec) -@@ -2543,7 +2604,7 @@ - if (not(doesFileExist(os.path.join(folder, "audout")) and doesFileExist(os.path.join(folder, "vidout")))): - fatalError("Waited too long for mythtranscode to create the fifos - giving up!!") - -- write("Running ffmpeg") -+ write("Running ffmpeg: %s" % command) - result = runCommand(command) - if result != 0: - os.kill(PID, signal.SIGKILL) -@@ -4724,7 +4785,7 @@ +@@ -4409,7 +4489,7 @@ elif file.attributes["type"].value=="recording": mediafile = file.attributes["filename"].value elif file.attributes["type"].value=="video": - mediafile=os.path.join(videopath, file.attributes["filename"].value) -+ mediafile = os.path.join(getVideoPath(file.attributes["filename"].value), file.attributes["filename"].value) ++ mediafile=os.path.join(getVideoPath(file.attributes["filename"].value), file.attributes["filename"].value) elif file.attributes["type"].value=="file": mediafile=file.attributes["filename"].value else: -@@ -4834,8 +4895,7 @@ - starttime = -1 - usecutlist = -1 - -- encodeNuvToMPEG2(chanid, starttime, mediafile, os.path.join(folder, "newfile2.mpg"), folder, -- profile, usecutlist) -+ encodeNuvToMPEG2(chanid, starttime, mediafile, os.path.join(folder, "newfile2.mpg"), folder, profile, usecutlist) - mediafile = os.path.join(folder, 'newfile2.mpg') - else: - #we need to re-encode the file, make sure we get the right video/audio streams -@@ -4861,8 +4921,7 @@ - profile = defaultEncodingProfile +@@ -4547,7 +4627,7 @@ #do the re-encode -- encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video, + encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video, - audio1, audio2, aspectratio, profile) -+ encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video, folder, audio1, audio2, aspectratio, profile) ++ folder, audio1, audio2, aspectratio, profile) mediafile = os.path.join(folder, 'newfile2.mpg') #remove the old mediafile that was run through mythtranscode -@@ -4936,7 +4995,7 @@ +@@ -4621,7 +4701,7 @@ elif file.attributes["type"].value=="recording": mediafile = file.attributes["filename"].value elif file.attributes["type"].value=="video": - mediafile=os.path.join(videopath, file.attributes["filename"].value) -+ mediafile = os.path.join(getVideoPath(file.attributes["filename"].value), file.attributes["filename"].value) ++ mediafile=os.path.join(getVideoPath(file.attributes["filename"].value), file.attributes["filename"].value) elif file.attributes["type"].value=="file": mediafile=file.attributes["filename"].value else: -@@ -4988,8 +5047,7 @@ - starttime = -1 - usecutlist = -1 - -- encodeNuvToMPEG2(chanid, starttime, mediafile, os.path.join(folder, "newfile2.mpg"), folder, -- profile, usecutlist) -+ encodeNuvToMPEG2(chanid, starttime, mediafile, os.path.join(folder, "newfile2.mpg"), folder, profile, usecutlist) - mediafile = os.path.join(folder, 'newfile2.mpg') - else: - #we need to re-encode the file, make sure we get the right video/audio streams -@@ -5015,8 +5073,7 @@ - profile = defaultEncodingProfile +@@ -4701,7 +4781,7 @@ #do the re-encode -- encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video, + encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video, - audio1, audio2, aspectratio, profile) -+ encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video, folder, audio1, audio2, aspectratio, profile) ++ folder, audio1, audio2, aspectratio, profile) mediafile = os.path.join(folder, 'newfile2.mpg') #remove an intermediate file -- cgit v0.12