clients Exception refactoring
authorkaliko <kaliko.jack@azylum.org>
Mon, 14 Jan 2013 07:48:09 +0000 (08:48 +0100)
committerkaliko <kaliko.jack@azylum.org>
Mon, 14 Jan 2013 07:48:09 +0000 (08:48 +0100)
misc/MPDScrobbler/mpdscrobbler.py
misc/clientpy2.py
misc/clientpy3.py

index bdf31f5..e8fcd69 100755 (executable)
@@ -5,10 +5,9 @@ import sys
 import threading
 
 from time import sleep
-from urllib2 import URLError, HTTPError
 from collections import deque
 
-from client import scrobble
+from client import scrobble, ScrobbleError
 
 from lib.mpdclient import Player
 from lib.daemon import Daemon
@@ -63,12 +62,10 @@ class QueuManagement(threading.Thread):
         track = self.queu_copy.popleft()
         try:
             scrobble(trk=track, user=USER, pwd=PWD, srv=SCSERVER)
-        except URLError as err:
+        except ScrobbleError as err:
             logging.warning('scrobbler: Failed catching up with "%s": %s' % (track, err))
-            self.queu.appendleft(track)
-            return False
-        except Exception as err:
-            logging.warning('scrobbler: Unhandled exception: %s' % err)
+            if hasattr(err, 'http_out'):
+                logging.debug(u'scrobbler: http-error %s→\ns' % (err, err.read().decode('utf-8')))
             self.queu.appendleft(track)
             return False
         logging.info('Catching up with {0}'.format(track))
@@ -115,15 +112,10 @@ class MpdScrobbler(Player):
             return
         try:
             scrobble(trk=self.current_track, user=USER, pwd=PWD, srv=SCSERVER)
-        except HTTPError as err:
-            if hasattr(err, 'read'):
-                logging.error(u'scrobbler: http-error %s' % err)
-                logging.debug(u'scrobbler: http-error %s→\ns' % (err, err.read().decode('utf-8')))
-            else:
-                logging.error('scrobbler: {0}'.format(err))
-            self.failed_sc_cache.append(self.current_track)
-        except URLError as err:
+        except ScrobbleError as err:
             logging.error('scrobbler: {0}'.format(err))
+            if hasattr(err, 'http_out'):
+                logging.debug(u'scrobbler: http-error %s→\ns' % (err, err.read().decode('utf-8')))
             self.failed_sc_cache.append(self.current_track)
         else:
             # Deal with the queu if last scrobble went fine
index e8ef3e0..fdc1d6f 100755 (executable)
@@ -12,12 +12,31 @@ from urllib import urlencode
 
 from time import time, sleep
 from urllib2 import URLError, HTTPError
+from httplib import BadStatusLine
 
 from datetime import datetime, timedelta
 
 
 WAIT_BETWEEN_REQUESTS = timedelta(0, 0.9)
 
+class ScrobbleError(Exception):
+    """Generic Error"""
+    pass
+
+class ScrobbleHTTPError(ScrobbleError):
+    """HTTP scrobbler Error"""
+
+    def __init__(self, expression):
+        self.http_out = None
+        self.expression = expression
+        if hasattr(expression, 'read'):
+            self.http_out = expression.read().decode('utf-8')
+
+    def __str__(self):
+        return repr(self.expression)
+
+class ScrobbleUnhandledError(ScrobbleError):
+    pass
 
 class Throttle(object):
     def __init__(self, wait):
@@ -77,7 +96,6 @@ def scrobble(trk=None, user=None, pwd=None, srv=None):
     sc_url = u'https://{server}/api/{user}/scrobbles/'
     url = sc_url.format(user=user, server=srv)
     params = urlencode(get_api_options(trk))
-    #print(url + u'?' + params)
     auth_handler = urllib2.HTTPBasicAuthHandler()
     auth_handler.add_password(realm='Scrobbler server',
                               uri=url,
@@ -86,7 +104,17 @@ def scrobble(trk=None, user=None, pwd=None, srv=None):
     opener = urllib2.build_opener(auth_handler)
     urllib2.install_opener(opener)
     params = params.encode('utf-8')
-    urllib2.urlopen(url, params)
+    try:
+        urllib2.urlopen(url, params)
+    except HTTPError as err:
+        raise ScrobbleHTTPError(err)
+    except URLError as err:
+        raise ScrobbleError(err)
+    except BadStatusLine as err:
+        raise ScrobbleError(err)
+    except Exception as err:
+        raise ScrobbleUnhandledError(err)
+
 
 def main():
     parser = argparse.ArgumentParser(prog='scrobbler client')
@@ -97,10 +125,8 @@ def main():
     track = Track(**vars(args))  # Shipping 'user' key/val as well, but remains unused in get_api_options.
     try:
         scrobble(trk=track, user=user, srv=SERVER, pwd=PWD)
-    except HTTPError as err:
+    except Exception as err:
         print(err)
-    except URLError as err:
-        print('connexion error: %s' % err)
 
 
 # Script starts here
index e1dab9b..5ae6ecc 100755 (executable)
 import urllib.request
 import urllib.parse
 
-from time import time
 from urllib.error import URLError, HTTPError
+from http.client import BadStatusLine
+
+from time import time
 from datetime import datetime, timedelta
 
 
 WAIT_BETWEEN_REQUESTS = timedelta(0, 0.9)
 
+class ScrobbleError(Exception):
+    """Generic Error"""
+    pass
+
+class ScrobbleHTTPError(ScrobbleError):
+    """HTTP scrobbler Error"""
+
+    def __init__(self, expression):
+        self.http_out = None
+        self.expression = expression
+        if hasattr(expression, 'read'):
+            self.http_out = expression.read().decode('utf-8')
+
+    def __str__(self):
+        return repr(self.expression)
+
+class ScrobbleUnhandledError(ScrobbleError):
+    pass
 
 class Throttle(object):
     def __init__(self, wait):
@@ -85,7 +105,16 @@ def scrobble(trk=None, user=None, pwd=None, srv=None):
     opener = urllib.request.build_opener(auth_handler)
     urllib.request.install_opener(opener)
     params = params.encode('utf-8')
-    urllib.request.urlopen(url, params)
+    try:
+        urllib.request.urlopen(url, params)
+    except HTTPError as err:
+        raise ScrobbleHTTPError(err)
+    except URLError as err:
+        raise ScrobbleError(err)
+    except BadStatusLine as err:
+        raise ScrobbleError(err)
+    except Exception as err:
+        raise ScrobbleUnhandledError(err)
 
 def main():
     parser = argparse.ArgumentParser(prog='scrobbler client')
@@ -96,10 +125,8 @@ def main():
     track = Track(**vars(args))  # Shipping 'user' key/val as well, but remains unused in get_api_options.
     try:
         scrobble(trk=track, user=user, srv=SERVER, pwd=PWD)
-    except HTTPError as err:
+    except Exception as err:
         print(err)
-    except URLError as err:
-        print('connexion error: %s' % err)
 
 
 # Script starts here