from time import time import allure from app.src.api.api_client import ApiClient from app.src.api.constants import APPLE, SPOTIFY from app.src.api.models.history_by_track import HistoryByTrackResponse from app.src.helpers.allure_helper import attach_response_info class GateApiClient(ApiClient): @allure.step("GET /gate-api/v1/playlists/spotify/") def get_playlists_spotify(self, *parameters, ignore_response_attaching=False): api_string = "/gate-api/v1/playlists/spotify/?" params_list = "&".join(parameters) resp = self.session.get(self.host_endpoint + api_string + params_list, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("GET /gate-api/playlists/amazon/") def get_playlists_amazon(self, *parameters, ignore_response_attaching=False): api_string = "/gate-api/playlists/amazon/?" params_list = "&".join(parameters) resp = self.session.get(self.host_endpoint + api_string + params_list, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("GET /gate-api/v1/playlists/apple/info/") def get_playlists_apple(self, *parameters, ignore_response_attaching=False): api_string = "/gate-api/v1/playlists/apple/info/?" params_list = "&".join(parameters) resp = self.session.get(self.host_endpoint + api_string + params_list, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("GET /gate-api/playlists/spotify/streams-per-listener/") def get_playlists_spotify_streams_per_listener(self, playlist_id, *parameters, ignore_response_attaching=False): api_string = f"/gate-api/playlists/spotify/streams-per-listener/{playlist_id}/?" params_list = "&".join(parameters) resp = self.session.get(self.host_endpoint + api_string + params_list, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("GET /gate-api/v1/playlists/spotify/tracklist-graph/") def get_playlists_spotify_tracklist_graph(self, *parameters, ignore_response_attaching=False): api_string = "/gate-api/v1/playlists/spotify/tracklist-graph/?" params_list = "&".join(parameters) resp = self.session.get(self.host_endpoint + api_string + params_list, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("GET /gate-api/v1/playlists/apple/tracklist-graph/") def get_playlists_apple_tracklist_graph(self, *parameters, ignore_response_attaching=False): api_string = "/gate-api/v1/playlists/apple/tracklist-graph/?" params_list = "&".join(parameters) resp = self.session.get(self.host_endpoint + api_string + params_list, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("Getting history by track") def get_history_by_track( self, isrc, vendor, exclude_current_playlists="true", market=None, limit=None, recent_removals_only=None, order_by=None, offset=None, ): endpoint = { APPLE: "/gate-api/v3/playlists/apple/by-track/history/", SPOTIFY: "/gate-api/v3/playlists/spotify/by-track/history/", }[vendor] api_string = f"{self.host_endpoint}{endpoint}" return HistoryByTrackResponse( **self.session.get( api_string, params=dict( isrc=isrc, exclude_current_playlists=exclude_current_playlists, recent_removals_only=recent_removals_only, order_by=order_by, limit=limit, market=market, offset=offset, timestamp=int(time() * 1000), ), ).json() ) @allure.step("Getting playlists by track") def get_playlists_by_track( self, isrc, vendor, limit=5, market=None, recent_adds_only=None, order_by=None, offset=None, streams_market=None, streams_type=None, start_date=None, end_date=None, keep_zero_streams=None, search=None ): endpoint = {APPLE: "/gate-api/v3/playlists/apple/by-track/", SPOTIFY: "/gate-api/v3/playlists/spotify/by-track/"}[vendor] api_str = f"{self.host_endpoint}{endpoint}" return HistoryByTrackResponse( **self.session.get( api_str, params=dict( isrc=isrc, limit=limit, market=market, offset=offset, streams_market=streams_market, start_date=start_date, end_date=end_date, recent_adds_only=recent_adds_only, order_by=order_by, keep_zero_streams=keep_zero_streams, streams_type=streams_type, search=search, timestamp=int(time() * 1000), ), ).json() ) @allure.step("Getting YouTube data") def get_youtube_data(self, *parameters, ignore_response_attaching=False): api_string = "/dsp-api/analytics/v1/youtube/videos?" params_list = "&".join(parameters) resp = self.session.get(self.host_endpoint + api_string + params_list, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("Getting list of available markets for the YouTube video") def get_list_of_available_markets_for_the_youtube_video(self, start_date, end_date, video_id, ignore_response_attaching=False): api_string = f"/gate-api/youtube/markets/?start_date={start_date}&video_id={video_id}&end_date={end_date}" resp = self.session.get(self.host_endpoint + api_string, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("Getting YouTube analytic performance") def get_youtube_analytic_performance(self, video_id, end_date, country_code, ignore_response_attaching=False): api_string = f"/dsp-api/analytics/v1/youtube/performance?video_id={video_id}&latest_date={end_date}&country_code={country_code}" resp = self.session.get(self.host_endpoint + api_string, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("Getting YouTube demo performance") def get_youtube_demographics_data(self, start_date, end_date, video_id, ignore_response_attaching=False): api_string = f"/dsp-api/analytics/v1/youtube/demographics?start_date={start_date}&video_id={video_id}&end_date={end_date}" resp = self.session.get(self.host_endpoint + api_string, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response["body"] @allure.step("Getting YouTube streams graph") def get_youtube_streams_graph(self, latest_date, video_id, country_code="_gl", ignore_response_attaching=False): api_string = f"/dsp-api/analytics/v1/youtube/streams-graph?video_id={video_id}&latest_date={latest_date}&country_code={country_code}" resp = self.session.get(self.host_endpoint + api_string, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response["body"] @allure.step("Getting YouTube top markets") def get_youtube_top_markets(self, video_id, start_date, end_date, limit, ignore_response_attaching=False): api_string = f"/dsp-api/analytics/v1/youtube/top-markets?video_id={video_id}&include=percentage&" f"start_date={start_date}&end_date={end_date}&limit={limit}&keep_zero_streams=false" resp = self.session.get(self.host_endpoint + api_string, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response["body"] @allure.step("GET /dsp-api/analytics/v1/tiktok/markets?") def get_all_available_markets_tiktok(self, isrc, ignore_response_attaching=False): api_string = f"/gate-api/tiktok/markets/?isrc={isrc}" resp = self.session.get(self.host_endpoint + api_string, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response["body"]["items"] @allure.step("GET /gate-api/playlists/markets/{vendor}/") def get_markets_for_playlist(self, vendor, playlist_id, ignore_response_attaching=False): api_string = f"/gate-api/playlists/markets/{vendor}/?playlist_id={playlist_id}" resp = self.session.get(self.host_endpoint + api_string, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response @allure.step("GET /gate-api/playlists/nmf/track/") def get_tracks_nmf_playlists(self, isrc, ignore_response_attaching=False): api_string = f"/gate-api/playlists/nmf/track/?isrc={isrc}" resp = self.session.get(self.host_endpoint + api_string, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response["body"]["items"] @allure.step("GET /gate-api/v1/playlists/search/") def get_playlists_search(self, query, vendor, limit=50, ignore_response_attaching=False): api_string = "/gate-api/v1/playlists/search/" resp = self.session.get(self.host_endpoint + api_string, params=dict(query=query, limit=limit, vendor=vendor), timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response["body"]["items"] @allure.step("GET /gate-api/distributors/check/") def make_distributors_check(self, dsp, track_id, country_code="_gl", distributors=["sme", "theorchard", "awal"], ignore_response_attaching=False): distributors = "&".join([f'distributors={d}' for d in distributors]) api_string = f"/gate-api/distributors/check/?track_id={dsp}_{track_id}&country_code={country_code}&" + distributors resp = self.session.get(self.host_endpoint + api_string, timeout=self.timeout) response = {"status_code": resp.status_code, "body": resp.json()} attach_response_info(resp, ignore_response_attaching) return response["body"][0]