import os from app.utils import generate_excel_file, get_friday, round_int QUERY = 'NMFSongsByDate' apollo_endpoint = "/gate-api/tracks/nmf/?date={}&distributors=sme%2Ctheorchard%2Cawal" friday = os.environ.get('FRIDAY', 'last') def test_nmf_by_date_query(graphql, api_apollo): total_fetched = 0 def get_variables(num): return { "date": get_friday(friday), "limit": 200, "offset": num, "selectedMarket": "" } response_insights_first = graphql.fetch_data(QUERY, get_variables(total_fetched)) insights_items = response_insights_first['newMusicFridayByDate']['entries']['entries'] insights_total = int(response_insights_first['newMusicFridayByDate']['entries']['total']) while total_fetched < insights_total: total_fetched +=200 response_insights_part = graphql.fetch_data(QUERY, get_variables(total_fetched)) insights_items += response_insights_part['newMusicFridayByDate']['entries']['entries'] isrc_insights = [item['isrc']['isrc'] for item in insights_items] response_apollo_all = api_apollo.get(apollo_endpoint.format(get_friday(friday))) response_apollo = response_apollo_all['items'] total_apollo = response_apollo_all['count'] isrc_apollo = [item['isrc'] for item in response_apollo] common_isrsc = list(set(isrc_apollo) & set(isrc_insights)) response_apollo = sorted([item for item in response_apollo if item['isrc'] in common_isrsc], key=lambda item: item['isrc']) insights_items = sorted([item for item in insights_items if item['isrc']['isrc'] in common_isrsc], key=lambda item: item['isrc']['isrc']) songs_insights = [item['trackName'] if item['trackName'] is not None else item['isrc']['globalSoundRecording']['name'] for item in insights_items] artists_insights = [item['artistName'] if item['artistName'] is not None else ', '.join(sorted(participant['name'] for participant in item['isrc']['globalSoundRecording']['globalParticipants'])) for item in insights_items] featuring_insights = [item['feature'] for item in insights_items] top10rank_insights = [item['top10Rank'] for item in insights_items] avg_position_insights = [item['averagePosition'] for item in insights_items] countries_insights_str = [', '.join(sorted(f"{placement['market']}-{placement['position']}" for placement in item['placements'])) for item in insights_items] songs_apollo = [item['trackName'] for item in response_apollo] artists_apollo = [', '.join(sorted(participant['name'] for participant in item['artists'])) for item in response_apollo] featuring_apollo = [sum(1 for playlist in item['playlists'] if playlist['position']) for item in response_apollo] top10rank_apollo = [item['topTenFeatureCount'] for item in response_apollo] avg_position_apollo = [round_int(sum(playlist['position'] for playlist in item['playlists'])/len(item['playlists'])) for item in response_apollo] countries_apollo_str = [', '.join(sorted(f"{playlist['countryCode'].upper()}-{playlist['position']}" for playlist in item['playlists'][:10])) for item in response_apollo] diff_songs = [0 if a.lower()[:4] == b.lower()[:4] else 1 for a, b in zip(songs_apollo, songs_insights)] diff_artists = [0 if a.lower()[:4] == b.lower()[:4] else 1 for a, b in zip(artists_apollo, artists_insights)] diff_featuring = [abs(int(b - a)) if a != 0 else None for a, b in zip(featuring_apollo, featuring_insights)] diff_top_rank = [abs(int(b - a)) if a != 0 else None for a, b in zip(top10rank_apollo, top10rank_insights)] diff_avg_position = [abs(int(b - a)) if a != 0 else None for a, b in zip(avg_position_apollo, avg_position_insights)] diff_countries = [0 if a == b else 1 for a, b in zip(countries_apollo_str, countries_insights_str)] diff_isrcs_list = list(set(isrc_apollo) - set(isrc_insights)) diff_isrcs = f'missing isrcs {len(diff_isrcs_list)} : ' + ','.join(diff_isrcs_list) data_dict = { "song_insights": [diff_isrcs] + songs_insights, "songs_apollo": ['']+songs_apollo, "change_songs": ['']+diff_songs, "artist_insights": ['']+artists_insights, "artists_apollo": ['']+artists_apollo, "change_artists": ['']+diff_artists, "featuring_insights": ['']+featuring_insights, "featuring_apollo": ['']+featuring_apollo, "change_featuring": ['']+diff_featuring, "top 10 rank_insights": ['']+top10rank_insights, "top 10 rank apollo": ['']+top10rank_apollo, "change_top_10": ['']+diff_top_rank, "avg position_insights": ['']+avg_position_insights, "avg_position_apollo": ['']+avg_position_apollo, "change_avg_position": ['']+diff_avg_position, "countries_insights": ['']+countries_insights_str, "countries_apollo": ['']+countries_apollo_str, "change_countries": ['']+diff_countries, } generate_excel_file(data_dict, QUERY, [get_friday(friday)])