from apollo_utils.core.constants.dsp import DSP from apollo_utils.core.constants.market import Market from datetime import date, timedelta from typing import Optional from server.client import services from server.utils.mappers.misc import format_id async def get_playlists_names(playlist_id_list: list[str], dsp_prefix: Optional[DSP] = DSP.SPOTIFY) -> dict[str, str]: """Get playlist ID to name mapping. Args: playlist_id_list: Playlist ID list. dsp_prefix: ID DSP prefix. Returns: Playlist ID to name mapping. """ if dsp_prefix: playlist_id_list = [f"{dsp_prefix.value}_{i}" for i in playlist_id_list] result = await services.dsp.get_public_playlists(playlist_id=playlist_id_list) return {format_id(i.get("playlist_id"), remove_prefix=True): i.get("name") for i in result} async def set_playlists_names( playlist_list: list[dict], dsp_prefix: Optional[DSP] = DSP.SPOTIFY, id_field: str = "playlistId", name_field: str = "name", dest_playlist_list: list[dict] = None, ): """Set playlist names to playlist data collection. Args: playlist_list: Playlists data. dsp_prefix: ID DSP prefix. id_field: Playlist ID field name. name_field: Playlist name field name. dest_playlist_list: Playlist to set data to (playlist_list is used if None). """ if not playlist_list: return {} id_name_map = await get_playlists_names([i[id_field] for i in playlist_list], dsp_prefix=dsp_prefix) for item in dest_playlist_list or playlist_list: item[name_field] = id_name_map.get(item[id_field]) async def get_playlists_streams( dsp: DSP, playlist_id_list: list[str], country_code: str, latest_streams_date: Optional[date] = None, period: int = 6, ) -> dict[str, int]: """Get playlist ID to streams count mapping. Args: dsp: DSP. playlist_id_list: Playlist ID list. country_code: Country code. latest_streams_date: The latest streams date. period: Latest N days (default 6 - the last week). Returns: Playlist ID to streams mapping. """ if latest_streams_date is None: latest_streams_date = services.dsp.get_latest_streams_date(dsp) result = await services.dsp.get_streams( start_date=latest_streams_date - timedelta(days=period), end_date=latest_streams_date, country_code=Market.convert_global(country_code, Market.WORLDWIDE), dsp=dsp.value, playlist_id=[f"{dsp.value}_{i}" for i in playlist_id_list], subset="playlists", ) return {format_id(i.get("playlist_id"), remove_prefix=True): i.get("streams", 0) for i in result}