From 0a142036efbe46ea33631e4b8c83accc26d91aac Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Tue, 14 Jun 2016 22:42:09 +0200 Subject: [PATCH] Improve musicbrainzngs' results handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: * whipper is now capable of handling musicbrainzngs’ bad server responses (it throws an exception). * whipper is now aware of musicbrainzngs’ possible “cdstub” response and should handle it fine (ignoring the result because the informations received are incomplete e/o unverified). This commit should fix JoeLametta/whipper#22 --- morituri/common/mbngs.py | 73 +++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/morituri/common/mbngs.py b/morituri/common/mbngs.py index c0596ad..58ec099 100644 --- a/morituri/common/mbngs.py +++ b/morituri/common/mbngs.py @@ -266,7 +266,7 @@ def musicbrainz(discid, country=None, record=False): @rtype: list of L{DiscMetadata} """ - log.debug('musicbrainz', 'looking up results for discid %r', discid) + log.debug('musicbrainzngs', 'looking up results for discid %r', discid) import musicbrainzngs ret = [] @@ -278,40 +278,45 @@ def musicbrainz(discid, country=None, record=False): if isinstance(e.cause, urllib2.HTTPError): if e.cause.code == 404: raise NotFoundException(e) + else: + log.debug('musicbrainzngs', + 'received bad response from the server') raise MusicBrainzException(e) - # No disc matching this DiscID has been found. - if len(result) == 0: + # The result can either be a "disc" or a "cdstub" + if result.get('disc'): + log.debug('musicbrainzngs', 'found %d releases for discid %r', + len(result['disc']['release-list']), discid) + _record(record, 'releases', discid, result) + + # Display the returned results to the user. + + import json + for release in result['disc']['release-list']: + formatted = json.dumps(release, sort_keys=False, indent=4) + log.debug('program', 'result %s: artist %r, title %r' % ( + formatted, release['artist-credit-phrase'], release['title'])) + + # to get titles of recordings, we need to query the release with + # artist-credits + + res = musicbrainzngs.get_release_by_id( + release['id'], includes=["artists", "artist-credits", + "recordings", "discids", "labels"]) + _record(record, 'release', release['id'], res) + releaseDetail = res['release'] + formatted = json.dumps(releaseDetail, sort_keys=False, indent=4) + log.debug('program', 'release %s' % formatted) + + md = _getMetadata(release, releaseDetail, discid, country) + if md: + log.debug('program', 'duration %r', md.duration) + ret.append(md) + + return ret + elif result.get('cdstub'): + log.debug('musicbrainzngs', 'query returned cdstub: ignored') + return None + else: return None - - log.debug('musicbrainzngs', 'found %d releases for discid %r', - len(result['disc']['release-list']), - discid) - _record(record, 'releases', discid, result) - - # Display the returned results to the user. - - import json - for release in result['disc']['release-list']: - formatted = json.dumps(release, sort_keys=False, indent=4) - log.debug('program', 'result %s: artist %r, title %r' % ( - formatted, release['artist-credit-phrase'], release['title'])) - - # to get titles of recordings, we need to query the release with - # artist-credits - - res = musicbrainzngs.get_release_by_id(release['id'], - includes=["artists", "artist-credits", "recordings", "discids", - "labels"]) - _record(record, 'release', release['id'], res) - releaseDetail = res['release'] - formatted = json.dumps(releaseDetail, sort_keys=False, indent=4) - log.debug('program', 'release %s' % formatted) - - md = _getMetadata(release, releaseDetail, discid, country) - if md: - log.debug('program', 'duration %r', md.duration) - ret.append(md) - - return ret