From b31451f0b90e84a470f5fc370b184ba58e79d089 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sun, 12 Jun 2011 22:58:11 -0700 Subject: [PATCH] handle some MusicBrainz errors (#187) --- NEWS | 1 + beets/autotag/mb.py | 30 ++++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 0db887293..7654353e3 100644 --- a/NEWS +++ b/NEWS @@ -37,6 +37,7 @@ * Fix a crasher when setting MBIDs on MP3s file metadata. * Fix a "broken pipe" error when piping beets' standard output. * A better error message is given when the database file is unopenable. +* Suppress errors due to timeouts and bad responses from MusicBrainz. 1.0b8 ----- diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index 74de382c8..c01879686 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -33,6 +33,7 @@ SEARCH_LIMIT = 10 VARIOUS_ARTISTS_ID = VARIOUS_ARTISTS_ID.rsplit('/', 1)[1] class ServerBusyError(Exception): pass +class BadResponseError(Exception): pass log = logging.getLogger('beets') @@ -94,6 +95,13 @@ def _query_wrap(fun, *args, **kwargs): else: # This is not the error we're looking for. raise + except mbws.ConnectionError: + # Typically a timeout. + pass + except mbws.ResponseError, exc: + # Malformed response from server. + log.error('Bad response from MusicBrainz: ' + str(exc)) + raise BadResponseError() else: # Success. Return the result. return res @@ -114,7 +122,10 @@ def get_releases(**params): # Issue query. filt = mbws.ReleaseFilter(**params) - results = _query_wrap(mbws.Query().getReleases, filter=filt) + try: + results = _query_wrap(mbws.Query().getReleases, filter=filt) + except BadResponseError: + results = () # Construct results. for result in results: @@ -127,8 +138,12 @@ def release_info(release_id): release and the release group ID. If the release is not found, returns None. """ - release = _query_wrap(mbws.Query().getReleaseById, release_id, - RELEASE_INCLUDES) + try: + release = _query_wrap(mbws.Query().getReleaseById, release_id, + RELEASE_INCLUDES) + except BadResponseError: + release = None + if release: return release.getTracks(), release.getReleaseGroup().getId() else: @@ -185,7 +200,10 @@ def find_tracks(criteria, limit=SEARCH_LIMIT): query = _lucene_query(criteria) log.debug('track query: %s' % query) filt = mbws.TrackFilter(limit=limit, query=query) - results = _query_wrap(mbws.Query().getTracks, filter=filt) + try: + results = _query_wrap(mbws.Query().getTracks, filter=filt) + except BadResponseError: + results = () for result in results: track = result.track yield track_dict(track) @@ -293,6 +311,8 @@ def album_for_id(albumid): query = mbws.Query() try: album = _query_wrap(query.getReleaseById, albumid, RELEASE_INCLUDES) + except BadResponseError: + return None except (mbws.ResourceNotFoundError, mbws.RequestError), exc: log.debug('Album ID match failed: ' + str(exc)) return None @@ -305,6 +325,8 @@ def track_for_id(trackid): query = mbws.Query() try: track = _query_wrap(query.getTrackById, trackid, TRACK_INCLUDES) + except BadResponseError: + return None except (mbws.ResourceNotFoundError, mbws.RequestError), exc: log.debug('Track ID match failed: ' + str(exc)) return None