Improve musicbrainzngs' results handling

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
This commit is contained in:
JoeLametta
2016-06-14 22:42:09 +02:00
parent ae1b0b3213
commit 0a142036ef

View File

@@ -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