import time from datetime import datetime, date from typing import List 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): """Send HTTP request to DSP endpoint.""" prepared_request = self.session.prepare_request(request) retry_counter = 0 while retry_counter < self._config.RETRY_COUNT: try: response = self.session.send(prepared_request, timeout=self._config.TIMEOUT) except (ConnectTimeout, ConnectionError, ReadTimeoutError, ReadTimeout,) as exp: self.logger.error(f'Connection error {exp}. Retry counter = {retry_counter}.') time.sleep(self._config.DELAY) retry_counter += 1 continue if response.status_code != 200: self.logger.warning(f'Failed with response status {response.status_code}. Skipped.') return return response.json() self.logger.warning(f'Max retry number exceeded.') def get_streams_latest_date(self): request = requests.Request("GET", f'{self.dsp_uri}/consumer_analytics/streams-latest-date') response_json = self._send_request(request) return datetime.strptime(response_json["date"], "%Y-%m-%d").date() def get_streams_per_country_bulk(self, isrc_list: List[str], vendor: str, start_date: date, end_date: date): data = { "isrc": isrc_list, "vendor": vendor, "start_date": start_date.isoformat(), "end_date": end_date.isoformat(), "_update_cache": True } url = f'{self.dsp_uri}/consumer_analytics/track-per-country-bulk' request = requests.Request("POST", url, json=data) return self._send_request(request) def get_streams_per_country_bulk_2( self, isrc_list: List[str], vendors: List[str], start_date: date, end_date: date): params = { "isrc": isrc_list, "start_date": start_date.isoformat(), "end_date": end_date.isoformat(), "vendors": vendors, "_update_cache": True } url = f"{self.dsp_uri}/analytics/v1/tracks-date-range-streams" request = requests.Request("GET", url, params=params) return self._send_request(request)