import asyncio from typing import Dict, List from server.client import services from server.constants import DSP from server.scenarios.tracks.get_tracks import get_tracks from server.utils.is_sony import check_tracks_is_sony from server.utils.tracks import get_track_id_artists_map, get_track_id_data_map, get_track_ids_by_dsp, \ get_visited_tracks_response async def get_dsp_visited_tracks(dsp: DSP, data: List[Dict], market: (str, None) = None) -> List[Dict]: """ Retrieve list of most visited tracks for a user by dsp. Args: dsp (DSP): data (List[Dict]): tracks and visits information for a user market: (str or None): Market value. Returns: List[Dict]: List with user most visited tracks. """ if not data: return [] tracks, artists, dsp_tracks, is_sony = [], [], {}, [] track_ids = get_track_ids_by_dsp(dsp=dsp, data=data) tasks = [ services.apollo.get_tracks(vendor=dsp.value, track_ids=track_ids), services.apollo.get_artists(vendor=dsp.value, track_ids=track_ids, market=market), get_tracks(track_ids=track_ids, dsp=dsp, market=market), ] if dsp == DSP.SPOTIFY: tasks.append(check_tracks_is_sony(track_id_list=track_ids, market=market)) tracks, artists, dsp_tracks, is_sony = await asyncio.gather(*tasks) elif dsp == DSP.APPLE: tracks_info, artists_info, dsp_tracks = await asyncio.gather(*tasks) else: raise NotImplementedError() # get mapped data from tracks data fot from dsp and artists data to generate response dsp_tracks, artists = get_track_id_data_map(dsp_tracks), get_track_id_artists_map(artists) response = await get_visited_tracks_response( dsp=dsp, data=data, tracks=tracks, dsp_tracks=dsp_tracks, artists=artists, is_sony=is_sony ) return response