From a189955e4209b9460d335dd1480155d7e71eea5d Mon Sep 17 00:00:00 2001 From: "Donald R. Huettl" Date: Tue, 7 Apr 2015 15:15:07 -0500 Subject: [PATCH 1/2] option to prompt when multiple releases match Adds a --prompt option that lets the user decide which release is the best match, instead of choosing one more or less at random. --- morituri/common/program.py | 27 +++++++++++++++++++++------ morituri/rip/cd.py | 6 +++++- morituri/rip/image.py | 5 ++++- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/morituri/common/program.py b/morituri/common/program.py index d340fdd9..70ab8d46 100644 --- a/morituri/common/program.py +++ b/morituri/common/program.py @@ -314,7 +314,7 @@ def getCDDB(self, cddbdiscid): return None - def getMusicBrainz(self, ittoc, mbdiscid, release=None): + def getMusicBrainz(self, ittoc, mbdiscid, release=None, prompt=False): """ @type ittoc: L{morituri.image.table.Table} """ @@ -364,12 +364,29 @@ def getMusicBrainz(self, ittoc, mbdiscid, release=None): 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', @@ -388,12 +405,10 @@ def getMusicBrainz(self, ittoc, mbdiscid, release=None): "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 diff --git a/morituri/rip/cd.py b/morituri/rip/cd.py index c787d3fe..5b6351ff 100644 --- a/morituri/rip/cd.py +++ b/morituri/rip/cd.py @@ -58,6 +58,9 @@ def addOptions(self): 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") def do(self, args): @@ -89,7 +92,8 @@ def do(self, args): self.program.metadata = self.program.getMusicBrainz(self.ittoc, self.mbdiscid, - release=self.options.release_id) + release=self.options.release_id, + prompt=self.options.prompt) if not self.program.metadata: # fall back to FreeDB for lookup diff --git a/morituri/rip/image.py b/morituri/rip/image.py index 67f2d4cc..67d1a3ce 100644 --- a/morituri/rip/image.py +++ b/morituri/rip/image.py @@ -107,6 +107,9 @@ def addOptions(self): 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") def do(self, args): @@ -128,7 +131,7 @@ def do(self, args): 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, prompt=self.options.prompt) if not prog.metadata: print 'Not in MusicBrainz database, skipping' From d3d6f2bde5e470d1ea0e99db321145e80fae29a5 Mon Sep 17 00:00:00 2001 From: "Donald R. Huettl" Date: Mon, 22 Sep 2014 19:59:16 -0500 Subject: [PATCH 2/2] option to filter by release country Limit the MusicBrainz results returned to the specified country. --- morituri/common/mbngs.py | 10 +++++++--- morituri/common/program.py | 3 ++- morituri/rip/cd.py | 4 ++++ morituri/rip/image.py | 7 ++++++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/morituri/common/mbngs.py b/morituri/common/mbngs.py index bbbb3c71..fa7d08e6 100644 --- a/morituri/common/mbngs.py +++ b/morituri/common/mbngs.py @@ -144,7 +144,7 @@ def getIds(self): 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) diff --git a/morituri/common/program.py b/morituri/common/program.py index 70ab8d46..a71e6e72 100644 --- a/morituri/common/program.py +++ b/morituri/common/program.py @@ -314,7 +314,7 @@ def getCDDB(self, cddbdiscid): return None - def getMusicBrainz(self, ittoc, mbdiscid, release=None, prompt=False): + def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None, prompt=False): """ @type ittoc: L{morituri.image.table.Table} """ @@ -332,6 +332,7 @@ def getMusicBrainz(self, ittoc, mbdiscid, release=None, prompt=False): for _ in range(0, 4): try: metadatas = mbngs.musicbrainz(mbdiscid, + country=country, record=self._record) except mbngs.NotFoundException, e: break diff --git a/morituri/rip/cd.py b/morituri/rip/cd.py index 5b6351ff..f7cdb2f5 100644 --- a/morituri/rip/cd.py +++ b/morituri/rip/cd.py @@ -61,6 +61,9 @@ def addOptions(self): 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): @@ -93,6 +96,7 @@ def do(self, args): self.program.metadata = self.program.getMusicBrainz(self.ittoc, self.mbdiscid, release=self.options.release_id, + country=self.options.country, prompt=self.options.prompt) if not self.program.metadata: diff --git a/morituri/rip/image.py b/morituri/rip/image.py index 67d1a3ce..b5a02939 100644 --- a/morituri/rip/image.py +++ b/morituri/rip/image.py @@ -110,6 +110,9 @@ def addOptions(self): 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): @@ -131,7 +134,9 @@ def do(self, args): self.stdout.write("MusicBrainz lookup URL %s\n" % cueImage.table.getMusicBrainzSubmitURL()) prog.metadata = prog.getMusicBrainz(cueImage.table, mbdiscid, - release=self.options.release_id, prompt=self.options.prompt) + release=self.options.release_id, + country=self.options.country, + prompt=self.options.prompt) if not prog.metadata: print 'Not in MusicBrainz database, skipping'