From 021e621f840d3d8a34012b8abdaa9cf6bb8ce03b Mon Sep 17 00:00:00 2001 From: anarcat Date: Sat, 6 Oct 2018 13:13:27 -0400 Subject: [PATCH] Handle FreeDB server errors gracefully (#304) * handle FreeDB server errors gracefully In my repeated tests, I ended up upsetting freedb.org, which started issuing 502 errors. Those errors are not correctly caught by the program which just crashes with a backtrace. Instead, we handle those like any other API error, which can already be generated by perform_lookup (but not handled). The visible result for the user is that the CD is simply not found on FreeDB, an acceptable compromise, in my opinion. Closes: #206 * harmonize an error message with other warnings ... which are all capitalized. --- whipper/common/program.py | 5 ++++- whipper/extern/freedb.py | 16 ++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/whipper/common/program.py b/whipper/common/program.py index c16a660..5a1daaa 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -251,10 +251,13 @@ class Program: logger.debug('CDDB query result: %r', md) return [item['DTITLE'] for item in md if 'DTITLE' in item] or None + except ValueError as e: + self._stdout.write("WARNING: CDDB protocol error: %s\n" % e) + except IOError as e: # FIXME: for some reason errno is a str ? if e.errno == 'socket error': - self._stdout.write("Warning: network error: %r\n" % (e, )) + self._stdout.write("WARNING: CDDB network error: %r\n" % (e, )) else: raise diff --git a/whipper/extern/freedb.py b/whipper/extern/freedb.py index 03d2302..48a3deb 100644 --- a/whipper/extern/freedb.py +++ b/whipper/extern/freedb.py @@ -169,8 +169,9 @@ def freedb_command(freedb_server, freedb_port, cmd, *args): try: from urllib.request import urlopen + from urllib.error import URLError except ImportError: - from urllib2 import urlopen + from urllib2 import urlopen, URLError try: from urllib.parse import urlencode except ImportError: @@ -203,11 +204,14 @@ def freedb_command(freedb_server, freedb_port, cmd, *args): POST.append((u"proto", u"6")) - # get Request object from post - request = urlopen( - "http://{}:{:d}/~cddb/cddb.cgi".format(freedb_server, freedb_port), - urlencode(POST).encode("UTF-8") if (version_info[0] >= 3) else - urlencode(POST)) + try: + # get Request object from post + request = urlopen( + "http://{}:{:d}/~cddb/cddb.cgi".format(freedb_server, freedb_port), + urlencode(POST).encode("UTF-8") if (version_info[0] >= 3) else + urlencode(POST)) + except URLError as e: + raise ValueError(str(e)) try: # yield lines of output line = request.readline()