* morituri/image/image.py:
Add the 150 frames for the leadin only to the CDDB calculation. Add methods to calculate AccurateRip id's and URL. * morituri/test/test_image_image.py: Add tests for it. * examples/ARcue.py: Show AccurateRip URL.
This commit is contained in:
10
ChangeLog
10
ChangeLog
@@ -1,3 +1,13 @@
|
|||||||
|
2009-04-13 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
|
* morituri/image/image.py:
|
||||||
|
Add the 150 frames for the leadin only to the CDDB calculation.
|
||||||
|
Add methods to calculate AccurateRip id's and URL.
|
||||||
|
* morituri/test/test_image_image.py:
|
||||||
|
Add tests for it.
|
||||||
|
* examples/ARcue.py:
|
||||||
|
Show AccurateRip URL.
|
||||||
|
|
||||||
2009-04-12 Thomas Vander Stichele <thomas at apestaart dot org>
|
2009-04-12 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
* examples/ARcue.py:
|
* examples/ARcue.py:
|
||||||
|
|||||||
@@ -70,13 +70,15 @@ def main(argv):
|
|||||||
if options.runner == 'cli':
|
if options.runner == 'cli':
|
||||||
runner = task.SyncRunner()
|
runner = task.SyncRunner()
|
||||||
cueImage.setup(runner)
|
cueImage.setup(runner)
|
||||||
print "CDDB disc id", cueImage.cddbDiscId()
|
print "CDDB disc id", cueImage.getCDDBDiscId()
|
||||||
|
print "AccurateRip URL", cueImage.getAccurateRipURL()
|
||||||
climain(runner, verifytask)
|
climain(runner, verifytask)
|
||||||
climain(runner, cuetask)
|
climain(runner, cuetask)
|
||||||
elif options.runner == 'gtk':
|
elif options.runner == 'gtk':
|
||||||
runner = task.GtkProgressRunner()
|
runner = task.GtkProgressRunner()
|
||||||
cueImage.setup(runner)
|
cueImage.setup(runner)
|
||||||
print "CDDB disc id", cueImage.cddbDiscId()
|
print "CDDB disc id", cueImage.getCDDBDiscId()
|
||||||
|
print "AccurateRip URL", cueImage.getAccurateRipURL()
|
||||||
gtkmain(runner, verifytask)
|
gtkmain(runner, verifytask)
|
||||||
gtkmain(runner, cuetask)
|
gtkmain(runner, cuetask)
|
||||||
|
|
||||||
|
|||||||
@@ -72,9 +72,9 @@ class Image:
|
|||||||
|
|
||||||
# calculate offset and length for each track
|
# calculate offset and length for each track
|
||||||
|
|
||||||
# CD's have a standard lead-in time of 2 seconds
|
# CD's have a standard lead-in time of 2 seconds;
|
||||||
offset = 2 * crc.DISC_FRAMES_PER_SECOND \
|
# checksums that use it should add it there
|
||||||
+ self.cue.tracks[0].getIndex(1)[0]
|
offset = self.cue.tracks[0].getIndex(1)[0]
|
||||||
|
|
||||||
for i in range(len(self.cue.tracks)):
|
for i in range(len(self.cue.tracks)):
|
||||||
self._offsets.append(offset)
|
self._offsets.append(offset)
|
||||||
@@ -99,11 +99,13 @@ class Image:
|
|||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def cddbDiscId(self):
|
def getCDDBDiscId(self):
|
||||||
n = 0
|
n = 0
|
||||||
|
|
||||||
for track in self.cue.tracks:
|
for track in self.cue.tracks:
|
||||||
offset = self.getTrackOffset(track)
|
# CD's have a standard lead-in time of 2 seconds
|
||||||
|
# which gets added for CDDB disc id's
|
||||||
|
offset = self.getTrackOffset(track) + 2 * crc.DISC_FRAMES_PER_SECOND
|
||||||
seconds = offset / crc.DISC_FRAMES_PER_SECOND
|
seconds = offset / crc.DISC_FRAMES_PER_SECOND
|
||||||
n += self._cddbSum(seconds)
|
n += self._cddbSum(seconds)
|
||||||
|
|
||||||
@@ -116,6 +118,37 @@ class Image:
|
|||||||
|
|
||||||
return "%08x" % value
|
return "%08x" % value
|
||||||
|
|
||||||
|
def getAccurateRipIds(self):
|
||||||
|
"""
|
||||||
|
@rtype: two-tuple of (str, str)
|
||||||
|
"""
|
||||||
|
discId1 = 0
|
||||||
|
discId2 = 0
|
||||||
|
|
||||||
|
for i, track in enumerate(self.cue.tracks):
|
||||||
|
offset = self.getTrackOffset(track)
|
||||||
|
discId1 += offset
|
||||||
|
discId2 += (offset or 1) * (i + 1)
|
||||||
|
|
||||||
|
# also add end offsets
|
||||||
|
last = self.cue.tracks[-1]
|
||||||
|
leadout = self.getTrackOffset(last) + self.getTrackLength(last)
|
||||||
|
discId1 += leadout
|
||||||
|
discId2 += leadout * (len(self.cue.tracks) + 1)
|
||||||
|
|
||||||
|
discId1 &= 0xffffffff
|
||||||
|
discId2 &= 0xffffffff
|
||||||
|
|
||||||
|
return ("%08x" % discId1, "%08x" % discId2)
|
||||||
|
|
||||||
|
def getAccurateRipURL(self):
|
||||||
|
discId1, discId2 = self.getAccurateRipIds()
|
||||||
|
|
||||||
|
return "http://www.accuraterip.com/accuraterip/" \
|
||||||
|
"%s/%s/%s/dBAR-%.3d-%s-%s-%s.bin" % (
|
||||||
|
discId1[-1], discId1[-2], discId1[-3],
|
||||||
|
len(self.cue.tracks), discId1, discId2, self.getCDDBDiscId())
|
||||||
|
|
||||||
class MultiTask(task.Task):
|
class MultiTask(task.Task):
|
||||||
"""
|
"""
|
||||||
I perform multiple tasks.
|
I perform multiple tasks.
|
||||||
|
|||||||
@@ -38,7 +38,11 @@ class TrackSingleTestCase(unittest.TestCase):
|
|||||||
self.assertEquals(self.image.getTrackLength(tracks[3]), 4)
|
self.assertEquals(self.image.getTrackLength(tracks[3]), 4)
|
||||||
|
|
||||||
def testCDDB(self):
|
def testCDDB(self):
|
||||||
self.assertEquals(self.image.cddbDiscId(), "08000004")
|
self.assertEquals(self.image.getCDDBDiscId(), "08000004")
|
||||||
|
|
||||||
|
def testAccurateRip(self):
|
||||||
|
self.assertEquals(self.image.getAccurateRipIds(), (
|
||||||
|
"00000016", "0000005b"))
|
||||||
|
|
||||||
class TracSeparateTestCase(unittest.TestCase):
|
class TracSeparateTestCase(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@@ -65,7 +69,11 @@ class TracSeparateTestCase(unittest.TestCase):
|
|||||||
self.assertEquals(self.image.getTrackLength(tracks[3]), 10)
|
self.assertEquals(self.image.getTrackLength(tracks[3]), 10)
|
||||||
|
|
||||||
def testCDDB(self):
|
def testCDDB(self):
|
||||||
self.assertEquals(self.image.cddbDiscId(), "08000004")
|
self.assertEquals(self.image.getCDDBDiscId(), "08000004")
|
||||||
|
|
||||||
|
def testAccurateRip(self):
|
||||||
|
self.assertEquals(self.image.getAccurateRipIds(), (
|
||||||
|
"00000064", "00000191"))
|
||||||
|
|
||||||
class AudioLengthTestCase(unittest.TestCase):
|
class AudioLengthTestCase(unittest.TestCase):
|
||||||
def testLength(self):
|
def testLength(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user