]> kaliko git repositories - mpd-sima.git/blobdiff - sima/lib/simaecho.py
Add ETag support for echonest
[mpd-sima.git] / sima / lib / simaecho.py
index 592ea0387f9fd718312cf50c3028e3f70f271f07..27bbce2d0f122f8952438aafbf2979538a616f37 100644 (file)
@@ -25,48 +25,48 @@ __version__ = '0.0.2'
 __author__ = 'Jack Kaliko'
 
 
 __author__ = 'Jack Kaliko'
 
 
-from datetime import datetime, timedelta
+from datetime import timedelta
 
 from requests import Session, Request, Timeout, ConnectionError
 
 from sima import ECH
 from sima.lib.meta import Artist
 from sima.lib.track import Track
 
 from requests import Session, Request, Timeout, ConnectionError
 
 from sima import ECH
 from sima.lib.meta import Artist
 from sima.lib.track import Track
-from sima.lib.httpcli.controller import CacheController
-from sima.lib.httpcli.cache import FileCache
+from sima.lib.http import CacheController
 from sima.utils.utils import WSError, WSNotFound, WSTimeout, WSHTTPError
 from sima.utils.utils import getws, Throttle
 if len(ECH.get('apikey')) == 23:  # simple hack allowing imp.reload
     getws(ECH)
 
 # Some definitions
 from sima.utils.utils import WSError, WSNotFound, WSTimeout, WSHTTPError
 from sima.utils.utils import getws, Throttle
 if len(ECH.get('apikey')) == 23:  # simple hack allowing imp.reload
     getws(ECH)
 
 # Some definitions
-WAIT_BETWEEN_REQUESTS = timedelta(0, 1)
-SOCKET_TIMEOUT = 4
+WAIT_BETWEEN_REQUESTS = timedelta(0, 2)
+SOCKET_TIMEOUT = 6
 
 
 class SimaEch:
     """EchoNest http client
     """
     root_url = 'http://{host}/api/{version}'.format(**ECH)
 
 
 class SimaEch:
     """EchoNest http client
     """
     root_url = 'http://{host}/api/{version}'.format(**ECH)
-    timestamp = datetime.utcnow()
     ratelimit = None
     name = 'EchoNest'
     ratelimit = None
     name = 'EchoNest'
-    cache = FileCache('/home/kaliko/.local/share/mpd_sima/http')
+    cache = False
+    stats = {'304':0, 'cached':0, 'minrl':'120'}
 
     def __init__(self):
 
     def __init__(self):
-        self._ressource = None
-        self.current_element = None
         self.controller = CacheController(self.cache)
 
         self.controller = CacheController(self.cache)
 
-    def _fetch(self, payload):
-        """Use cached elements or proceed http request"""
-        req = Request('GET', self._ressource, params=payload,
+    def _fetch(self, ressource, payload):
+        """
+        Prepare http request
+        Use cached elements or proceed http request
+        """
+        req = Request('GET', ressource, params=payload,
                       ).prepare()
         if self.cache:
             cached_response = self.controller.cached_request(req.url, req.headers)
             if cached_response:
                       ).prepare()
         if self.cache:
             cached_response = self.controller.cached_request(req.url, req.headers)
             if cached_response:
+                SimaEch.stat.update(cached=SimaEch.stat.get('cached')+1)
                 return cached_response.json()
                 return cached_response.json()
-
         try:
             return self._fetch_ws(req)
         except Timeout:
         try:
             return self._fetch_ws(req)
         except Timeout:
@@ -80,11 +80,16 @@ class SimaEch:
         """fetch from web service"""
         sess = Session()
         resp = sess.send(prepreq, timeout=SOCKET_TIMEOUT)
         """fetch from web service"""
         sess = Session()
         resp = sess.send(prepreq, timeout=SOCKET_TIMEOUT)
-        self.__class__.ratelimit = resp.headers.get('x-ratelimit-remaining', None)
-        if resp.status_code is not 200:
+        if resp.status_code == 304:
+            SimaEch.stats.update({'304':SimaEch.stats.get('304')+1})
+            resp = self.controller.update_cached_response(prepreq, resp)
+        elif resp.status_code != 200:
             raise WSHTTPError('{0.status_code}: {0.reason}'.format(resp))
         ans = resp.json()
         self._controls_answer(ans)
             raise WSHTTPError('{0.status_code}: {0.reason}'.format(resp))
         ans = resp.json()
         self._controls_answer(ans)
+        SimaEch.ratelimit = resp.headers.get('x-ratelimit-remaining', None)
+        minrl = min(SimaEch.ratelimit, SimaEch.stats.get('minrl'))
+        SimaEch.stats.update(minrl=minrl)
         if self.cache:
             self.controller.cache_response(resp.request, resp)
         return ans
         if self.cache:
             self.controller.cache_response(resp.request, resp)
         return ans
@@ -129,10 +134,9 @@ class SimaEch:
         """
         payload = self._forge_payload(artist)
         # Construct URL
         """
         payload = self._forge_payload(artist)
         # Construct URL
-        self._ressource = '{0}/artist/similar'.format(SimaEch.root_url)
-        ans = self._fetch(payload)
+        ressource = '{0}/artist/similar'.format(SimaEch.root_url)
+        ans = self._fetch(ressource, payload)
         for art in ans.get('response').get('artists'):
         for art in ans.get('response').get('artists'):
-            artist = {}
             mbid = None
             if 'foreign_ids' in art:
                 for frgnid in art.get('foreign_ids'):
             mbid = None
             if 'foreign_ids' in art:
                 for frgnid in art.get('foreign_ids'):
@@ -146,10 +150,10 @@ class SimaEch:
         """
         payload = self._forge_payload(artist, top=True)
         # Construct URL
         """
         payload = self._forge_payload(artist, top=True)
         # Construct URL
-        self._ressource = '{0}/song/search'.format(SimaEch.root_url)
-        ans = self._fetch(payload)
+        ressource = '{0}/song/search'.format(SimaEch.root_url)
+        ans = self._fetch(ressource, payload)
         titles = list()
         titles = list()
-        artist = {
+        art = {
                 'artist': artist.name,
                 'musicbrainz_artistid': artist.mbid,
                 }
                 'artist': artist.name,
                 'musicbrainz_artistid': artist.mbid,
                 }
@@ -157,7 +161,7 @@ class SimaEch:
             title = song.get('title')
             if title not in titles:
                 titles.append(title)
             title = song.get('title')
             if title not in titles:
                 titles.append(title)
-                yield Track(title=title, **artist)
+                yield Track(title=title, **art)
 
 
 # VIM MODLINE
 
 
 # VIM MODLINE