[SCM] morituri/master: * morituri/test/test_common_program.py (added): * morituri/common/program.py: Break verifyImage into two so we can test it. Test it using an AccurateRip result for Luke Haines Is Dead which had a wrongly ripped track 10.

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


The following commit has been merged in the master branch:
commit 0d3651ab128eab918ff51c7c73b958f3d3251fa6
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date:   Wed Jun 24 18:40:27 2009 +0000

    	* morituri/test/test_common_program.py (added):
    	* morituri/common/program.py:
    	  Break verifyImage into two so we can test it.
    	  Test it using an AccurateRip result for Luke Haines Is Dead
    	  which had a wrongly ripped track 10.

diff --git a/ChangeLog b/ChangeLog
index bb35b33..a7d5770 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2009-06-24  Thomas Vander Stichele  <thomas at apestaart dot org>
 
+	* morituri/test/test_common_program.py (added):
+	* morituri/common/program.py:
+	  Break verifyImage into two so we can test it.
+	  Test it using an AccurateRip result for Luke Haines Is Dead
+	  which had a wrongly ripped track 10.
+
+
+2009-06-24  Thomas Vander Stichele  <thomas at apestaart dot org>
+
 	* morituri/result/result.py:
 	  Document some more.
 
diff --git a/morituri/common/program.py b/morituri/common/program.py
index c2df9f3..057d6c3 100644
--- a/morituri/common/program.py
+++ b/morituri/common/program.py
@@ -347,7 +347,10 @@ class Program(log.Loggable):
 
     def ripTrack(self, runner, trackResult, offset, device, profile, taglist):
         """
-        @param number: track number (1-based)
+        @param trackResult: the object to store information in.
+        @type  trackResult: L{result.TrackResult}
+        @param number:      track number (1-based)
+        @type  number:      int
         """
         if trackResult.number == 0:
             start, stop = self.getHTOA()
@@ -375,6 +378,15 @@ class Program(log.Loggable):
         trackResult.quality = t.quality
 
     def verifyImage(self, runner, responses):
+        """
+        Verify our image against the given AccurateRip responses.
+
+        Needs an initialized self.result.
+        Will set accurip and friends on each TrackResult.
+        """
+
+        self.debug('verifying Image against %d AccurateRip responses',
+            len(responses))
 
         cueImage = image.Image(self.cuePath)
         verifytask = image.ImageVerifyTask(cueImage)
@@ -382,17 +394,29 @@ class Program(log.Loggable):
         runner.run(verifytask)
         runner.run(cuetask)
 
-        response = None # track which response matches, for all tracks
+        self._verifyImageWithChecksums(responses, cuetask.checksums)
 
-        # loop over tracks
-        for i, csum in enumerate(cuetask.checksums):
+    def _verifyImageWithChecksums(self, responses, checksums):
+        # loop over tracks to set our calculated AccurateRip CRC's
+        for i, csum in enumerate(checksums):
             trackResult = self.result.getTrackResult(i + 1)
             trackResult.ARCRC = csum
 
+
+        if not responses:
+            self.warning('No AccurateRip responses, cannot verify.')
+            return
+
+        response = None # track which response matches, for all tracks
+
+        # now loop to match responses
+        for i, csum in enumerate(checksums):
+            trackResult = self.result.getTrackResult(i + 1)
+
             confidence = None
 
-            # match against each response's checksum
-            for j, r in enumerate(responses or []):
+            # match against each response's checksum for this track
+            for j, r in enumerate(responses):
                 if "%08x" % csum == r.checksums[i]:
                     if not response:
                         response = r
@@ -401,6 +425,8 @@ class Program(log.Loggable):
                             "checksum %s for %d matches wrong response %d, "\
                             "checksum %s" % (
                                 csum, i + 1, j + 1, response.checksums[i])
+                    self.debug("Track: %02d matched in AccurateRip database",
+                        i + 1)
                     trackResult.accurip = True
                     # FIXME: maybe checksums should be ints
                     trackResult.ARDBCRC = int(response.checksums[i], 16)
@@ -408,20 +434,29 @@ class Program(log.Loggable):
                     confidence = response.confidences[i]
                     trackResult.ARDBConfidence = confidence
 
-            if responses:
-                maxConfidence = 0
-                maxResponse = None
-                for r in responses:
-                    if r.confidences[i] > maxConfidence:
-                        maxConfidence = r.confidences[i]
-                        maxResponse = r
-
-                self.debug('found max confidence %d' % maxConfidence)
-                trackResult.ARDBMaxConfidence = maxConfidence
-                if not response:
-                    self.warning('none of the responses matched.')
-                    trackResult.ARDBCRC = int(
-                        maxResponse.checksums[i], 16)
+            if not trackResult.accurip:
+                self.warning("Track %02d: not matched in AccurateRip database",
+                    i + 1)
+
+            # I have seen AccurateRip responses with 0 as confidence
+            # for example, Best of Luke Haines, disc 1, track 1
+            maxConfidence = -1
+            maxResponse = None
+            for r in responses:
+                if r.confidences[i] > maxConfidence:
+                    maxConfidence = r.confidences[i]
+                    maxResponse = r
+
+            self.debug('Track %02d: found max confidence %d' % (
+                i + 1, maxConfidence))
+            trackResult.ARDBMaxConfidence = maxConfidence
+            if not response:
+                self.warning('iTrack %02d: none of the responses matched.',
+                    i + 1)
+                trackResult.ARDBCRC = int(
+                    maxResponse.checksums[i], 16)
+            else:
+                trackResult.ARDBCRC = int(response.checksums[i], 16)
 
     def writeCue(self, discName):
         self.debug('write .cue file')
diff --git a/morituri/test/test_common_program.py b/morituri/test/test_common_program.py
new file mode 100644
index 0000000..45f38f8
--- /dev/null
+++ b/morituri/test/test_common_program.py
@@ -0,0 +1,53 @@
+# -*- Mode: Python; test-case-name: morituri.test.test_common_program -*-
+# vi:si:et:sw=4:sts=4:ts=4
+
+import os
+import unittest
+
+from morituri.result import result
+from morituri.common import program, accurip
+
+class TrackImageVerifyTestCase(unittest.TestCase):
+    # example taken from a rip of Luke Haines Is Dead, disc 1
+    # AccurateRip database has 0 confidence for 1st track
+    # Rip had a wrong result for track 9
+
+    def testVerify(self):
+        path = os.path.join(os.path.dirname(__file__),
+            'dBAR-020-002e5023-029d8e49-040eaa14.bin')
+        data = open(path, "rb").read()
+        responses = accurip.getAccurateRipResponses(data)
+
+        # these crc's were calculated from an actual rip
+        checksums = [1644890007, 2945205445, 3983436658, 1528082495,
+        1203704270, 1163423644, 3649097244, 100524219, 1583356174, 373652058,
+        1842579359, 2850056507, 1329730252, 2526965856, 2525886806, 209743350,
+        3184062337, 2099956663, 2943874164, 2321637196]
+
+        prog = program.Program()
+        prog.result = result.RipResult()
+        # fill it with empty trackresults
+        for i, c in enumerate(checksums):
+            r = result.TrackResult()
+            r.number = i + 1
+            prog.result.tracks.append(r)
+
+        prog._verifyImageWithChecksums(responses, checksums)
+
+        # now check if the results were filled in properly
+        tr = prog.result.getTrackResult(1)
+        self.assertEquals(tr.accurip, False)
+        self.assertEquals(tr.ARDBMaxConfidence, 0)
+        self.assertEquals(tr.ARDBCRC, 0)
+        self.assertEquals(tr.ARDBCRC, 0)
+
+        tr = prog.result.getTrackResult(2)
+        self.assertEquals(tr.accurip, True)
+        self.assertEquals(tr.ARDBMaxConfidence, 2)
+        self.assertEquals(tr.ARDBCRC, checksums[2 - 1])
+
+        tr = prog.result.getTrackResult(10)
+        self.assertEquals(tr.accurip, False)
+        self.assertEquals(tr.ARDBMaxConfidence, 2)
+        # we know track 10 was ripped wrong
+        self.assertNotEquals(tr.ARDBCRC, checksums[10 - 1])

-- 
morituri packaging



More information about the pkg-multimedia-commits mailing list