"""Spotify Artist Model. Model representing spotify metadata. """ import base64 import requests from artist.config import secrets_manager_client from artist.constants import errors from artist.response import create_error_response from artist.response import Response SPOTIFY_CLIENT_ID = secrets_manager_client.get_cred('SPOTIFY_CLIENT_ID') SPOTIFY_SECRET_ID = secrets_manager_client.get_cred('SPOTIFY_SECRET_ID') def get_access_token(): """Obtain access token required by other Spotify API calls. Returns: str: Spotify access token. """ auth_token = base64.b64encode( '{}:{}'.format(SPOTIFY_CLIENT_ID, SPOTIFY_SECRET_ID).encode() ).decode() response_json = requests.post( 'https://accounts.spotify.com/api/token', data={'grant_type': 'client_credentials'}, headers={'Authorization': 'Basic {}'.format(auth_token)} ).json() return response_json.get('access_token') def search( query, search_type, market=None, limit=None, offset=None, include_external=None ): """Fetch a list of artists from Spotify. Args: query (str): Artist name. """ access_token = get_access_token() if access_token is None: return create_error_response( code=errors.VALIDATION_ERROR, status=401, message='Failed to authenticate with Spotify.' ) response = requests.get( 'https://api.spotify.com/v1/search', headers={'Authorization': 'Bearer {}'.format(access_token)}, params={ 'q': query, 'type': search_type, 'market': market, 'limit': limit, 'offset': offset, 'include_external': include_external } ) # Rate limited. if response.status_code == 429: return response response_json = response.json() response_json = response_json['artists'] del response_json['href'] return Response(message=response_json)