[SCM] morituri/master: * examples/ARcue.py: * morituri/common/crc.py: * morituri/image/image.py: * morituri/test/test_image_image.py: Calculate CDDB disc id. Tested on my Kings Of Leon CD.
js at users.alioth.debian.org
js at users.alioth.debian.org
Sun Oct 19 20:08:46 UTC 2014
The following commit has been merged in the master branch:
commit ac880acdf1e4067972a4a94228222e3ed1af7523
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date: Sun Apr 12 19:30:57 2009 +0000
* examples/ARcue.py:
* morituri/common/crc.py:
* morituri/image/image.py:
* morituri/test/test_image_image.py:
Calculate CDDB disc id.
Tested on my Kings Of Leon CD.
diff --git a/ChangeLog b/ChangeLog
index e71f198..2d1d921 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,15 @@
2009-04-12 Thomas Vander Stichele <thomas at apestaart dot org>
* examples/ARcue.py:
+ * morituri/common/crc.py:
+ * morituri/image/image.py:
+ * morituri/test/test_image_image.py:
+ Calculate CDDB disc id.
+ Tested on my Kings Of Leon CD.
+
+2009-04-12 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * examples/ARcue.py:
* morituri/image/image.py:
* morituri/test/test_image_image.py:
Add a task to verify a disk image, which also calculates
diff --git a/examples/ARcue.py b/examples/ARcue.py
index c4710c8..955a7dc 100644
--- a/examples/ARcue.py
+++ b/examples/ARcue.py
@@ -30,21 +30,18 @@ import gtk
from morituri.image import image
from morituri.common import task, crc
-def gtkmain(taskk):
- progress = task.GtkProgressRunner()
- progress.connect('stop', lambda _: gtk.main_quit())
+def gtkmain(runner, taskk):
+ runner.connect('stop', lambda _: gtk.main_quit())
window = gtk.Window()
window.add(progress)
window.show_all()
- progress.run(taskk)
+ runner.run(taskk)
gtk.main()
-def climain(taskk):
- runner = task.SyncRunner()
-
+def climain(runner, taskk):
runner.run(taskk)
@@ -71,13 +68,20 @@ def main(argv):
cuetask = image.AudioRipCRCTask(cueImage)
if options.runner == 'cli':
- climain(verifytask)
- climain(cuetask)
+ runner = task.SyncRunner()
+ cueImage.setup(runner)
+ print "CDDB disc id", cueImage.cddbDiscId()
+ climain(runner, verifytask)
+ climain(runner, cuetask)
elif options.runner == 'gtk':
- gtkmain(verifytask)
- gtkmain(cuetask)
+ runner = task.GtkProgressRunner()
+ cueImage.setup(runner)
+ print "CDDB disc id", cueImage.cddbDiscId()
+ gtkmain(runner, verifytask)
+ gtkmain(runner, cuetask)
for i, crc in enumerate(cuetask.crcs):
print "Track %2d: %08x" % (i + 1, crc)
+
main(sys.argv)
diff --git a/morituri/common/crc.py b/morituri/common/crc.py
index 4b6c85a..539b6f9 100644
--- a/morituri/common/crc.py
+++ b/morituri/common/crc.py
@@ -32,6 +32,7 @@ from morituri.common import task
FRAMES_PER_DISC_FRAME = 588
SAMPLES_PER_DISC_FRAME = FRAMES_PER_DISC_FRAME * 4
+DISC_FRAMES_PER_SECOND = 75
class CRCTask(task.Task):
# this object needs a main loop to stop
diff --git a/morituri/image/image.py b/morituri/image/image.py
index 1e86154..f2545c9 100644
--- a/morituri/image/image.py
+++ b/morituri/image/image.py
@@ -39,7 +39,8 @@ class Image:
self._path = path
self.cue = cue.Cue(path)
self.cue.parse()
- self._lengths = []
+ self._offsets = [] # 0 .. trackCount - 1
+ self._lengths = [] # 0 .. trackCount - 1
def getRealPath(self, path):
"""
@@ -68,15 +69,52 @@ class Image:
"""
verify = ImageVerifyTask(self)
runner.run(verify)
- self._lengths = verify.lengths
+
+ # calculate offset and length for each track
+
+ # CD's have a standard lead-in time of 2 seconds
+ offset = 2 * crc.DISC_FRAMES_PER_SECOND \
+ + self.cue.tracks[0].getIndex(1)[0]
+
+ for i in range(len(self.cue.tracks)):
+ self._offsets.append(offset)
+ length = self.cue.getTrackLength(self.cue.tracks[i])
+ if length == -1:
+ length = verify.lengths[i + 1]
+ self._lengths.append(length)
+
+ offset += length
+
+ def getTrackOffset(self, track):
+ return self._offsets[self.cue.tracks.index(track)]
def getTrackLength(self, track):
- length = self.cue.getTrackLength(track)
- if length != -1:
- return length
+ return self._lengths[self.cue.tracks.index(track)]
- i = self.cue.tracks.index(track)
- return self._lengths[i + 1]
+ def _cddbSum(self, i):
+ ret = 0
+ while i > 0:
+ ret += (i % 10)
+ i /= 10
+
+ return ret
+
+ def cddbDiscId(self):
+ n = 0
+
+ for track in self.cue.tracks:
+ offset = self.getTrackOffset(track)
+ seconds = offset / crc.DISC_FRAMES_PER_SECOND
+ n += self._cddbSum(seconds)
+
+ last = self.cue.tracks[-1]
+ leadout = self.getTrackOffset(last) + self.getTrackLength(last)
+ frameLength = leadout - self.getTrackOffset(self.cue.tracks[0])
+ t = frameLength / crc.DISC_FRAMES_PER_SECOND
+
+ value = (n % 0xff) << 24 | t << 8 | len(self.cue.tracks)
+
+ return "%08x" % value
class MultiTask(task.Task):
"""
diff --git a/morituri/test/test_image_image.py b/morituri/test/test_image_image.py
index 5c70246..05a378e 100644
--- a/morituri/test/test_image_image.py
+++ b/morituri/test/test_image_image.py
@@ -37,6 +37,9 @@ class TrackSingleTestCase(unittest.TestCase):
self.assertEquals(self.image.getTrackLength(tracks[2]), 2)
self.assertEquals(self.image.getTrackLength(tracks[3]), 4)
+ def testCDDB(self):
+ self.assertEquals(self.image.cddbDiscId(), "08000004")
+
class TracSeparateTestCase(unittest.TestCase):
def setUp(self):
self.image = image.Image(os.path.join(os.path.dirname(__file__),
@@ -61,6 +64,9 @@ class TracSeparateTestCase(unittest.TestCase):
self.assertEquals(self.image.getTrackLength(tracks[2]), 10)
self.assertEquals(self.image.getTrackLength(tracks[3]), 10)
+ def testCDDB(self):
+ self.assertEquals(self.image.cddbDiscId(), "08000004")
+
class AudioLengthTestCase(unittest.TestCase):
def testLength(self):
path = os.path.join(os.path.dirname(__file__), 'track.flac')
--
morituri packaging
More information about the pkg-multimedia-commits
mailing list