--- mythburn.py.orig 2012-12-16 15:23:41.000000000 -0600 +++ mythburn.py 2012-12-18 14:23:56.000000000 -0600 @@ -44,7 +44,7 @@ # version of script - change after each update -VERSION="0.1.20120304-1" +VERSION="0.1.20121218-1" # keep all temporary files for debugging purposes # set this to True before a first run through when testing @@ -93,6 +93,7 @@ from fcntl import ioctl import CDROM from shutil import copy +from subprocess import Popen, PIPE 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): - """Returns the video resolution, fps and aspect ratio for the video file from the streamindo.xml file""" + """Returns the video resolution, fps and aspect ratio for the video file from the streaminfo.xml file""" #open the XML containing information about this file infoDOM = xml.dom.minidom.parse(os.path.join(folder, 'streaminfo.xml')) @@ -651,14 +652,14 @@ # Gets the aspect ratio of a video file from its stream info file def getAspectRatioOfVideo(index): - """Returns the aspect ratio of the video file (1.333, 1.778, etc)""" + """Returns the aspect ratio of the original video file (1.333, 1.778, etc)""" #open the XML containing information about this file - infoDOM = xml.dom.minidom.parse(os.path.join(getItemTempPath(index), 'streaminfo.xml')) + infoDOM = xml.dom.minidom.parse(os.path.join(getItemTempPath(index), 'streaminfo_orig.xml')) #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.xml')) + fatalError("Stream info file doesn't look right (%s)" % os.path.join(getItemTempPath(index), 'streaminfo_orig.xml')) 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) @@ -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,23 @@ data.rating = str(vid.userrating) - if doesFileExist(vid.coverfile): - data.coverfile = vid.coverfile + data.coverfile = None + #Check filename for valid path. If valid return nothing. + if os.path.isfile(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 os.path.isfile(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 + + if data.coverfile == None: + write("No Coverart Found") + elif file.attributes["type"].value=="file": data.type = file.attributes["type"].value data.filename = file.attributes["filename"].value @@ -1485,6 +1500,30 @@ ############################################################# +# Finds the path of a video file from a Storage Group + +def getVideoPath(filename): + + filepath = None + + #Check filename for valid path. If valid return nothing. + if os.path.isfile(filename): + write("Video is in local video directory: %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 os.path.isfile(wholepath): + write("Video is in Storage Groups: %s" % wholepath) + filepath = "".join(sg.dirname) + return (filepath) + break + + if filepath == None: + write("Video is not in local video directory or Storage Groups") + +############################################################# # Pre-process a single video/recording file def preProcessFile(file, folder, count): @@ -1501,7 +1540,7 @@ if 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) elif file.attributes["type"].value == "file": mediafile = file.attributes["filename"].value else: @@ -1661,6 +1700,37 @@ fatalError("Failed while running mytharchivehelper to get stream information.\n" "Result: %d, Command was %s" % (result, command)) + #open the XML containing information about this file + infoDOM = xml.dom.minidom.parse(xmlFilename) + + #error out if its the wrong XML + if infoDOM.documentElement.tagName != "file": + fatalError("This info file doesn't look right (%s)." % xmlFilename) + + file = infoDOM.getElementsByTagName("file")[0] + video = infoDOM.getElementsByTagName("file")[0].getElementsByTagName("streams")[0].getElementsByTagName("video")[0] + + #use ffmpeg to get display aspect ratio (DAR) of video + 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 + aspect_ratio = aspect_ratio.split("DAR ")[-1].split(",")[0] + aspect_ratio = ''.join([c for c in aspect_ratio if c in '1234567890:']).split(":") + else: + #calculate aspect from video size + aspect_ratio = getVideoSize(xmlFilename) + + #convert to decimal + aspect_ratio = float(aspect_ratio[0]) / float(aspect_ratio[1]) + + write("Video %s aspect ratio is: %s" % (filename, aspect_ratio)) + + #set aspect ratio + 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(xmlFilename + ":-\n" + infoDOM.toprettyxml(" ", ""), False) @@ -1707,7 +1777,7 @@ write("Using cutlist: %s" % cutlist_s) 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 +2043,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 mythffmpeg""" profileNode = findEncodingProfile(profile) @@ -1998,7 +2068,36 @@ value = quoteCmdArg(destvideofile) if value == "%aspect": value = aspectratio + if value == "720x480" or value == "720x576": + 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": + videoModeHeight = 480 + else: + 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": if name == "-acodec": @@ -2094,10 +2193,6 @@ outaudiosamplerate = 48000 outaudiocodec = "ac3" deinterlace = 0 - croptop = 0 - cropright = 0 - cropbottom = 0 - cropleft = 0 qmin = 5 qmax = 31 qdiff = 31 @@ -2121,14 +2216,6 @@ outvideores = value if name == "-deinterlace": deinterlace = 1 - if name == "-croptop": - croptop = value - if name == "-cropright": - cropright = value - if name == "-cropbottom": - cropbottom = value - if name == "-cropleft": - cropleft = value if name == "-qmin": qmin = value if name == "-qmax": @@ -4409,7 +4496,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) elif file.attributes["type"].value=="file": mediafile=file.attributes["filename"].value else: @@ -4547,7 +4634,7 @@ #do the re-encode encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video, - 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 @@ -4621,7 +4708,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) elif file.attributes["type"].value=="file": mediafile=file.attributes["filename"].value else: @@ -4701,7 +4788,7 @@ #do the re-encode encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video, - audio1, audio2, aspectratio, profile) + folder, audio1, audio2, aspectratio, profile) mediafile = os.path.join(folder, 'newfile2.mpg') #remove an intermediate file