Add a note about das capital disc.
	* morituri/test/release.08397059-86c1-463b-8ed0-cd596dbd174f.xml:
	* morituri/test/release.93a6268c-ddf1-4898-bf93-fb862b1c5c5e.xml:
	  Add musicbrainz ws1 results for Das Capital and Ladyhawke.
	* morituri/test/test_common_program.py:
	  Fix typos.
	  Add tests for Ladyhawke and Das Capital duration and parsing.
	* morituri/test/test_image_table.py:
	  Fix according to new algorithm.
	* morituri/test/test_image_toc.py:
	  Get frame length for both cd's.
	* morituri/image/table.py:
	  Add getFrameLength method.  Fix up duration.
This commit is contained in:
Thomas Vander Stichele
2011-08-14 14:19:50 +00:00
parent 2273db764c
commit 367af25232
8 changed files with 201 additions and 9 deletions

View File

@@ -1,3 +1,20 @@
2011-08-14 Thomas Vander Stichele <thomas at apestaart dot org>
* TODO:
Add a note about das capital disc.
* morituri/test/release.08397059-86c1-463b-8ed0-cd596dbd174f.xml:
* morituri/test/release.93a6268c-ddf1-4898-bf93-fb862b1c5c5e.xml:
Add musicbrainz ws1 results for Das Capital and Ladyhawke.
* morituri/test/test_common_program.py:
Fix typos.
Add tests for Ladyhawke and Das Capital duration and parsing.
* morituri/test/test_image_table.py:
Fix according to new algorithm.
* morituri/test/test_image_toc.py:
Get frame length for both cd's.
* morituri/image/table.py:
Add getFrameLength method. Fix up duration.
2011-08-14 Thomas Vander Stichele <thomas at apestaart dot org>
* morituri/common/program.py:

8
TODO
View File

@@ -35,3 +35,11 @@ TODO:
- use a temp dir, until the whole rip is good don't move it, so we easily find
half done rips
- primal scream, track 5, it rips/checks/rips/checks/encodes/checks and then complains read and verify failed. why did it encode ?
- Musicbrainz disc id error:
Compare http://www.musicbrainz.org/cdtoc/MAj3xXf6QMy7G.BIFOyHyq4MySE-
with http://www.musicbrainz.org/cdtoc/USC1utCZbTLZy80aHvQzJw4FASk-
Almost same, but second is 2 seconds longer on last track, suggesting it
was calculated wrong (150 frame offset done wrong ?) Can't find it in
edit history though
Write an example document with this cd as an example explaining offsets
and id calculations

View File

@@ -297,7 +297,7 @@ class Table(object, log.Loggable):
- CDDB disc id
- number of audio tracks
- offset of index 1 of each track
- length of disc in seconds
- length of disc in seconds (including data track)
@rtype: list of int
"""
@@ -323,14 +323,22 @@ class Table(object, log.Loggable):
seconds = offset / common.FRAMES_PER_SECOND
n += self._cddbSum(seconds)
last = self.tracks[-1]
# the 'real' leadout, not offset by 150 frames
# print 'THOMAS: disc leadout', self.leadout
last = self.tracks[-1]
leadout = self.getTrackEnd(last.number) + 1
self.debug('leadout LBA: %d', leadout)
# FIXME: we can't replace these calculations with the getFrameLength
# call because the start and leadout in the algorithm get rounded
# before making the difference
startSeconds = self.getTrackStart(1) / common.FRAMES_PER_SECOND
leadoutSeconds = leadout / common.FRAMES_PER_SECOND
t = leadoutSeconds - startSeconds
# durationFrames = self.getFrameLength(data=True)
# duration = durationFrames / common.FRAMES_PER_SECOND
# assert t == duration, "%r != %r" % (t, duration)
debug.append(str(leadoutSeconds + 2)) # 2 is the 150 frame cddb offset
result.append(leadoutSeconds)
@@ -427,14 +435,29 @@ class Table(object, log.Loggable):
return urlparse.urlunparse((
'http', host, '/bare/cdlookup.html', '', query, ''))
def getFrameLength(self, data=False):
"""
Get the length in frames (excluding HTOA)
@param data: whether to include the data tracks in the length
"""
# the 'real' leadout, not offset by 150 frames
if data:
last = self.tracks[-1]
else:
last = self.tracks[self.getAudioTracks() - 1]
leadout = self.getTrackEnd(last.number) + 1
self.debug('leadout LBA: %d', leadout)
durationFrames = leadout - self.getTrackStart(1)
return durationFrames
def duration(self):
"""
Get an estimate of the duration in ms.
Get the duration in ms for all audio tracks (excluding HTOA).
"""
values = self._getMusicBrainzValues()
leadout = values[2]
first = values[3]
return ((leadout - first) * 1000) / common.FRAMES_PER_SECOND
return int(self.getFrameLength() * 1000.0 / common.FRAMES_PER_SECOND)
def _getMusicBrainzValues(self):
"""

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- gotten from http://www.musicbrainz.org/ws/1/release/08397059-86c1-463b-8ed0-cd596dbd174f?type=xml&inc=tracks+release-events+artist -->
<metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#" >
<release type="Album Official" id="08397059-86c1-463b-8ed0-cd596dbd174f">
<title>Das Capital: The Songwriting Genius of Luke Haines and The Auteurs</title><text-representation script="Latn" language="ENG" />
<asin>B00009XG2O</asin>
<artist id="08bca401-88d5-4de7-b9c3-560a2e4c1abc">
<name>Luke Haines</name><sort-name>Haines, Luke</sort-name>
</artist>
<track-list>
<track id="38afa7d3-ddc4-4c19-a54b-1de33657417e">
<title>How Could I Be Wrong</title><duration>273800</duration>
</track>
<track id="811fb30e-5d6d-4a03-b2c7-989032039317">
<title>Showgirl</title><duration>256466</duration>
</track>
<track id="40a5b530-c65b-4ca0-9cfa-79f4f9075d38">
<title>Baader Meinhof</title><duration>183933</duration>
</track>
<track id="939ca81e-d633-47ad-a662-08705a4c8ff9">
<title>Lenny Valentino</title><duration>136133</duration>
</track>
<track id="fe713beb-362c-4fac-91a8-f212fd5e59a7">
<title>Starstruck</title><duration>212333</duration>
</track>
<track id="52f15292-2a52-41a7-a46d-fa84321c26a2">
<title>Satan Wants Me</title><duration>189666</duration>
</track>
<track id="9fd3460a-34c3-488c-82b4-9c95c6b8278d">
<title>Unsolved Child Murder</title><duration>146800</duration>
</track>
<track id="ab3aa8d7-309d-45b4-8533-2f779e3952c1">
<title>Junk Shop Clothes</title><duration>166800</duration>
</track>
<track id="12fed492-5e10-4959-af15-ddf5379e5850">
<title>The Mitford Sisters</title><duration>302960</duration>
</track>
<track id="8c773366-373d-432b-b287-8357d77958d5">
<title>Bugger Bognor</title><duration>230573</duration>
</track>
<track id="48c92b0a-3b99-4662-99b9-21649c33f3ef">
<title>Future Generation</title><duration>216266</duration>
</track>
</track-list>
<release-event-list>
<event country="GB" format="CD" date="2003-07-21" barcode="724359051727" catalog-number="CDHUT 81" />
</release-event-list>
</release>
</metadata>

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#" >
<release type="Album Official" id="93a6268c-ddf1-4898-bf93-fb862b1c5c5e">
<title>Ladyhawke</title><text-representation script="Latn" language="ENG" />
<artist id="2e547c75-36c1-49d0-984e-b14498c936f0">
<name>Ladyhawke</name><sort-name>Ladyhawke</sort-name>
</artist>
<track-list>
<track id="ad89d86b-f5c7-47f2-a97a-f2e91a05129a">
<title>Magic</title><duration>207000</duration>
</track>
<track id="05b6718a-eab1-424a-a403-54ff1ef2300f">
<title>Manipulating Woman</title><duration>215000</duration>
</track>
<track id="fc7c9e1e-c68f-41c7-a545-9bcd6b798e1e">
<title>My Delirium</title><duration>255000</duration>
</track>
<track id="2c64b152-63ad-4c91-af62-14a1633ae346">
<title>Better Than Sunday</title><duration>208000</duration>
</track>
<track id="2d85d4e3-8dc4-40e7-b8c7-b44c92d71c47">
<title>Another Runaway</title><duration>196000</duration>
</track>
<track id="a0f8fba5-7c49-43c8-8e52-1834aaa09604">
<title>Love Don't Live Here</title><duration>242000</duration>
</track>
<track id="7cf5b2b6-b39d-4357-8fba-210189f656c2">
<title>Back of the Van</title><duration>220000</duration>
</track>
<track id="0830bd0d-5ffe-40e4-93b3-c125eeff36a0">
<title>Paris Is Burning</title><duration>229000</duration>
</track>
<track id="b7b99255-f4ed-4602-96d0-0de712f37cc7">
<title>Professional Suicide</title><duration>223000</duration>
</track>
<track id="3b5d71ca-bd52-4204-bd82-7ae098f96e58">
<title>Dusk Till Dawn</title><duration>156000</duration>
</track>
<track id="1a2ab650-7084-4b2b-85bd-6d6a91593084">
<title>Crazy World</title><duration>215000</duration>
</track>
<track id="070a3ce4-5cdb-4a99-8b1c-675c02eaf236">
<title>Morning Dreams</title><duration>240000</duration>
</track>
</track-list>
<release-event-list>
<event country="AU" format="CD" date="2008-09-20" barcode="00602517801974" catalog-number="MODCD093" />
</release-event-list>
</release>
</metadata>

View File

@@ -121,6 +121,35 @@ class MetadataLengthTestCase(unittest.TestCase):
reader = wsxml.MbXmlParser()
wsMetadata = reader.parse(handle)
release = wsMetadata.getRelease()
metadata = progam.getMetadata(release)
metadata = program.getMetadata(release)
self.assertEquals(metadata.duration, 2962889)
def testLadyhawke(self):
from musicbrainz2 import wsxml
path = os.path.join(os.path.dirname(__file__),
'release.93a6268c-ddf1-4898-bf93-fb862b1c5c5e.xml')
handle = open(path, "rb")
reader = wsxml.MbXmlParser()
wsMetadata = reader.parse(handle)
release = wsMetadata.getRelease()
metadata = program.getMetadata(release)
# self.assertEquals(metadata.duration, 2609413)
def testDasCapital(self):
from musicbrainz2 import wsxml
path = os.path.join(os.path.dirname(__file__),
'release.08397059-86c1-463b-8ed0-cd596dbd174f.xml')
handle = open(path, "rb")
reader = wsxml.MbXmlParser()
wsMetadata = reader.parse(handle)
release = wsMetadata.getRelease()
metadata = program.getMetadata(release)
# FIXME: 2 seconds longer than the duration according to table
self.assertEquals(metadata.duration, 2315730)

View File

@@ -53,7 +53,7 @@ class LadyhawkeTestCase(tcommon.TestCase):
"http://www.accuraterip.com/accuraterip/a/5/d/dBAR-012-0013bd5a-00b8d489-c60af50d.bin")
def testDuration(self):
self.assertEquals(self.table.duration(), 2609413)
self.assertEquals(self.table.duration(), 2761413)
class MusicBrainzTestCase(tcommon.TestCase):
# example taken from http://musicbrainz.org/doc/DiscIDCalculation

View File

@@ -180,6 +180,15 @@ class LadyhawkeTestCase(common.TestCase):
# c60af50d 13 150 15687 31841 51016 66616 81352 99559 116070 133243
# 149997 161710 177832 207256 2807
def testMusicBrainz(self):
# URL to submit: http://mm.musicbrainz.org/bare/cdlookup.html?toc=1+11+197850+24320+44855+64090+77885+88095+104020+118245+129255+141765+164487+181780&tracks=11&id=MAj3xXf6QMy7G.BIFOyHyq4MySE-
self.assertEquals(self.toc.table.getMusicBrainzDiscId(),
"KnpGsLhvH.lPrNc1PBL21lb9Bg4-")
# FIXME: I don't trust this toc, but I can't find the CD anymore
def testDuration(self):
self.assertEquals(self.toc.table.duration(), 2761413)
class CapitalMergeTestCase(common.TestCase):
def setUp(self):
self.toc1 = toc.TocFile(os.path.join(os.path.dirname(__file__),
@@ -209,6 +218,13 @@ class CapitalMergeTestCase(common.TestCase):
self.assertEquals(self.table.getMusicBrainzDiscId(),
"MAj3xXf6QMy7G.BIFOyHyq4MySE-")
def testDuration(self):
# this matches track 11 end sector - track 1 start sector on musicbrainz
# compare to 3rd and 4th value in URL above
self.assertEquals(self.table.getFrameLength(), 173530)
self.assertEquals(self.table.duration(), 2313733)
class UnicodeTestCase(common.TestCase, common.UnicodeTestMixin):
def setUp(self):
# we copy the normal non-utf8 filename to a utf-8 filename