from apollo_utils.core.constants.dsp import DSP from apollo_utils.core.utils.multikeysort import multikeysort from typing import Any, Dict, List, Optional from server.constants.playlists.delphi.by_api.track_positions_previous_playlists import \ TrackPositionsPreviousPlaylists, TrackPositionsPreviousPlaylistsApolloToDelphiProcessedFieldsSortByMapping from server.scenarios.playlists.by_track.previous.common import get_previous_playlists_by_track from server.utils.playlists.common.dates import get_min_added_date from server.utils.playlists.common.mappers import map_fields_by_dict_values async def get_previous_playlists_dsp_by_track_ago( dsp: DSP, isrc: str, markets_list: Optional[List[str]] = None, category_id: Optional[int] = None, search: Optional[str] = None, recent_removals_only: bool = True, order_by: Optional[List[str]] = None, ) -> Dict[str, List[Dict[str, Any]]]: """Get Previous Playlists By Track with Categories (AGO Scenario) Args: dsp: Playlist DSP filter. isrc: ISRC. markets_list: Playlist country code filter. category_id: Playlist category filter/ search: Search str part of text presented in playlist name. recent_removals_only: Bool value to filter playlists that track was recently removed order_by: Items order by provided on apollo side only Returns: Track in playlists, Categories { "items": List of previous track in playlist "categories": categories present in track in playlists items } """ result = await get_previous_playlists_by_track( dsp=dsp, isrc=isrc, country_code=markets_list, min_removed_date=get_min_added_date(recent_removals_only), playlist_owner_category_id=category_id, delphi_include=[ TrackPositionsPreviousPlaylists.INCLUDE.PLAYLISTS, TrackPositionsPreviousPlaylists.INCLUDE.PLAYLIST_DATES, TrackPositionsPreviousPlaylists.INCLUDE.DSP_SYNC_DATE_TIME, TrackPositionsPreviousPlaylists.INCLUDE.META_OWNER_CATEGORIES, ], playlist_name_contains=search, with_categories=True, ) items = multikeysort( result["items"], map_fields_by_dict_values(order_by, TrackPositionsPreviousPlaylistsApolloToDelphiProcessedFieldsSortByMapping), ) return {"items": items, "categories": result["categories"]}