From 46863074aa6aabe30d9d2247d27433ddf4b067e1 Mon Sep 17 00:00:00 2001
From: Britney Fransen <brfransen@gmail.com>
Date: Sun, 16 Dec 2012 17:00:42 -0600
Subject: cherry picked from r7-testing. mythburn .25 patch for aspect ratio
 and video storage groups

---
 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 8c43af3..ae9dd49 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=12
+pkgrel=13
 
 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
 }
 
@@ -132,4 +132,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

