import datetime import logging import pandas import pytest from jsonbender import F as ApplyFunction from jsonbender import OptionalS from jsonbender import S as GetField from parameterized import parameterized from ui_automation_framework.utils import logger as cl import app.src.tests.decomission.api_init as api_init from app.src.tests.decomission.compare_helper import format_color, generate_provider, get_field_with_diff, merge_arrays, transform_json API = api_init.APIOverride() log = cl.Logger(logging.DEBUG) apollo_to_delphi_keys = { "trackUri": GetField("trackUri") >> ApplyFunction(lambda val: val.split(":")[-1]), "name": GetField("name"), "artistName": GetField("artistName"), "isrc": GetField("isrc"), "albumReleaseDate": GetField("albumReleaseDate"), "earliestAdded": GetField("earliestAdded") >> ApplyFunction(lambda val: "" if val is None else val[:10]), "position": GetField("position"), "positionChange": GetField("positionChange") >> ApplyFunction(lambda val: 0 if val in [None, ""] else val), "positionChangeDate": GetField("positionChangeDate") >> ApplyFunction(lambda val: "" if val is None else val[:10]), "globalStreams": OptionalS("globalStreams", default=0) >> ApplyFunction(lambda val: 0 if val is None else val), "marketStreams": OptionalS("marketStreams", default=0) >> ApplyFunction(lambda val: 0 if val is None else val), } delphi_to_delphi_keys = { "trackUri": GetField("spotify_track", "track_id") >> ApplyFunction(lambda val: "" if val is None else val), "name": GetField("spotify_track", "name"), "artistName": GetField("spotify_track", "artists") >> ApplyFunction(lambda val: ", ".join(v["name"] for v in val)), "isrc": GetField("isrc"), "albumReleaseDate": GetField("spotify_track", "album", "release_date"), "earliestAdded": GetField("earliest_position_date_time") >> ApplyFunction(lambda val: "" if val is None else val[:10]), "position": GetField("current") >> ApplyFunction(lambda val: int(val) + 1), "positionChange": GetField("trend_change_14_days") >> ApplyFunction(lambda val: 0 if val is None else val), "positionChangeDate": GetField("last_date_change_14_days"), "globalStreams": OptionalS("streaming_info", "worldwide", "7", "isrc_in_playlist", default=0) >> ApplyFunction(lambda val: 0 if val is None else val), "marketStreams": OptionalS("streaming_info", "us", "7", "isrc_in_playlist", default=0) >> ApplyFunction(lambda val: 0 if val is None else val), } def extend_tracklist_with_streams(tracklist_resp_main, playlist_id, market): # get required isrcs isrcs_main = [t["isrc"] for t in tracklist_resp_main] end_date = API.get_latest_date()["spotify"] end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d").date() start_date = end_date - datetime.timedelta(days=6) # get response with streams resp_streams = API.get_apollo_response(streams_apollo_portal.format(playlist_id=playlist_id, start_date=start_date, end_date=end_date, isrcs="".join(f"isrc={isrc}&" for isrc in isrcs_main), market=market)) # get isrcs with streams isrcs_with_streams = [i["isrc"] for i in resp_streams if i["isrc"]] if len(isrcs_with_streams) > 0: for isrc in isrcs_main: if isrc not in isrcs_with_streams: resp_streams.append({"isrc": isrc, "globalStreams": 0, "marketStreams": 0}) for item_main, streams in zip(sorted(tracklist_resp_main, key=lambda x: x["isrc"]), sorted(resp_streams, key=lambda x: x["isrc"])): item_main.update({"globalStreams": streams["globalStreams"]}) item_main.update({"marketStreams": streams["marketStreams"]}) return tracklist_resp_main tracklist_apollo_portal_local = "/sonytracks/analyze?playlisturi=spotify%3Aplaylist%3A{id}®ion={market}" streams_apollo_portal = "/spotify-consumer-analytics-compat/tracks-in-playlist-summary-2?{isrcs}playlistId={playlist_id}&startDate={start_date}&endDate={end_date}&countryCode={market}" tracklist_delphi = "/v3/public/track-positions/playlists/current-tracklist?playlist_id=spotify_{id}&dsp=spotify&streams_country_code=worldwide&streams_country_code={market}&include=track_info,streams_for_period" @parameterized.expand( [ # ('37i9dQZF1DXcBWIGoYBM5M', 'global'), # ('65LdqYCLcsV0lJoxpeQ6fW', 'au'), # # ('004Rf6OJOXidB5IK50Kt0b', 'us'), # ("37i9dQZF1DWX7rdRjOECPW", "us"), # ("37i9dQZEVXbJ9SRaVj0yDF", "us"), # # ('37i9dQZF1DXcBWIGoYBM5M', 'us'), # ('37i9dQZF1DXcBWIGoYBM5M', 'global'), # ('37i9dQZF1DX3rxVfibe1L0', 'us'), # ('37i9dQZF1DX3rxVfibe1L0', 'global'), # ("5H765bjiGWNovpZbfPeM3o", "us"), # ('5H765bjiGWNovpZbfPeM3o', 'global'), # ('37i9dQZF1DWT2SPAYawYcO', 'au') # ("37i9dQZF1DXcBWIGoYBM5M", "us"), done # ("37i9dQZF1DX3rxVfibe1L0", "au"), done # ("37i9dQZEVXbMDoHDwVN2tF", "global"), done ("061xZeYgr9dCCYh2MWovDs", "global"), # ("11X76c5MphTG1VgKmC7hgb", "us"), # ("4KAGibGen0mZKjPN327tCK", "global"), ] ) @pytest.mark.skip() def test_curr_tracklist(playlist_id, market): apollo_response_without_streams = API.get_apollo_response(tracklist_apollo_portal_local.format(id=playlist_id, market=market))["tracks"] delphi_response = API.get_delphi_response(tracklist_delphi.format(id=playlist_id, market=market))["items"] apollo_response = extend_tracklist_with_streams(apollo_response_without_streams, playlist_id, market) apollo_transformed_response = transform_json(apollo_to_delphi_keys, apollo_response) delphi_transformed_response = transform_json(delphi_to_delphi_keys, delphi_response) aggregated_matrix = merge_arrays(apollo_transformed_response, delphi_transformed_response, "isrc") index_for_all_fields = list(range(1, len(generate_provider(aggregated_matrix)) + 1)) subset_to_mark = range(3, len(aggregated_matrix) * 5, 5) pandas.DataFrame( { "provider": generate_provider(aggregated_matrix), "trackUri": get_field_with_diff("trackUri", aggregated_matrix), "name": get_field_with_diff("name", aggregated_matrix), "artistName": get_field_with_diff("artistName", aggregated_matrix), "isrc": get_field_with_diff("isrc", aggregated_matrix), "albumReleaseDate": get_field_with_diff("albumReleaseDate", aggregated_matrix), "earliestAdded": get_field_with_diff("earliestAdded", aggregated_matrix), "position": get_field_with_diff("position", aggregated_matrix), "positionChange": get_field_with_diff("positionChange", aggregated_matrix), "positionChangeDate": get_field_with_diff("positionChangeDate", aggregated_matrix), "globalStreams": get_field_with_diff("globalStreams", aggregated_matrix), "marketStreams": get_field_with_diff("marketStreams", aggregated_matrix), }, index=index_for_all_fields, ).style.apply(format_color, subset=(subset_to_mark, slice(None))).to_excel(f"decomission/spotify_playlist_curr_tracklist/{playlist_id}_{market.upper()}_spotify_playlist_curr_tracklist_total_{len(apollo_transformed_response)}_delphi_count_{len(delphi_transformed_response)}.xlsx")