import asyncio from collections import defaultdict from typing import Dict, List, Optional from server.client import services from server.constants import DSP from server.domains.playlists.v1.misc import get_playlists_names, get_playlists_streams from server.utils.playlists.v0.common import get_dsp_playlists_images, get_playlists_previous_top_response async def get_playlists_dsp_previous_top( dsp: DSP, track_ids: List, market: str, limit: int, period: int, image_size: Optional[int] = None, ) -> Dict: tracks_mapped = await services.apollo.get_tracks(vendor=dsp.value, track_ids=track_ids) isrc_to_track_id = {track["isrc"]: track["id"] for track in tracks_mapped.values()} track_first_dates = await services.dsp.get_track_first_stream_date( isrc=list(isrc_to_track_id.keys()), vendor=dsp.value ) if not track_first_dates: return {"playlists": []} track_first_dates_parsed = {k: v for k, v in track_first_dates.items()} history_data, latest_streams_date = await asyncio.gather( *[ services.apollo.get_playlists_previous_top_dates( dsp, tracks_isrc=track_first_dates_parsed, market=market, period=period ), services.dsp.get_latest_streams_date(dsp), ] ) history_mapping = defaultdict(lambda: defaultdict(list)) for item in history_data: history_mapping[item["playlist_id"]][isrc_to_track_id[item["isrc"]]].append( [item["entry_date"], item["exit_date"]] ) playlist_id_list = list(history_mapping.keys()) id_to_name_map, streams_map, playlist_images_data = await asyncio.gather( *[ get_playlists_names(playlist_id_list, dsp), get_playlists_streams(dsp, playlist_id_list, market, latest_streams_date), get_dsp_playlists_images( playlist_ids=list(history_mapping.keys()), dsp=dsp, market=market, image_size=image_size ), ] ) playlist_images_dict = {data["id"]: data.get("image_url") for data in playlist_images_data} return get_playlists_previous_top_response( dsp=dsp, history_mapping=history_mapping, id_to_name_map=id_to_name_map, streams_map=streams_map, tracks_mapping=tracks_mapped, playlist_id_to_image_url_map=playlist_images_dict, track_first_dates=track_first_dates, limit=limit, )