[SCM] morituri/master: * morituri/common/common.py: * morituri/common/program.py: * morituri/image/table.py: * morituri/rip/cd.py: * morituri/test/test_common_common.py: * morituri/test/test_image_toc.py: Handle cases where disc_template and track_template are not in the same directory.

js at users.alioth.debian.org js at users.alioth.debian.org
Sun Oct 19 20:09:44 UTC 2014


The following commit has been merged in the master branch:
commit 9b4e653ae45d15609041efbbd28217cae804eb48
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date:   Thu Nov 22 23:20:44 2012 +0000

    	* morituri/common/common.py:
    	* morituri/common/program.py:
    	* morituri/image/table.py:
    	* morituri/rip/cd.py:
    	* morituri/test/test_common_common.py:
    	* morituri/test/test_image_toc.py:
    	  Handle cases where disc_template and track_template are not in
    	  the same directory.

diff --git a/ChangeLog b/ChangeLog
index d1bba10..6d5dba5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2012-11-23  Thomas Vander Stichele  <thomas at apestaart dot org>
+
+	* morituri/common/common.py:
+	* morituri/common/program.py:
+	* morituri/image/table.py:
+	* morituri/rip/cd.py:
+	* morituri/test/test_common_common.py:
+	* morituri/test/test_image_toc.py:
+	  Handle cases where disc_template and track_template are not in
+	  the same directory.
+
 2012-11-19  Thomas Vander Stichele  <thomas at apestaart dot org>
 
 	* morituri/test/test_common_encode.py:
diff --git a/morituri/common/common.py b/morituri/common/common.py
index bf8dd00..a1fa781 100644
--- a/morituri/common/common.py
+++ b/morituri/common/common.py
@@ -21,10 +21,14 @@
 # along with morituri.  If not, see <http://www.gnu.org/licenses/>.
 
 import os
+import os.path
 import math
 import tempfile
 import shutil
 
+from morituri.extern.log import log
+
+
 SAMPLES_PER_FRAME = 588
 WORDS_PER_FRAME = SAMPLES_PER_FRAME * 2
 BYTES_PER_FRAME = SAMPLES_PER_FRAME * 4
@@ -334,3 +338,28 @@ def getRealPath(refPath, filePath):
                 return cpath
 
     raise KeyError("Cannot find file for %r" % filePath)
+
+def getRelativePath(targetPath, collectionPath):
+    """
+    Get a relative path from the directory of collectionPath to
+    targetPath.
+
+    Used to determine the path to use in .cue/.m3u files
+    """
+    log.debug('common', 'getRelativePath: target %r, collection %r' % (
+        targetPath, collectionPath))
+
+    targetDir = os.path.dirname(targetPath)
+    collectionDir = os.path.dirname(collectionPath)
+    if targetDir == collectionDir:
+        log.debug('common',
+            'getRelativePath: target and collection in same dir')
+        return os.path.basename(targetPath)
+    else:
+        rel = os.path.relpath(
+            targetDir + os.path.sep,
+            collectionDir + os.path.sep)
+        log.debug('common',
+            'getRelativePath: target and collection in different dir, %r' %
+                rel)
+        return os.path.join(rel, os.path.basename(targetPath))
diff --git a/morituri/common/program.py b/morituri/common/program.py
index e0b8a39..b5bf8b3 100644
--- a/morituri/common/program.py
+++ b/morituri/common/program.py
@@ -600,7 +600,7 @@ class Program(log.Loggable):
         self.debug('write .cue file to %s', cuePath)
         handle = open(cuePath, 'w')
         # FIXME: do we always want utf-8 ?
-        handle.write(self.result.table.cue().encode('utf-8'))
+        handle.write(self.result.table.cue(cuePath).encode('utf-8'))
         handle.close()
 
         self.cuePath = cuePath
diff --git a/morituri/image/table.py b/morituri/image/table.py
index 2046ce2..702ef42 100644
--- a/morituri/image/table.py
+++ b/morituri/image/table.py
@@ -503,15 +503,19 @@ class Table(object, log.Loggable):
                 discId1[-1], discId1[-2], discId1[-3],
                 self.getAudioTracks(), discId1, discId2, self.getCDDBDiscId())
 
-    def cue(self, program='Morituri'):
+    def cue(self, cuePath='', program='Morituri'):
         """
+        @param cuePath: path to the cue file to be written. If empty,
+                        will treat paths as if in current directory.
+
+
         Dump our internal representation to a .cue file content.
         """
         lines = []
 
         def writeFile(path):
-            lines.append('FILE "%s" WAVE' % os.path.basename(path))
-
+            targetPath = common.getRelativePath(path, cuePath)
+            lines.append('FILE "%s" WAVE' % targetPath)
 
         # header
         main = ['PERFORMER', 'TITLE']
diff --git a/morituri/rip/cd.py b/morituri/rip/cd.py
index 9db5e1c..abb2732 100644
--- a/morituri/rip/cd.py
+++ b/morituri/rip/cd.py
@@ -58,6 +58,13 @@ filling in the variables and expanding the file extension. Variables are:
  - %A: album artist
  - %S: album sort name
  - %d: disc title
+ - %y: release year
+
+Paths to track files referenced in .cue and .m3u files will be made
+relative to the directory of the disc files.
+
+All files will be created relative to the given output directory.
+Log files will log the path to tracks relative to this directory.
 """
 
     def addOptions(self):
@@ -69,7 +76,9 @@ filling in the variables and expanding the file extension. Variables are:
             default=default)
         self.parser.add_option('-O', '--output-directory',
             action="store", dest="output_directory",
-            help="output directory (defaults to current directory)")
+            help="output directory "
+                "(defaults to absolute path to current directory) "
+        )
         # FIXME: have a cache of these pickles somewhere
         self.parser.add_option('-T', '--toc-pickle',
             action="store", dest="toc_pickle",
@@ -107,13 +116,6 @@ filling in the variables and expanding the file extension. Variables are:
         options.track_template = options.track_template.decode('utf-8')
         options.disc_template = options.disc_template.decode('utf-8')
 
-        slashCountT = len(options.track_template.split(os.path.sep))
-        slashCountD = len(options.disc_template.split(os.path.sep))
-        if slashCountT != slashCountD:
-            raise command.CommandError(
-                "The number of path separators in the templates " \
-                "should be the same.")
-
     def do(self, args):
         prog = program.Program(record=self.getRootCommand().record)
         runner = task.SyncRunner()
@@ -208,14 +210,19 @@ See  http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=1
         # FIXME: turn this into a method
 
         def ripIfNotRipped(number):
+            self.debug('ripIfNotRipped for track %d' % number)
             # we can have a previous result
             trackResult = prog.result.getTrackResult(number)
             if not trackResult:
                 trackResult = result.TrackResult()
                 prog.result.tracks.append(trackResult)
+            else:
+                self.debug('ripIfNotRipped have trackresult, path %r' %
+                    trackResult.filename)
 
             path = prog.getPath(prog.outdir, self.options.track_template,
                 mbdiscid, number) + '.' + profile.extension
+            self.debug('ripIfNotRipped: path %r' % path)
             trackResult.number = number
 
             assert type(path) is unicode, "%r is not unicode" % path
@@ -225,6 +232,12 @@ See  http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=1
 
             # FIXME: optionally allow overriding reripping
             if os.path.exists(path):
+                if path != trackResult.filename:
+                    # the path is different (different name/template ?)
+                    # but we can copy it
+                    self.debug('previous result %r, expected %r' % (
+                        trackResult.filename, path))
+
                 self.stdout.write('Verifying track %d of %d: %s\n' % (
                     number, len(itable.tracks),
                     os.path.basename(path).encode('utf-8')))
@@ -326,9 +339,10 @@ See  http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=1
         handle.write(u'#EXTM3U\n')
 
         def writeFile(handle, path, length):
-            u = u'#EXTINF:%d,%s\n' % (length, os.path.basename(path))
+            targetPath = common.getRelativePath(path, m3uPath)
+            u = u'#EXTINF:%d,%s\n' % (length, targetPath)
             handle.write(u.encode('utf-8'))
-            u = '%s\n' % os.path.basename(path)
+            u = '%s\n' % targetPath
             handle.write(u.encode('utf-8'))
 
 
diff --git a/morituri/test/test_common_common.py b/morituri/test/test_common_common.py
index e68dbbd..398222f 100644
--- a/morituri/test/test_common_common.py
+++ b/morituri/test/test_common_common.py
@@ -25,3 +25,14 @@ class FramesTestCase(tcommon.TestCase):
 class FormatTimeTestCase(tcommon.TestCase):
     def testFormatTime(self):
         self.assertEquals(common.formatTime(7202), '02:00:02.000')
+
+
+class GetRelativePathTestCase(tcommon.TestCase):
+
+    def testRelativeOutputDirectory(self):
+        directory = '.Placebo - Black Market Music (2000)'
+        cue = './' + directory + '/Placebo - Black Market Music (2000)'
+        track = './' + directory + '/01. Placebo - Taste in Men.flac'
+
+        self.assertEquals(common.getRelativePath(track, cue),
+            '01. Placebo - Taste in Men.flac')
diff --git a/morituri/test/test_image_toc.py b/morituri/test/test_image_toc.py
index fb44a48..8616a5b 100644
--- a/morituri/test/test_image_toc.py
+++ b/morituri/test/test_image_toc.py
@@ -14,8 +14,9 @@ from morituri.test import common
 class CureTestCase(common.TestCase):
 
     def setUp(self):
-        self.toc = toc.TocFile(os.path.join(os.path.dirname(__file__),
-            u'cure.toc'))
+        self.path = os.path.join(os.path.dirname(__file__),
+            u'cure.toc')
+        self.toc = toc.TocFile(self.path)
         self.toc.parse()
         self.assertEquals(len(self.toc.table.tracks), 13)
 
@@ -85,7 +86,7 @@ class CureTestCase(common.TestCase):
         self.toc.table.absolutize()
         cue = self.toc.table.cue()
         ref = open(os.path.join(os.path.dirname(__file__), 'cure.cue')).read()
-        self.assertEquals(cue, ref)
+        common.diffStrings(cue, ref)
 
         # we verify it because it has failed in readdisc in the past
         self.assertEquals(self.toc.table.getAccurateRipURL(),
@@ -109,8 +110,9 @@ class CureTestCase(common.TestCase):
 class BlocTestCase(common.TestCase):
 
     def setUp(self):
-        self.toc = toc.TocFile(os.path.join(os.path.dirname(__file__),
-            u'bloc.toc'))
+        self.path = os.path.join(os.path.dirname(__file__),
+            u'bloc.toc')
+        self.toc = toc.TocFile(self.path)
         self.toc.parse()
         self.assertEquals(len(self.toc.table.tracks), 13)
 
@@ -160,8 +162,9 @@ class BlocTestCase(common.TestCase):
 class BreedersTestCase(common.TestCase):
 
     def setUp(self):
-        self.toc = toc.TocFile(os.path.join(os.path.dirname(__file__),
-            u'breeders.toc'))
+        self.path = os.path.join(os.path.dirname(__file__),
+            u'breeders.toc')
+        self.toc = toc.TocFile(self.path)
         self.toc.parse()
         self.assertEquals(len(self.toc.table.tracks), 13)
 
@@ -189,8 +192,9 @@ class BreedersTestCase(common.TestCase):
 class LadyhawkeTestCase(common.TestCase):
 
     def setUp(self):
-        self.toc = toc.TocFile(os.path.join(os.path.dirname(__file__),
-            u'ladyhawke.toc'))
+        self.path = os.path.join(os.path.dirname(__file__),
+            u'ladyhawke.toc')
+        self.toc = toc.TocFile(self.path)
         self.toc.parse()
         self.assertEquals(len(self.toc.table.tracks), 13)
         #import code; code.interact(local=locals())

-- 
morituri packaging



More information about the pkg-multimedia-commits mailing list