From dc9ac1c6e397215d56fffe71ca4823c936db46c9 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Fri, 15 May 2009 20:33:00 +0000 Subject: [PATCH] * morituri/image/table.py: Fix a subtle bug in our CDDB disc id calculation. The length of the audio should be calculated as the delta between leadout and start already converted (and truncated) to seconds. * morituri/test/bloc.cue: * morituri/test/test_image_toc.py: Fix up tests for this. --- ChangeLog | 11 +++++++++++ morituri/image/table.py | 19 ++++++++++++------- morituri/test/bloc.cue | 2 +- morituri/test/test_image_toc.py | 12 ++++++++++++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index cd044f2..e3db5bf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-05-15 Thomas Vander Stichele + + * morituri/image/table.py: + Fix a subtle bug in our CDDB disc id calculation. + The length of the audio should be calculated as the delta + between leadout and start already converted (and truncated) + to seconds. + * morituri/test/bloc.cue: + * morituri/test/test_image_toc.py: + Fix up tests for this. + 2009-05-15 Thomas Vander Stichele * morituri/program/cdparanoia.py: diff --git a/morituri/image/table.py b/morituri/image/table.py index 2847067..f37480e 100644 --- a/morituri/image/table.py +++ b/morituri/image/table.py @@ -202,18 +202,23 @@ class IndexTable(object, log.Loggable): # last byte is the number of tracks on the CD n = 0 + # CD's have a standard lead-in time of 2 seconds + # which gets added for CDDB disc id's + delta = 2 * checksum.FRAMES_PER_SECOND + #if self.getTrackStart(1) > 0: + # delta = 0 + for track in self.tracks: - # CD's have a standard lead-in time of 2 seconds - # which gets added for CDDB disc id's - offset = self.getTrackStart(track.number) + \ - 2 * checksum.FRAMES_PER_SECOND + offset = self.getTrackStart(track.number) + delta seconds = offset / checksum.FRAMES_PER_SECOND n += self._cddbSum(seconds) last = self.tracks[-1] - leadout = self.getTrackEnd(last.number) - frameLength = leadout - self.getTrackStart(1) - t = frameLength / checksum.FRAMES_PER_SECOND + # the 'real' leadout, not offset by 150 frames + leadout = self.getTrackEnd(last.number) + 1 + startSeconds = self.getTrackStart(1) / checksum.FRAMES_PER_SECOND + leadoutSeconds = leadout / checksum.FRAMES_PER_SECOND + t = leadoutSeconds - startSeconds value = (n % 0xff) << 24 | t << 8 | len(self.tracks) diff --git a/morituri/test/bloc.cue b/morituri/test/bloc.cue index 09fcf0a..2176f26 100644 --- a/morituri/test/bloc.cue +++ b/morituri/test/bloc.cue @@ -1,4 +1,4 @@ -REM DISCID AD0BDF0D +REM DISCID AD0BE00D REM COMMENT "Morituri" FILE "data.wav" WAVE TRACK 01 AUDIO diff --git a/morituri/test/test_image_toc.py b/morituri/test/test_image_toc.py index 34d52d6..1bac4b0 100644 --- a/morituri/test/test_image_toc.py +++ b/morituri/test/test_image_toc.py @@ -125,6 +125,18 @@ class BlocTestCase(unittest.TestCase): ref = open(os.path.join(os.path.dirname(__file__), 'bloc.cue')).read() self.assertEquals(cue, ref) + + def testCDDBId(self): + self.toc.table.absolutize() + self.assertEquals(self.toc.table.getCDDBDiscId(), 'ad0be00d') + + def testAccurateRip(self): + # we verify it because it has failed in readdisc in the past + self.toc.table.absolutize() + self.assertEquals(self.toc.table.getAccurateRipURL(), + 'http://www.accuraterip.com/accuraterip/' + 'e/d/2/dBAR-013-001af2de-0105994e-ad0be00d.bin') + # The Breeders - Mountain Battles has CDText class BreedersTestCase(unittest.TestCase): def setUp(self):