from datetime import datetime, timedelta
from time import sleep
-from requests import get, Timeout, ConnectionError
+from requests import get, Request, Timeout, ConnectionError
from sima import ECH
from sima.lib.meta import Artist
return self.elem
+def purge_cache(age=4):
+ now = datetime.utcnow()
+ if now.hour == SimaEch.timestamp.hour:
+ return
+ SimaEch.timestamp = datetime.utcnow()
+ cache = SimaEch.cache
+ delta = timedelta(hours=age)
+ for url in list(cache.keys()):
+ timestamp = cache.get(url).created()
+ if now - timestamp > delta:
+ cache.pop(url)
+
+
class SimaEch():
"""
"""
root_url = 'http://{host}/api/{version}'.format(**ECH)
cache = {}
timestamp = datetime.utcnow()
+ ratelimit = None
def __init__(self, cache=True):
self.artist = None
self._ressource = None
self.current_element = None
self.caching = cache
- self.purge_cache()
+ purge_cache()
def _fetch(self, payload):
"""Use cached elements or proceed http request"""
self.current_element = SimaEch.cache.get(url).elem
return
try:
- self._fetch_lfm(payload)
+ self._fetch_ech(payload)
except Timeout:
raise EchoTimeout('Failed to reach server within {0}s'.format(
SOCKET_TIMEOUT))
raise EchoError(err)
@Throttle(WAIT_BETWEEN_REQUESTS)
- def _fetch_lfm(self, payload):
+ def _fetch_ech(self, payload):
"""fetch from web service"""
req = get(self._ressource, params=payload,
timeout=SOCKET_TIMEOUT)
- if 'x-ratelimit-remaining' in req.headers:
- logging.debug('x-ratelimit-remaining {x-ratelimit-remaining}'.format(**req.headers))
+ self.__class__.ratelimit = req.headers.get('x-ratelimit-remaining', None)
if req.status_code is not 200:
raise EchoHTTPError(req.status_code)
self.current_element = req.json()
payload.update(results=30)
return payload
- def purge_cache(self, age=4):
- now = datetime.utcnow()
- if now.hour == SimaEch.timestamp.hour:
- return
- SimaEch.timestamp = datetime.utcnow()
- cache = SimaEch.cache
- delta = timedelta(hours=age)
- for url in list(cache.keys()):
- timestamp = cache.get(url).created()
- if now - timestamp > delta:
- cache.pop(url)
-
def get_similar(self, artist=None):
"""
"""
artist = {}
mbid = None
if 'foreign_ids' in art:
- for frgnid in art.get('foreign_ids'):
- if frgnid.get('catalog') == 'musicbrainz':
- mbid = frgnid.get('foreign_id').lstrip('musicbrainz:artist:')
+ for frgnid in art.get('foreign_ids'):
+ if frgnid.get('catalog') == 'musicbrainz':
+ mbid = frgnid.get('foreign_id'
+ ).lstrip('musicbrainz:artist:')
yield Artist(mbid=mbid, name=art.get('name'))