Improve MusicBrainz results filtering

thomasvs/morituri#140
This commit is contained in:
JoeLametta
2015-11-29 16:26:49 +01:00
parent 9ade743d63
commit 735596c401
4 changed files with 47 additions and 11 deletions

View File

@@ -144,7 +144,7 @@ class _Credit(list):
joinString=";")
def _getMetadata(releaseShort, release, discid):
def _getMetadata(releaseShort, release, discid, country=None):
"""
@type release: C{dict}
@param release: a release dict as returned in the value for key release
@@ -160,6 +160,10 @@ def _getMetadata(releaseShort, release, discid):
assert release['id'], 'Release does not have an id'
if 'country' in release and country and release['country'] != country:
log.warning('program', '%r was not released in %r', release, country)
return None
discMD = DiscMetadata()
discMD.releaseType = releaseShort.get('release-group', {}).get('type')
@@ -251,7 +255,7 @@ def _getMetadata(releaseShort, release, discid):
# ripper.py
def musicbrainz(discid, record=False):
def musicbrainz(discid, country=None, record=False):
"""
Based on a MusicBrainz disc id, get a list of DiscMetadata objects
for the given disc id.
@@ -305,7 +309,7 @@ def musicbrainz(discid, record=False):
formatted = json.dumps(releaseDetail, sort_keys=False, indent=4)
log.debug('program', 'release %s' % formatted)
md = _getMetadata(release, releaseDetail, discid)
md = _getMetadata(release, releaseDetail, discid, country)
if md:
log.debug('program', 'duration %r', md.duration)
ret.append(md)

View File

@@ -322,7 +322,7 @@ class Program(log.Loggable):
return None
def getMusicBrainz(self, ittoc, mbdiscid, release=None):
def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None, prompt=False):
"""
@type ittoc: L{morituri.image.table.Table}
"""
@@ -340,6 +340,7 @@ class Program(log.Loggable):
for _ in range(0, 4):
try:
metadatas = mbngs.musicbrainz(mbdiscid,
country=country,
record=self._record)
except mbngs.NotFoundException, e:
break
@@ -372,12 +373,29 @@ class Program(log.Loggable):
self._stdout.write('URL : %s\n' % metadata.url)
self._stdout.write('Release : %s\n' % metadata.mbid)
self._stdout.write('Type : %s\n' % metadata.releaseType)
if metadata.barcode:
self._stdout.write("Barcode : %s\n" % metadata.barcode)
if metadata.catalogNumber:
self._stdout.write("Cat no : %s\n" % metadata.catalogNumber)
delta = abs(metadata.duration - ittoc.duration())
if not delta in deltas:
deltas[delta] = []
deltas[delta].append(metadata)
lowest = None
if not release and len(metadatas) > 1:
# Select the release that most closely matches the duration.
lowest = min(deltas.keys())
if prompt:
guess = (deltas[lowest])[0].mbid
release = raw_input("\nPlease select a release [%s]: " % guess)
if not release:
release = guess
if release:
metadatas = [m for m in metadatas if m.url.endswith(release)]
self.debug('Asked for release %r, only kept %r',
@@ -396,12 +414,10 @@ class Program(log.Loggable):
"but none of the found releases match\n" % release)
return
else:
# Select the release that most closely matches the duration.
lowest = min(deltas.keys())
# If we have multiple, make sure they match
metadatas = deltas[lowest]
if lowest:
metadatas = deltas[lowest]
# If we have multiple, make sure they match
if len(metadatas) > 1:
artist = metadatas[0].artist
releaseTitle = metadatas[0].releaseTitle

View File

@@ -59,6 +59,12 @@ class _CD(logcommand.LogCommand):
self.parser.add_option('-R', '--release-id',
action="store", dest="release_id",
help="MusicBrainz release id to match to (if there are multiple)")
self.parser.add_option('-p', '--prompt',
action="store_true", dest="prompt",
help="Prompt if there are multiple matching releases")
self.parser.add_option('-c', '--country',
action="store", dest="country",
help="Filter releases by country")
def do(self, args):
@@ -90,7 +96,9 @@ class _CD(logcommand.LogCommand):
self.program.metadata = self.program.getMusicBrainz(self.ittoc,
self.mbdiscid,
release=self.options.release_id)
release=self.options.release_id,
country=self.options.country,
prompt=self.options.prompt)
if not self.program.metadata:
# fall back to FreeDB for lookup

View File

@@ -107,6 +107,12 @@ class Retag(logcommand.LogCommand):
self.parser.add_option('-R', '--release-id',
action="store", dest="release_id",
help="MusicBrainz release id to match to (if there are multiple)")
self.parser.add_option('-p', '--prompt',
action="store_true", dest="prompt",
help="Prompt if there are multiple matching releases")
self.parser.add_option('-c', '--country',
action="store", dest="country",
help="Filter releases by country")
def do(self, args):
@@ -128,7 +134,9 @@ class Retag(logcommand.LogCommand):
self.stdout.write("MusicBrainz lookup URL %s\n" %
cueImage.table.getMusicBrainzSubmitURL())
prog.metadata = prog.getMusicBrainz(cueImage.table, mbdiscid,
release=self.options.release_id)
release=self.options.release_id,
country=self.options.country,
prompt=self.options.prompt)
if not prog.metadata:
print 'Not in MusicBrainz database, skipping'