[SCM] morituri/master: * morituri/common/program.py: Move getPath to Program. Remove arguments to ripTrack that can be gotten from trackResult. * morituri/rip/cd.py: Continue without musicbrainz metadata. Unify htoa and normal track ripping. * morituri/result/result.py: Add getTrackResult so it's easier to look up track results when there's a HTOA.

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


The following commit has been merged in the master branch:
commit 2d892291a8f82c9515080420bb93440130d3a2fa
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date:   Sun Jun 7 17:10:54 2009 +0000

    	* morituri/common/program.py:
    	  Move getPath to Program.
    	  Remove arguments to ripTrack that can be gotten from
    	  trackResult.
    	* morituri/rip/cd.py:
    	  Continue without musicbrainz metadata.
    	  Unify htoa and normal track ripping.
    	* morituri/result/result.py:
    	  Add getTrackResult so it's easier to look up track results
    	  when there's a HTOA.

diff --git a/ChangeLog b/ChangeLog
index 6e42f82..4c2e5f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,19 @@
 2009-06-07  Thomas Vander Stichele  <thomas at apestaart dot org>
 
 	* morituri/common/program.py:
+	  Move getPath to Program.
+	  Remove arguments to ripTrack that can be gotten from
+	  trackResult.
+	* morituri/rip/cd.py:
+	  Continue without musicbrainz metadata.
+	  Unify htoa and normal track ripping.
+	* morituri/result/result.py:
+	  Add getTrackResult so it's easier to look up track results
+	  when there's a HTOA.
+
+2009-06-07  Thomas Vander Stichele  <thomas at apestaart dot org>
+
+	* morituri/common/program.py:
 	* morituri/rip/cd.py:
 	  Move HTOA checking to program.
 
diff --git a/morituri/common/program.py b/morituri/common/program.py
index 50407cc..966b55a 100644
--- a/morituri/common/program.py
+++ b/morituri/common/program.py
@@ -121,62 +121,17 @@ def musicbrainz(discid):
 
     return ret
 
-def getPath(outdir, template, metadata, mbdiscid, i):
-    """
-    Based on the template, get a complete path for the given track,
-    minus extension.
-    Also works for the disc name, using disc variables for the template.
-
-    @param outdir:   the directory where to write the files
-    @type  outdir:   str
-    @param template: the template for writing the file
-    @type  template: str
-    @param metadata:
-    @type  metadata: L{DiscMetadata}
-    @param i:        track number (0 for HTOA)
-    @type  i:        int
-    """
-    # returns without extension
-
-    v = {}
-
-    v['t'] = '%02d' % i
-
-    # default values
-    v['A'] = 'Unknown Artist'
-    v['d'] = mbdiscid
-
-    v['a'] = v['A']
-    v['n'] = 'Unknown Track %d' % i
-
-    if metadata:
-        v['A'] = filterForPath(metadata.artist)
-        v['d'] = filterForPath(metadata.title)
-        if i > 0:
-            try:
-                v['a'] = filterForPath(metadata.tracks[i - 1].artist)
-                v['n'] = filterForPath(metadata.tracks[i - 1].title)
-            except IndexError, e:
-                print 'ERROR: no track %d found, %r' % (i, e)
-                raise
-        else:
-            # htoa defaults to disc's artist
-            v['a'] = filterForPath(metadata.artist)
-            v['n'] = filterForPath('Hidden Track One Audio')
-
-    import re
-    template = re.sub(r'%(\w)', r'%(\1)s', template)
-
-    return os.path.join(outdir, template % v)
-
-
 class Program(object):
     """
     I maintain program state and functionality.
+
+    @ivar metadata:
+    @type metadata: L{DiscMetadata}
     """
 
     cuePath = None
     logPath = None
+    metadata = None
 
     def __init__(self):
         self.result = result.RipResult()
@@ -218,14 +173,58 @@ class Program(object):
 
         return itable
 
-    def getTagList(self, metadata, i):
+    def getPath(self, outdir, template, mbdiscid, i):
         """
-        Based on the metadata, get a gst.TagList for the given track.
-
-        @param metadata:
-        @type  metadata: L{DiscMetadata}
+        Based on the template, get a complete path for the given track,
+        minus extension.
+        Also works for the disc name, using disc variables for the template.
+
+        @param outdir:   the directory where to write the files
+        @type  outdir:   str
+        @param template: the template for writing the file
+        @type  template: str
         @param i:        track number (0 for HTOA)
         @type  i:        int
+        """
+        # returns without extension
+
+        v = {}
+
+        v['t'] = '%02d' % i
+
+        # default values
+        v['A'] = 'Unknown Artist'
+        v['d'] = mbdiscid
+
+        v['a'] = v['A']
+        v['n'] = 'Unknown Track %d' % i
+
+        if self.metadata:
+            v['A'] = filterForPath(self.metadata.artist)
+            v['d'] = filterForPath(self.metadata.title)
+            if i > 0:
+                try:
+                    v['a'] = filterForPath(self.metadata.tracks[i - 1].artist)
+                    v['n'] = filterForPath(self.metadata.tracks[i - 1].title)
+                except IndexError, e:
+                    print 'ERROR: no track %d found, %r' % (i, e)
+                    raise
+            else:
+                # htoa defaults to disc's artist
+                v['a'] = filterForPath(self.metadata.artist)
+                v['n'] = filterForPath('Hidden Track One Audio')
+
+        import re
+        template = re.sub(r'%(\w)', r'%(\1)s', template)
+
+        return os.path.join(outdir, template % v)
+
+    def getTagList(self, number):
+        """
+        Based on the metadata, get a gst.TagList for the given track.
+
+        @param number:   track number (0 for HTOA)
+        @type  number:   int
 
         @rtype: L{gst.TagList}
         """
@@ -233,15 +232,15 @@ class Program(object):
         disc = u'Unknown Disc'
         title = u'Unknown Track'
 
-        if metadata:
-            artist = metadata.artist
-            disc = metadata.title
-            if i > 0:
+        if self.metadata:
+            artist = self.metadata.artist
+            disc = self.metadata.title
+            if number > 0:
                 try:
-                    artist = metadata.tracks[i - 1].artist
-                    title = metadata.tracks[i - 1].title
+                    artist = self.metadata.tracks[number - 1].artist
+                    title = self.metadata.tracks[number - 1].title
                 except IndexError, e:
-                    print 'ERROR: no track %d found, %r' % (i, e)
+                    print 'ERROR: no track %d found, %r' % (number, e)
                     raise
             else:
                 # htoa defaults to disc's artist
@@ -259,18 +258,18 @@ class Program(object):
         # see gst-python commit 26fa6dd184a8d6d103eaddf5f12bd7e5144413fb
         # FIXME: no way to compare against 'master' version after 0.10.15
         if gst.pygst_version >= (0, 10, 15):
-            ret[gst.TAG_TRACK_NUMBER] = i
-        if metadata:
+            ret[gst.TAG_TRACK_NUMBER] = number
+        if self.metadata:
             # works, but not sure we want this
             # if gst.pygst_version >= (0, 10, 15):
-            #     ret[gst.TAG_TRACK_COUNT] = len(metadata.tracks)
+            #     ret[gst.TAG_TRACK_COUNT] = len(self.metadata.tracks)
             # hack to get a GstDate which we cannot instantiate directly in
             # 0.10.15.1
             # FIXME: The dates are strings and must have the format 'YYYY',
             # 'YYYY-MM' or 'YYYY-MM-DD'.
             # GstDate expects a full date, so default to Jan and 1st if MM and DD
             # are missing
-            date = metadata.release
+            date = self.metadata.release
             if date:
                 log.debug('metadata',
                     'Converting release date %r to structure', date)
@@ -300,21 +299,30 @@ class Program(object):
             return None
 
         start = index.absolute
-        stop = track.getIndex(1).absolute
+        stop = track.getIndex(1).absolute - 1
         return (start, stop)
 
-    def ripTrack(self, runner, trackResult, path, number, offset, device, profile, taglist):
+    def ripTrack(self, runner, trackResult, offset, device, profile, taglist):
         """
         @param number: track number (1-based)
         """
-        t = cdparanoia.ReadVerifyTrackTask(path, self.result.table,
-            self.result.table.getTrackStart(number),
-            self.result.table.getTrackEnd(number),
+        if trackResult.number == 0:
+            start, stop = self.getHTOA()
+        else:
+            start = self.result.table.getTrackStart(trackResult.number)
+            stop = self.result.table.getTrackEnd(trackResult.number)
+
+        dirname = os.path.dirname(trackResult.filename)
+        if not os.path.exists(dirname):
+            os.makedirs(dirname)
+
+        t = cdparanoia.ReadVerifyTrackTask(trackResult.filename,
+            self.result.table, start, stop,
             offset=offset,
             device=device,
             profile=profile,
             taglist=taglist)
-        t.description = 'Reading Track %d' % (number)
+        t.description = 'Reading Track %d' % trackResult.number 
 
         runner.run(t)
 
diff --git a/morituri/result/result.py b/morituri/result/result.py
index b7a1339..f5215bc 100644
--- a/morituri/result/result.py
+++ b/morituri/result/result.py
@@ -65,6 +65,19 @@ class RipResult:
     def __init__(self):
         self.tracks = []
 
+    def getTrackResult(self, number):
+        """
+        @param number: the track number (0 for HTOA)
+
+        @type  number: int
+        @rtype: L{TrackResult}
+        """
+        for t in self.tracks:
+            if t.number == number:
+                return t
+
+        return None
+
 class Logger(object):
     """
     I log the result of a rip.
diff --git a/morituri/rip/cd.py b/morituri/rip/cd.py
index ef592c4..ae28330 100644
--- a/morituri/rip/cd.py
+++ b/morituri/rip/cd.py
@@ -102,9 +102,7 @@ class Rip(logcommand.LogCommand):
             metadatas = program.musicbrainz(mbdiscid)
         except program.MusicBrainzException, e:
             print "Error:", e
-            return
-
-        metadata = None
+            print 'Continuing without metadata'
 
         if metadatas:
             print 'Matching releases:'
@@ -113,7 +111,7 @@ class Rip(logcommand.LogCommand):
                 print 'Title   :', metadata.title
 
             # Select one of the returned releases. We just pick the first one.
-            metadata = metadatas[0]
+            prog.metadata = metadatas[0]
         else:
             print 'Submit this disc to MusicBrainz at:'
             print ittoc.getMusicBrainzSubmitURL()
@@ -138,8 +136,8 @@ class Rip(logcommand.LogCommand):
 
         # result
         prog.result.offset = int(self.options.offset)
-        prog.result.artist = metadata and metadata.artist or 'Unknown Artist'
-        prog.result.title = metadata and metadata.title or 'Unknown Title'
+        prog.result.artist = prog.metadata and prog.metadata.artist or 'Unknown Artist'
+        prog.result.title = prog.metadata and prog.metadata.title or 'Unknown Title'
         # cdio is optional for now
         try:
             import cdio
@@ -149,89 +147,69 @@ class Rip(logcommand.LogCommand):
             prog.result.vendor = 'Unknown'
             prog.result.model = 'Unknown'
 
-
-        # check for hidden track one audio
-        htoa = prog.getHTOA()
-        if htoa:
-            start, stop = htoa
-            print 'Found Hidden Track One Audio from frame %d to %d' % (
-                start, stop)
-                
-            # rip it
-            htoapath = program.getPath(outdir, self.options.track_template,
-                metadata, mbdiscid, 0) + '.' + extension
-            dirname = os.path.dirname(htoapath)
-            if not os.path.exists(dirname):
-                os.makedirs(dirname)
-
-            htoalength = stop - start
-            if not os.path.exists(htoapath):
-                print 'Ripping track %d: %s' % (0, os.path.basename(htoapath))
-                t = cdparanoia.ReadVerifyTrackTask(htoapath, ittoc,
-                    start, stop - 1,
-                    offset=int(self.options.offset),
-                    device=self.parentCommand.options.device,
-                    profile=profile,
-                    taglist=prog.getTagList(metadata, 0))
-                function(runner, t)
-
-                if t.checksum is not None:
-                    print 'Checksums match for track %d' % 0
-                else:
-                    print 'ERROR: checksums did not match for track %d' % 0
-                print 'Peak level: %.2f %%' % (t.peak * 100.0, )
-                if t.peak == 0.0:
-                    print 'HTOA is completely silent'
-                # overlay this rip onto the Table
-            itable.setFile(1, 0, htoapath, htoalength, 0)
-
-
-        for i, track in enumerate(itable.tracks):
-            # FIXME: rip data tracks differently
-            if not track.audio:
-                print 'WARNING: skipping data track %d, not implemented' % (
-                    i + 1, )
-                # FIXME: make it work for now
-                track.indexes[1].relative = 0
-                continue
-
+        def ripIfNotRipped(number):
             trackResult = result.TrackResult()
             prog.result.tracks.append(trackResult)
 
-            path = program.getPath(outdir, self.options.track_template, metadata,
-                mbdiscid, i + 1) + '.' + extension
-            trackResult.number = i + 1
+            path = prog.getPath(outdir, self.options.track_template, 
+                mbdiscid, number) + '.' + extension
+            trackResult.number = number
             trackResult.filename = path
-            trackResult.pregap = itable.tracks[i].getPregap()
-
-            dirname = os.path.dirname(path)
-            if not os.path.exists(dirname):
-                os.makedirs(dirname)
+            if number > 0:
+                trackResult.pregap = itable.tracks[number - 1].getPregap()
 
             # FIXME: optionally allow overriding reripping
             if not os.path.exists(path):
                 print 'Ripping track %d of %d: %s' % (
-                    i + 1, len(itable.tracks), os.path.basename(path))
-                prog.ripTrack(runner, trackResult, path, i + 1, 
+                    number, len(itable.tracks), os.path.basename(path))
+                prog.ripTrack(runner, trackResult, 
                     offset=int(self.options.offset),
                     device=self.parentCommand.options.device,
                     profile=profile,
-                    taglist=prog.getTagList(metadata, i + 1))
+                    taglist=prog.getTagList(number))
 
                 if trackResult.testcrc == trackResult.copycrc:
-                    print 'Checksums match for track %d' % (i + 1)
+                    print 'Checksums match for track %d' % (number)
                 else:
                     print 'ERROR: checksums did not match for track %d' % (
-                        i + 1)
+                        number)
                 print 'Peak level: %.2f %%' % (math.sqrt(trackResult.peak) * 100.0, )
                 print 'Rip quality: %.2f %%' % (trackResult.quality * 100.0, )
 
             # overlay this rip onto the Table
-            itable.setFile(i + 1, 1, path, ittoc.getTrackLength(i + 1), i + 1)
+            if number == 0:
+                # HTOA goes on index 0 of track 1
+                itable.setFile(1, 0, path, ittoc.getTrackStart(1),
+                    number)
+            else:
+                itable.setFile(number, 1, path, ittoc.getTrackLength(number),
+                    number)
+
+
+        # check for hidden track one audio
+        htoa = prog.getHTOA()
+        if htoa:
+            start, stop = htoa
+            print 'Found Hidden Track One Audio from frame %d to %d' % (
+                start, stop)
+                
+            # rip it
+            ripIfNotRipped(0)
+            htoapath = prog.result.tracks[0].filename
+
+        for i, track in enumerate(itable.tracks):
+            # FIXME: rip data tracks differently
+            if not track.audio:
+                print 'WARNING: skipping data track %d, not implemented' % (
+                    i + 1, )
+                # FIXME: make it work for now
+                track.indexes[1].relative = 0
+                continue
 
+            ripIfNotRipped(i + 1)
 
         ### write disc files
-        discName = program.getPath(outdir, self.options.disc_template, metadata,
+        discName = prog.getPath(outdir, self.options.disc_template, 
             mbdiscid, 0)
         dirname = os.path.dirname(discName)
         if not os.path.exists(dirname):
@@ -245,7 +223,7 @@ class Rip(logcommand.LogCommand):
         handle.write('#EXTM3U\n')
         if htoapath:
             handle.write('#EXTINF:%d,%s\n' % (
-                htoalength / common.FRAMES_PER_SECOND,
+                itable.getTrackStart(1) / common.FRAMES_PER_SECOND,
                     os.path.basename(htoapath[:-4])))
             handle.write('%s\n' % os.path.basename(htoapath))
 
@@ -253,7 +231,7 @@ class Rip(logcommand.LogCommand):
             if not track.audio:
                 continue
 
-            path = program.getPath(outdir, self.options.track_template, metadata,
+            path = prog.getPath(outdir, self.options.track_template, 
                 mbdiscid, i + 1) + '.' + extension
             u = u'#EXTINF:%d,%s\n' % (
                 itable.getTrackLength(i + 1) / common.FRAMES_PER_SECOND,
@@ -293,7 +271,7 @@ class Rip(logcommand.LogCommand):
 
         # loop over tracks
         for i, csum in enumerate(cuetask.checksums):
-            trackResult = prog.result.tracks[i]
+            trackResult = prog.result.getTrackResult(i + 1)
             trackResult.accuripCRC = csum
 
             status = 'rip NOT accurate'

-- 
morituri packaging



More information about the pkg-multimedia-commits mailing list