Merge pull request #187 from RecursiveForest/rewrite-accuraterip
AccurateRip V2 support
This commit is contained in:
BIN
whipper/test/dBAR-002-0000f21c-00027ef8-05021002.bin
Normal file
BIN
whipper/test/dBAR-002-0000f21c-00027ef8-05021002.bin
Normal file
Binary file not shown.
@@ -1,31 +1,316 @@
|
||||
# -*- Mode: Python; test-case-name: whipper.test.test_common_accurip -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
|
||||
import os
|
||||
import sys
|
||||
from StringIO import StringIO
|
||||
from os import chmod, makedirs
|
||||
from os.path import dirname, exists, join
|
||||
from shutil import copy, rmtree
|
||||
from tempfile import mkdtemp
|
||||
from unittest import TestCase
|
||||
|
||||
from whipper.common import accurip
|
||||
|
||||
from whipper.test import common as tcommon
|
||||
from whipper.common.accurip import (
|
||||
calculate_checksums, get_db_entry, print_report, verify_result,
|
||||
_split_responses, EntryNotFound
|
||||
)
|
||||
from whipper.result.result import RipResult, TrackResult
|
||||
|
||||
|
||||
class AccurateRipResponseTestCase(tcommon.TestCase):
|
||||
class TestAccurateRipResponse(TestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.path = 'c/1/2/dBAR-002-0000f21c-00027ef8-05021002.bin'
|
||||
cls.entry = _split_responses(
|
||||
open(join(dirname(__file__), cls.path[6:])).read()
|
||||
)
|
||||
cls.other_path = '4/8/2/dBAR-011-0010e284-009228a3-9809ff0b.bin'
|
||||
|
||||
def testResponse(self):
|
||||
path = os.path.join(os.path.dirname(__file__),
|
||||
'dBAR-011-0010e284-009228a3-9809ff0b.bin')
|
||||
data = open(path, "rb").read()
|
||||
def setUp(self):
|
||||
self.cache_dir = mkdtemp(suffix='whipper_accurip_cache_test')
|
||||
accurip._CACHE_DIR = self.cache_dir
|
||||
|
||||
responses = accurip.getAccurateRipResponses(data)
|
||||
self.assertEquals(len(responses), 3)
|
||||
def cleanup(cachedir):
|
||||
chmod(cachedir, 0755)
|
||||
rmtree(cachedir)
|
||||
self.addCleanup(cleanup, self.cache_dir)
|
||||
|
||||
response = responses[0]
|
||||
def test_uses_cache_dir(self):
|
||||
# copy normal entry into other entry's place
|
||||
makedirs(dirname(join(self.cache_dir, self.other_path)))
|
||||
copy(
|
||||
join(dirname(__file__), self.path[6:]),
|
||||
join(self.cache_dir, self.other_path)
|
||||
)
|
||||
# ask cache for other entry and assert cached entry equals normal entry
|
||||
self.assertEquals(self.entry, get_db_entry(self.other_path))
|
||||
|
||||
self.assertEquals(response.trackCount, 11)
|
||||
self.assertEquals(response.discId1, "0010e284")
|
||||
self.assertEquals(response.discId2, "009228a3")
|
||||
self.assertEquals(response.cddbDiscId, "9809ff0b")
|
||||
def test_raises_entrynotfound_for_no_entry(self):
|
||||
with self.assertRaises(EntryNotFound):
|
||||
get_db_entry('definitely_a_404')
|
||||
|
||||
for i in range(11):
|
||||
self.assertEquals(response.confidences[i], 35)
|
||||
self.assertEquals(response.checksums[0], "beea32c8")
|
||||
self.assertEquals(response.checksums[10], "acee98ca")
|
||||
def test_can_return_entry_without_saving(self):
|
||||
chmod(self.cache_dir, 0)
|
||||
self.assertEqual(get_db_entry(self.path), self.entry)
|
||||
chmod(self.cache_dir, 0755)
|
||||
self.assertFalse(exists(join(self.cache_dir, self.path)))
|
||||
|
||||
def test_retrieves_and_saves_accuraterip_entry(self):
|
||||
# for path, entry in zip(self.paths[0], self.entries):
|
||||
self.assertFalse(exists(join(self.cache_dir, self.path)))
|
||||
self.assertEquals(get_db_entry(self.path), self.entry)
|
||||
self.assertTrue(exists(join(self.cache_dir, self.path)))
|
||||
|
||||
def test_AccurateRipResponse_parses_correctly(self):
|
||||
responses = get_db_entry(self.path)
|
||||
self.assertEquals(len(responses), 2)
|
||||
|
||||
self.assertEquals(responses[0].num_tracks, 2)
|
||||
self.assertEquals(responses[0].discId1, '0000f21c')
|
||||
self.assertEquals(responses[0].discId2, '00027ef8')
|
||||
self.assertEquals(responses[0].cddbDiscId, '05021002')
|
||||
self.assertEquals(responses[0].confidences[0], 12)
|
||||
self.assertEquals(responses[0].confidences[1], 20)
|
||||
self.assertEquals(responses[0].checksums[0], '284fc705')
|
||||
self.assertEquals(responses[0].checksums[1], '9cc1f32e')
|
||||
|
||||
self.assertEquals(responses[1].num_tracks, 2)
|
||||
self.assertEquals(responses[1].discId1, '0000f21c')
|
||||
self.assertEquals(responses[1].discId2, '00027ef8')
|
||||
self.assertEquals(responses[1].cddbDiscId, '05021002')
|
||||
self.assertEquals(responses[1].confidences[0], 4)
|
||||
self.assertEquals(responses[1].confidences[1], 4)
|
||||
self.assertEquals(responses[1].checksums[0], 'dc77f9ab')
|
||||
self.assertEquals(responses[1].checksums[1], 'dd97d2c3')
|
||||
|
||||
# XXX: test arc.py
|
||||
|
||||
|
||||
class TestCalculateChecksums(TestCase):
|
||||
def test_returns_none_for_bad_files(self):
|
||||
self.assertEquals(
|
||||
calculate_checksums(['/does/not/exist']),
|
||||
{'v1': [None], 'v2': [None]}
|
||||
)
|
||||
|
||||
# TODO: test success when file exists
|
||||
|
||||
|
||||
class TestVerifyResult(TestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
path = 'c/1/2/dBAR-002-0000f21c-00027ef8-05021002.bin'
|
||||
cls.responses = _split_responses(
|
||||
open(join(dirname(__file__), path[6:])).read()
|
||||
)
|
||||
cls.checksums = {
|
||||
'v1': ['284fc705', '9cc1f32e'],
|
||||
'v2': ['dc77f9ab', 'dd97d2c3'],
|
||||
}
|
||||
|
||||
def setUp(self):
|
||||
self.result = RipResult()
|
||||
for n in range(1, 2+1):
|
||||
track = TrackResult()
|
||||
track.number = n
|
||||
self.result.tracks.append(track)
|
||||
|
||||
def test_empty_result_returns_false(self):
|
||||
self.assertEquals(
|
||||
verify_result(RipResult(), self.responses, self.checksums),
|
||||
False
|
||||
)
|
||||
|
||||
def test_empty_responses_returns_false(self):
|
||||
self.assertEquals(
|
||||
verify_result(self.result, [], self.checksums),
|
||||
False
|
||||
)
|
||||
|
||||
# XXX: would this happen?
|
||||
def test_empty_checksums_returns_false(self):
|
||||
self.assertEquals(
|
||||
verify_result(self.result, self.responses, {}),
|
||||
False
|
||||
)
|
||||
|
||||
def test_wrong_checksums_returns_false(self):
|
||||
self.assertEquals(
|
||||
verify_result(self.result, self.responses, {
|
||||
'v1': ['deadbeef', '89abcdef'],
|
||||
'v2': ['76543210', '01234567']
|
||||
}),
|
||||
False
|
||||
)
|
||||
|
||||
def test_incomplete_checksums(self):
|
||||
self.assertEquals(
|
||||
verify_result(self.result, self.responses, {
|
||||
'v1': ['284fc705', '9cc1f32e'],
|
||||
'v2': [None, 'dd97d2c3'],
|
||||
}),
|
||||
True
|
||||
)
|
||||
self.assertEquals(
|
||||
verify_result(self.result, self.responses, {
|
||||
'v1': ['284fc705', None],
|
||||
'v2': ['dc77f9ab', 'dd97d2c3'],
|
||||
}),
|
||||
True
|
||||
)
|
||||
self.assertEquals(
|
||||
verify_result(self.result, self.responses, {
|
||||
'v1': ['284fc705', None],
|
||||
'v2': [None, 'dd97d2c3'],
|
||||
}),
|
||||
True
|
||||
)
|
||||
|
||||
def test_matches_only_v1_or_v2_responses(self):
|
||||
self.assertEquals(
|
||||
verify_result(
|
||||
self.result, [self.responses[0]], self.checksums
|
||||
),
|
||||
True
|
||||
)
|
||||
self.assertEquals(
|
||||
verify_result(
|
||||
self.result, [self.responses[1]], self.checksums
|
||||
),
|
||||
True
|
||||
)
|
||||
|
||||
def test_passes_with_htoa(self):
|
||||
htoa = TrackResult()
|
||||
htoa.number = 0
|
||||
self.result.tracks.append(htoa)
|
||||
self.assertEquals(
|
||||
verify_result(self.result, self.responses, self.checksums),
|
||||
True
|
||||
)
|
||||
|
||||
def test_stores_accuraterip_results_on_result(self):
|
||||
self.assertEquals(
|
||||
verify_result(self.result, self.responses, self.checksums),
|
||||
True
|
||||
)
|
||||
self.assertEquals(self.result.tracks[0].AR, {
|
||||
'v1': {
|
||||
'CRC': '284fc705',
|
||||
'DBCRC': '284fc705',
|
||||
'DBConfidence': 12,
|
||||
},
|
||||
'v2': {
|
||||
'CRC': 'dc77f9ab',
|
||||
'DBCRC': 'dc77f9ab',
|
||||
'DBConfidence': 4,
|
||||
},
|
||||
'DBMaxConfidence': 12,
|
||||
'DBMaxConfidenceCRC': '284fc705',
|
||||
})
|
||||
self.assertEquals(self.result.tracks[1].AR, {
|
||||
'v1': {
|
||||
'CRC': '9cc1f32e',
|
||||
'DBCRC': '9cc1f32e',
|
||||
'DBConfidence': 20,
|
||||
},
|
||||
'v2': {
|
||||
'CRC': 'dd97d2c3',
|
||||
'DBCRC': 'dd97d2c3',
|
||||
'DBConfidence': 4,
|
||||
},
|
||||
'DBMaxConfidence': 20,
|
||||
'DBMaxConfidenceCRC': '9cc1f32e',
|
||||
})
|
||||
|
||||
|
||||
class TestAccurateRipReport(TestCase):
|
||||
def setUp(self):
|
||||
sys.stdout = StringIO()
|
||||
self.result = RipResult()
|
||||
track = TrackResult()
|
||||
track.number = 1
|
||||
track.AR = {
|
||||
'v1': {
|
||||
'CRC': '284fc705',
|
||||
'DBCRC': '284fc705',
|
||||
'DBConfidence': 12,
|
||||
},
|
||||
'v2': {
|
||||
'CRC': 'dc77f9ab',
|
||||
'DBCRC': 'dc77f9ab',
|
||||
'DBConfidence': 4,
|
||||
},
|
||||
'DBMaxConfidence': 12,
|
||||
'DBMaxConfidenceCRC': '284fc705',
|
||||
}
|
||||
self.result.tracks.append(track)
|
||||
|
||||
def tearDown(self):
|
||||
sys.stdout = sys.__stdout__
|
||||
|
||||
def test_report_no_result(self):
|
||||
track = TrackResult()
|
||||
track.number = 1
|
||||
self.result.tracks[0] = track
|
||||
print_report(self.result)
|
||||
self.assertEquals(
|
||||
sys.stdout.getvalue(),
|
||||
'track 1: unknown (error)\n'
|
||||
)
|
||||
|
||||
def test_track_not_found(self):
|
||||
self.result.tracks[0].AR['DBMaxConfidence'] = None
|
||||
print_report(self.result)
|
||||
self.assertEquals(
|
||||
sys.stdout.getvalue(),
|
||||
'track 1: rip NOT accurate (not found) '
|
||||
' v1 [284fc705], v2 [dc77f9ab], DB [notfound]\n'
|
||||
)
|
||||
|
||||
def test_htoa_not_tracked(self):
|
||||
self.result.tracks[0].number = 0
|
||||
self.result.tracks[0].AR['v1']['CRC'] = None
|
||||
self.result.tracks[0].AR['v2']['CRC'] = None
|
||||
print_report(self.result)
|
||||
self.assertEquals(
|
||||
sys.stdout.getvalue(),
|
||||
'track 0: unknown (not tracked)\n'
|
||||
)
|
||||
|
||||
def test_report_v1_only(self):
|
||||
self.result.tracks[0].AR['v2']['DBCRC'] = None
|
||||
self.result.tracks[0].AR['v2']['DBConfidence'] = None
|
||||
print_report(self.result)
|
||||
self.assertEquals(
|
||||
sys.stdout.getvalue(),
|
||||
'track 1: rip accurate (max confidence 12)'
|
||||
' v1 [284fc705], v2 [dc77f9ab], DB [284fc705]\n'
|
||||
)
|
||||
|
||||
def test_report_v2_only(self):
|
||||
self.result.tracks[0].AR['v1']['DBCRC'] = None
|
||||
self.result.tracks[0].AR['v1']['DBConfidence'] = None
|
||||
print_report(self.result)
|
||||
self.assertEquals(
|
||||
sys.stdout.getvalue(),
|
||||
'track 1: rip accurate (confidence 4 of 12)'
|
||||
' v1 [284fc705], v2 [dc77f9ab], DB [dc77f9ab]\n'
|
||||
)
|
||||
|
||||
def test_report_v1_and_v2_max_confidence(self):
|
||||
print_report(self.result)
|
||||
self.assertEquals(
|
||||
sys.stdout.getvalue(),
|
||||
'track 1: rip accurate (max confidence 12)'
|
||||
' v1 [284fc705], v2 [dc77f9ab], DB [284fc705, dc77f9ab]\n'
|
||||
)
|
||||
|
||||
def test_report_v1_and_v2(self):
|
||||
self.result.tracks[0].AR['DBMaxConfidence'] = 66
|
||||
print_report(self.result)
|
||||
self.assertEquals(
|
||||
sys.stdout.getvalue(),
|
||||
'track 1: rip accurate (confidence 12 of 66)'
|
||||
' v1 [284fc705], v2 [dc77f9ab], DB [284fc705, dc77f9ab]\n'
|
||||
)
|
||||
|
||||
@@ -2,96 +2,19 @@
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
|
||||
|
||||
import os
|
||||
import pickle
|
||||
|
||||
import unittest
|
||||
|
||||
from whipper.result import result
|
||||
from whipper.common import program, accurip, mbngs, config
|
||||
from whipper.common import program, mbngs, config
|
||||
from whipper.command.cd import DEFAULT_DISC_TEMPLATE
|
||||
|
||||
|
||||
class TrackImageVerifyTestCase(unittest.TestCase):
|
||||
# example taken from a rip of Luke Haines Is Dead, disc 1
|
||||
# AccurateRip database has 0 confidence for 1st track
|
||||
# Rip had a wrong result for track 9
|
||||
|
||||
def testVerify(self):
|
||||
path = os.path.join(os.path.dirname(__file__),
|
||||
'dBAR-020-002e5023-029d8e49-040eaa14.bin')
|
||||
data = open(path, "rb").read()
|
||||
responses = accurip.getAccurateRipResponses(data)
|
||||
|
||||
# these crc's were calculated from an actual rip
|
||||
checksums = [1644890007, 2945205445, 3983436658, 1528082495,
|
||||
1203704270, 1163423644, 3649097244, 100524219,
|
||||
1583356174, 373652058, 1842579359, 2850056507,
|
||||
1329730252, 2526965856, 2525886806, 209743350,
|
||||
3184062337, 2099956663, 2943874164, 2321637196]
|
||||
|
||||
prog = program.Program(config.Config())
|
||||
prog.result = result.RipResult()
|
||||
# fill it with empty trackresults
|
||||
for i, c in enumerate(checksums):
|
||||
r = result.TrackResult()
|
||||
r.number = i + 1
|
||||
prog.result.tracks.append(r)
|
||||
|
||||
prog._verifyImageWithChecksums(responses, checksums)
|
||||
|
||||
# now check if the results were filled in properly
|
||||
tr = prog.result.getTrackResult(1)
|
||||
self.assertEquals(tr.accurip, False)
|
||||
self.assertEquals(tr.ARDBMaxConfidence, 0)
|
||||
self.assertEquals(tr.ARDBCRC, 0)
|
||||
self.assertEquals(tr.ARDBCRC, 0)
|
||||
|
||||
tr = prog.result.getTrackResult(2)
|
||||
self.assertEquals(tr.accurip, True)
|
||||
self.assertEquals(tr.ARDBMaxConfidence, 2)
|
||||
self.assertEquals(tr.ARDBCRC, checksums[2 - 1])
|
||||
|
||||
tr = prog.result.getTrackResult(10)
|
||||
self.assertEquals(tr.accurip, False)
|
||||
self.assertEquals(tr.ARDBMaxConfidence, 2)
|
||||
# we know track 10 was ripped wrong
|
||||
self.assertNotEquals(tr.ARDBCRC, checksums[10 - 1])
|
||||
|
||||
res = prog.getAccurateRipResults()
|
||||
self.assertEquals(res[1 - 1],
|
||||
"Track 1: rip NOT accurate (not found) "
|
||||
"[620b0797], DB [notfound]")
|
||||
self.assertEquals(res[2 - 1],
|
||||
"Track 2: rip accurate (max confidence 2) "
|
||||
"[af8c44c5], DB [af8c44c5]")
|
||||
self.assertEquals(res[10 - 1],
|
||||
"Track 10: rip NOT accurate (max confidence 2) "
|
||||
"[16457a5a], DB [eb6e55b4]")
|
||||
|
||||
|
||||
class HTOATestCase(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
path = os.path.join(os.path.dirname(__file__),
|
||||
'silentalarm.result.pickle')
|
||||
self._tracks = pickle.load(open(path, 'rb'))
|
||||
|
||||
def testGetAccurateRipResults(self):
|
||||
prog = program.Program(config.Config())
|
||||
prog.result = result.RipResult()
|
||||
prog.result.tracks = self._tracks
|
||||
|
||||
prog.getAccurateRipResults()
|
||||
|
||||
|
||||
class PathTestCase(unittest.TestCase):
|
||||
|
||||
def testStandardTemplateEmpty(self):
|
||||
prog = program.Program(config.Config())
|
||||
|
||||
path = prog.getPath(u'/tmp', DEFAULT_DISC_TEMPLATE,
|
||||
'mbdiscid', 0)
|
||||
'mbdiscid', None)
|
||||
self.assertEquals(path,
|
||||
unicode('/tmp/unknown/Unknown Artist - mbdiscid/'
|
||||
'Unknown Artist - mbdiscid'))
|
||||
@@ -101,10 +24,9 @@ class PathTestCase(unittest.TestCase):
|
||||
md = mbngs.DiscMetadata()
|
||||
md.artist = md.sortName = 'Jeff Buckley'
|
||||
md.title = 'Grace'
|
||||
prog.metadata = md
|
||||
|
||||
path = prog.getPath(u'/tmp', DEFAULT_DISC_TEMPLATE,
|
||||
'mbdiscid', 0)
|
||||
'mbdiscid', md, 0)
|
||||
self.assertEquals(path,
|
||||
unicode('/tmp/unknown/Jeff Buckley - Grace/'
|
||||
'Jeff Buckley - Grace'))
|
||||
@@ -114,92 +36,7 @@ class PathTestCase(unittest.TestCase):
|
||||
md = mbngs.DiscMetadata()
|
||||
md.artist = md.sortName = 'Jeff Buckley'
|
||||
md.title = 'Grace'
|
||||
prog.metadata = md
|
||||
|
||||
path = prog.getPath(u'/tmp', u'%A/%d', 'mbdiscid', 0)
|
||||
path = prog.getPath(u'/tmp', u'%A/%d', 'mbdiscid', md, 0)
|
||||
self.assertEquals(path,
|
||||
u'/tmp/Jeff Buckley/Grace')
|
||||
|
||||
def testDisambiguateOnRelease(self):
|
||||
"""Test that disambiguation gets placed in the same part of the path
|
||||
as the release name.
|
||||
|
||||
See https://github.com/JoeLametta/whipper/issues/127"""
|
||||
prog = program.Program(config.Config())
|
||||
md = mbngs.DiscMetadata()
|
||||
md.artist = 'Guy Davis'
|
||||
md.sortName = 'Davis, Guy'
|
||||
md.title = 'Call Down the Thunder'
|
||||
md.release = '1996'
|
||||
md.catalogNumber = 'RHR CD 89'
|
||||
prog.metadata = md
|
||||
templates = {
|
||||
u'%A/%d - %y': u'Guy Davis/Call Down the Thunder - 1996 (RHR CD 89)', # noqa: E501
|
||||
u'%A - %d - %y': u'Guy Davis - Call Down the Thunder - 1996 (RHR CD 89)', # noqa: E501
|
||||
u'%A/%y/%d': u'Guy Davis/1996/Call Down the Thunder (RHR CD 89)',
|
||||
u'%y/%d/%A': u'1996/Call Down the Thunder (RHR CD 89)/Guy Davis',
|
||||
u'%d/%A/%y': u'Call Down the Thunder (RHR CD 89)/Guy Davis/1996',
|
||||
}
|
||||
|
||||
for template, expected_path in templates.iteritems():
|
||||
path = prog.getPath(u'/tmp', template, 'mbdiscid', 0, disambiguate=True) # noqa: E501
|
||||
self.assertEquals(path, u'/tmp/' + expected_path)
|
||||
|
||||
def testDisambiguateOnReleaseOnlyOnce(self):
|
||||
"""Test that disambiguation gets added only once."""
|
||||
prog = program.Program(config.Config())
|
||||
md = mbngs.DiscMetadata()
|
||||
md.artist = 'Guy Davis'
|
||||
md.sortName = 'Davis, Guy'
|
||||
md.title = 'Call Down the Thunder'
|
||||
md.release = '1996'
|
||||
md.catalogNumber = 'RHR CD 89'
|
||||
prog.metadata = md
|
||||
template = u'%A/%d - %y/%d/%d'
|
||||
|
||||
path = prog.getPath(u'/tmp', template, 'mbdiscid', 0, disambiguate=True) # noqa: E501
|
||||
self.assertEquals(path,
|
||||
u'/tmp/Guy Davis/Call Down the Thunder - 1996 (RHR CD 89)/Call Down the Thunder/Call Down the Thunder') # noqa: E501
|
||||
|
||||
def testDisambiguateOnNoReleaseTitle(self):
|
||||
"""Test that disambiguation gets added even if there's no release
|
||||
title in the template."""
|
||||
prog = program.Program(config.Config())
|
||||
md = mbngs.DiscMetadata()
|
||||
md.artist = 'Guy Davis'
|
||||
md.sortName = 'Davis, Guy'
|
||||
md.title = 'Call Down the Thunder'
|
||||
md.release = '1996'
|
||||
md.catalogNumber = 'RHR CD 89'
|
||||
prog.metadata = md
|
||||
templates = {
|
||||
u'%A/%y': u'Guy Davis/1996 (RHR CD 89)',
|
||||
u'%A - %y': u'Guy Davis - 1996 (RHR CD 89)',
|
||||
u'%y/%A': u'1996/Guy Davis (RHR CD 89)',
|
||||
}
|
||||
|
||||
for template, expected_path in templates.iteritems():
|
||||
path = prog.getPath(u'/tmp', template, 'mbdiscid', 0, disambiguate=True) # noqa: E501
|
||||
self.assertEquals(path, u'/tmp/' + expected_path)
|
||||
|
||||
def testAddDisambiguationUnitTest(self):
|
||||
"""Unit test for Program.addDisambiguation()."""
|
||||
prog = program.Program(config.Config())
|
||||
md = mbngs.DiscMetadata()
|
||||
|
||||
# No relevant disambiguation metadata
|
||||
self.assertEquals(
|
||||
prog.addDisambiguation(u'Test', md),
|
||||
u'Test')
|
||||
|
||||
# Only barcode available
|
||||
md.barcode = '033651008927'
|
||||
self.assertEquals(
|
||||
prog.addDisambiguation(u'Test', md),
|
||||
u'Test (033651008927)')
|
||||
|
||||
# Both catalog number and barcode available
|
||||
md.catalogNumber = 'RHR CD 89'
|
||||
self.assertEquals(
|
||||
prog.addDisambiguation(u'Test', md),
|
||||
u'Test (RHR CD 89)')
|
||||
|
||||
@@ -62,11 +62,10 @@ class LadyhawkeTestCase(tcommon.TestCase):
|
||||
"KnpGsLhvH.lPrNc1PBL21lb9Bg4-")
|
||||
|
||||
def testAccurateRip(self):
|
||||
self.assertEquals(self.table.getAccurateRipIds(), (
|
||||
self.assertEquals(self.table.accuraterip_ids(), (
|
||||
"0013bd5a", "00b8d489"))
|
||||
self.assertEquals(self.table.getAccurateRipURL(),
|
||||
"http://www.accuraterip.com/accuraterip/a/5/d/"
|
||||
"dBAR-012-0013bd5a-00b8d489-c60af50d.bin")
|
||||
self.assertEquals(self.table.accuraterip_path(),
|
||||
"a/5/d/dBAR-012-0013bd5a-00b8d489-c60af50d.bin")
|
||||
|
||||
def testDuration(self):
|
||||
self.assertEquals(self.table.duration(), 2761413)
|
||||
|
||||
@@ -89,8 +89,8 @@ class CureTestCase(common.TestCase):
|
||||
common.diffStrings(ref, cue)
|
||||
|
||||
# we verify it because it has failed in readdisc in the past
|
||||
self.assertEquals(self.toc.table.getAccurateRipURL(),
|
||||
'http://www.accuraterip.com/accuraterip/3/c/4/dBAR-013-0019d4c3-00fe8924-b90c650d.bin') # noqa: E501
|
||||
self.assertEquals(self.toc.table.accuraterip_path(),
|
||||
'3/c/4/dBAR-013-0019d4c3-00fe8924-b90c650d.bin')
|
||||
|
||||
def testGetRealPath(self):
|
||||
self.assertRaises(KeyError, self.toc.getRealPath, u'track01.wav')
|
||||
@@ -164,8 +164,8 @@ class BlocTestCase(common.TestCase):
|
||||
|
||||
def testAccurateRip(self):
|
||||
# we verify it because it has failed in readdisc in the past
|
||||
self.assertEquals(self.toc.table.getAccurateRipURL(),
|
||||
'http://www.accuraterip.com/accuraterip/e/d/2/dBAR-013-001af2de-0105994e-ad0be00d.bin') # noqa: E501
|
||||
self.assertEquals(self.toc.table.accuraterip_path(),
|
||||
'e/d/2/dBAR-013-001af2de-0105994e-ad0be00d.bin')
|
||||
|
||||
# The Breeders - Mountain Battles has CDText
|
||||
|
||||
|
||||
Reference in New Issue
Block a user