[SCM] morituri/master: * morituri/image/image.py: Refactor to use TOC class. * morituri/image/toc.py: Fully document.
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 065754d5d108e64a05705ff444ce47e874859264
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date: Wed Apr 15 12:45:22 2009 +0000
* morituri/image/image.py:
Refactor to use TOC class.
* morituri/image/toc.py:
Fully document.
diff --git a/ChangeLog b/ChangeLog
index 24b04ee..e4b3fb7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2009-04-15 Thomas Vander Stichele <thomas at apestaart dot org>
+ * morituri/image/image.py:
+ Refactor to use TOC class.
+ * morituri/image/toc.py:
+ Fully document.
+
+2009-04-15 Thomas Vander Stichele <thomas at apestaart dot org>
+
* morituri/test/test_image_toc.py (added):
* morituri/image/toc.py (added):
Add an abstraction for a TOC.
diff --git a/morituri/image/image.py b/morituri/image/image.py
index c18fac4..ad0b8cb 100644
--- a/morituri/image/image.py
+++ b/morituri/image/image.py
@@ -30,7 +30,7 @@ import struct
import gst
from morituri.common import task, crc
-from morituri.image import cue
+from morituri.image import cue, toc
class Image:
def __init__(self, path):
@@ -87,70 +87,32 @@ class Image:
# checksums that use it should add it there
offset = self.cue.tracks[0].getIndex(1)[0]
+ tracks = []
+
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)
+ tracks.append(toc.Track(i + 1, offset, offset + length - 1))
offset += length
+ self.toc = toc.TOC(tracks)
+
def getTrackOffset(self, track):
return self._offsets[self.cue.tracks.index(track)]
def getTrackLength(self, track):
- return self._lengths[self.cue.tracks.index(track)]
-
- def _cddbSum(self, i):
- ret = 0
- while i > 0:
- ret += (i % 10)
- i /= 10
-
- return ret
+ return self.toc.getTrackLength(self.cue.tracks.index(track) + 1)
def getCDDBDiscId(self):
- n = 0
-
- for track in self.cue.tracks:
- # 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
- 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
+ return self.toc.getCDDBDiscId()
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)
+ return self.toc.getAccurateRipIds()
def getAccurateRipURL(self):
discId1, discId2 = self.getAccurateRipIds()
diff --git a/morituri/image/toc.py b/morituri/image/toc.py
index 14bb78c..329e7b5 100644
--- a/morituri/image/toc.py
+++ b/morituri/image/toc.py
@@ -33,9 +33,22 @@ from morituri.common import task, crc
from morituri.image import cue
class Track:
- number = None # track number, 1-based
- start = None # start of track in CD frames, 0-based
- end = None # end of track in CD frames, 0-based
+ """
+ I represent a track entry in a Table of Contents.
+
+ @ivar number: track number (1-based)
+ @type number: int
+ @ivar start: start of track, in CD frames (0-based)
+ @type start: int
+ @ivar end: end of track, in CD frames (0-based)
+ @type end: int
+ @ivar audio: whether the track is audio
+ @type audio: bool
+ """
+
+ number = None
+ start = None
+ end = None
audio = True
def __init__(self, number, start, end, audio=True):
@@ -45,6 +58,12 @@ class Track:
self.audio = audio
class TOC:
+ """
+ I represent the Table of Contents of a CD.
+
+ @ivar tracks: tracks on this CD
+ @type tracks: list of L{Track}
+ """
tracks = None # list of Track
@@ -55,16 +74,41 @@ class TOC:
self.tracks = tracks
def getTrackStart(self, number):
+ """
+ @param number: the track number, 1-based
+ @type number: int
+
+ @returns: the start of the given track number, in CD frames
+ @rtype: int
+ """
return self.tracks[number - 1].start
def getTrackEnd(self, number):
+ """
+ @param number: the track number, 1-based
+ @type number: int
+
+ @returns: the end of the given track number, in CD frames
+ @rtype: int
+ """
return self.tracks[number - 1].end
def getTrackLength(self, number):
+ """
+ @param number: the track number, 1-based
+ @type number: int
+
+ @returns: the length of the given track number, in CD frames
+ @rtype: int
+ """
track = self.tracks[number - 1]
return track.end - track.start + 1
def getAudioTracks(self):
+ """
+ @returns: the number of audio tracks on the CD
+ @rtype: int
+ """
return len([t for t in self.tracks if t.audio])
def _cddbSum(self, i):
@@ -76,6 +120,12 @@ class TOC:
return ret
def getCDDBDiscId(self):
+ """
+ Calculate the CDDB disc ID.
+
+ @rtype: str
+ @returns: the 8-character hexadecimal disc ID
+ """
# cddb disc id takes into account data tracks
# last byte is the number of tracks on the CD
n = 0
@@ -99,8 +149,13 @@ class TOC:
def getAccurateRipIds(self):
"""
- @rtype: two-tuple of (str, str)
+ Calculate the two AccurateRip ID's.
+
+ @returns: the two 8-character hexadecimal disc ID's
+ @rtype: tuple of (str, str)
"""
+ # AccurateRip does not take into account data tracks,
+ # but does count the data track to determine the leadout offset
discId1 = 0
discId2 = 0
@@ -124,7 +179,12 @@ class TOC:
return ("%08x" % discId1, "%08x" % discId2)
def getAccurateRipURL(self):
- # does not count data tracks
+ """
+ Return the full AccurateRip URL.
+
+ @returns: the AccurateRip URL
+ @rtype: str
+ """
discId1, discId2 = self.getAccurateRipIds()
return "http://www.accuraterip.com/accuraterip/" \
--
morituri packaging
More information about the pkg-multimedia-commits
mailing list