from typing import List, Union import requests from requests.exceptions import ConnectTimeout, ConnectionError, ReadTimeout from urllib3.exceptions import ReadTimeoutError class DigitalServiceProvider: def __init__(self, config, logger): self._config = config self._session = None self.logger = logger @property def session(self): """Session which is used for sending requests to the DSP API.""" if not self._session: self._session = requests.Session() self._session.headers.update({'Authorization': self._config.DSP_AUTH}) return self._session @property def dsp_uri(self): """Uri DSP schema.""" return f'https://{self._config.DSP_API_HOSTNAME}/api/' def _send_request(self, request, timeout=30) -> Union[List[dict], dict]: """Send HTTP request to DSP endpoint.""" prepared_request = self.session.prepare_request(request) try: response = self.session.get(prepared_request.url, timeout=timeout) except (ConnectTimeout, ConnectionError, ReadTimeoutError, ReadTimeout,): self.logger.error('Connection error', exc_info=True) return {} if response.status_code != 200: self.logger.warning(f'Response status {response.status_code}') return {} return response.json() def get_isrc_for_spotify_tracks(self, track_ids: list) -> List[str]: """Get isrc list for spotify tracks""" request = requests.Request('GET', f'{self.dsp_uri}spotify/tracks') request.params = [('ids', ','.join(track_ids))] response_json = self._send_request(request) return [track.get('external_ids', {}).get('isrc') for track in response_json.get('tracks', [])] def get_total_streams_by_isrc(self, isrc) -> dict: """Total streams data by isrc""" request = requests.Request('GET', f'{self.dsp_uri}consumer_analytics/total_streams_count') request.params = [('isrc', isrc)] response_json = self._send_request(request) return {isrc: response_json}