--- 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 @@ #****************************************************************************** # version of script - change after each update -VERSION="0.1.20101206-1" +VERSION="0.1.20110821-1" # keep all temporary files for debugging purposes # set this to True before a first run through when testing @@ -75,6 +75,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 @@ # 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')) @@ -642,14 +643,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) @@ -1762,6 +1763,37 @@ ############################################################# +# Finds the path of a video file from the local video path +# or 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 + + db.close() + del db + del cursor + + +############################################################# # 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": mediafile = file.attributes["filename"].value - 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": mediafile = file.attributes["filename"].value else: fatalError("Unknown type of video file it must be 'recording', 'video' or 'file'.") @@ -1935,9 +1967,39 @@ 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) + + #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 = path_ffmpeg[0] + " -i " + quoteFilename(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("streaminfo.xml :-\n" + infoDOM.toprettyxml(" ", ""), False) ############################################################# @@ -2322,7 +2384,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""" profileNode = findEncodingProfile(profile) @@ -2347,6 +2409,18 @@ value = quoteFilename(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) + if float(videoAR) >= 1.9: + if videomode == "ntsc": + videoheight = 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) # 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 @@ outaudiosamplerate = 48000 outaudiocodec = "ac3" deinterlace = 0 - croptop = 0 - cropright = 0 - cropbottom = 0 - cropleft = 0 qmin = 5 qmax = 31 qdiff = 31 @@ -2470,14 +2540,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": @@ -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 @@ 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: @@ -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 #do the re-encode - 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) mediafile = os.path.join(folder, 'newfile2.mpg') #remove the old mediafile that was run through mythtranscode @@ -4936,7 +4995,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: @@ -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 #do the re-encode - 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) mediafile = os.path.join(folder, 'newfile2.mpg') #remove an intermediate file