"""Spotify Charts API Wrapper module.""" from requests import Request from requests import Session from feed_ingestion.flows.spotify.spotify_api import SpotifyAPI class SpotifyChartsAPI(SpotifyAPI): """Wrapper class to abstract loading data from Spotify API.""" _resource_charts_url_by_country = ( 'https://provider-api.spotify.com/{version}/analytics/spotifycharts/' '{chart_type}-{country}-{frequency}/{year}/{month}/{day}') def _prepare_chart_request( self, resource_name, date, version, country, frequency, chart_type): """Prepare Spotify API request to charts endpoint. Args: resource_name (str): Name of resource to request. date (date or str): date instance or `YYYY-MM-DD` formatted string. version (str): API version. country (str): Country code argument. frequency (str): Frequency of chart (e.g. daily, weekly). chart_type (str): Chart type (e.g. regional, viral). Returns: PreparedRequest: Prepared Request. """ year, month, day = self._parse_date(date) req = Request('GET', self._resource_charts_url_by_country.format( licensor_name=self.licensor_name, version=version, resource_name=resource_name, year=year, month=month, day=day, country=country, frequency=frequency, chart_type=chart_type, token=self.token), headers=self._get_auth_header_for_request()) return req.prepare() def _request_charts_to_file(self, fd, resource_name, date, version, country, frequency, chart_type): """Request data from Spotify API and write raw gzipped response to fd. Args: fd (file): File object or writable buffer. resource_name (str): Name of resource to request. date (date or str): date instance or `YYYY-MM-DD` formatted string. version (str): API version. country (str): Country code argument. frequency (str): Frequency of chart (e.g. daily, weekly). chart_type (str): Chart type (e.g. regional, viral). """ req = self._prepare_chart_request( resource_name, date, version, country, frequency, chart_type) res = Session().send(req, stream=True) res.raise_for_status() for chunk in res.iter_content(chunk_size=1024*1024): fd.write(chunk) fd.flush() def get_charts_to_file(self, fd, date, country, frequency, chart_type): """Request Streams data and return json object. Args: fd (file): File object or writable buffer. date (date or str): date instance or `YYYY-MM-DD` formatted string. country (str): Country code argument. frequency (str): Frequency of chart (e.g. daily, weekly). chart_type (str): Chart type (e.g. regional, viral). Returns: list: List of JSON objects from Spotify response. """ return self._request_charts_to_file( fd, 'chart', date, self.version, country, frequency, chart_type)