from aiohttp import web from aiohttp_apispec import docs, querystring_schema from server.constants import BASE_API_PREFIX, DSP, cache_keys from server.constants.playlists.delphi.by_api.track_positions_previous_playlists import TrackPositionsPreviousPlaylists from server.constants.playlists.delphi.core.include import StreamsForPeriod from server.scenarios.playlists.by_track.previous.ago.common import get_previous_playlists_dsp_by_track_ago from server.scenarios.playlists.by_track.previous.common import get_previous_playlists_by_track from server.schemas.playlists.spotify.by_track_history import V1PlaylistSpotifyByTrackHistory, \ V3PlaylistSpotifyByTrackHistory from server.utils.pagination import paginate from server.utils.response import dump_response_schema router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/v1/playlists/spotify/by-track/history/") @docs( tags=["playlist", "spotify", "history"], summary="(AP) Get spotify historical playlists identified by passed ISRC.", ) @querystring_schema(V1PlaylistSpotifyByTrackHistory.Request) @dump_response_schema(V1PlaylistSpotifyByTrackHistory.Response, apply=False) @paginate(cache_keys.V1_PLAYLISTS_SPOTIFY_BY_TRACK_HISTORY, extend_original_dict=True) async def get(request: web.Request) -> web.Response: params = request["querystring"] streams_country_code = params.get("streams_country_code") result = await get_previous_playlists_by_track( dsp=DSP.SPOTIFY, isrc=params["isrc_list"], country_code=params["market"], delphi_include=( [TrackPositionsPreviousPlaylists.INCLUDE.PLAYLISTS] + ( [TrackPositionsPreviousPlaylists.INCLUDE.STREAMS_FOR_PERIOD] if StreamsForPeriod.STREAMS_FOR_PERIOD in params["include_list"] else [] ) ), sort_by=[TrackPositionsPreviousPlaylists.SORT_BY.REMOVED_DATE_TIME], sort_order=[TrackPositionsPreviousPlaylists.SORT_ORDER.DESC], streams_country_code=[ TrackPositionsPreviousPlaylists.STREAMS_COUNTRY_CODE.WORLDWIDE.value, streams_country_code, ] if streams_country_code else None, ) return V1PlaylistSpotifyByTrackHistory.Response( context={ "local_streams_key": streams_country_code or TrackPositionsPreviousPlaylists.STREAMS_COUNTRY_CODE.LOCAL.value } ).dump(dict(items=result["items"], categories=result["categories"])) @router.get(BASE_API_PREFIX + "/v3/playlists/spotify/by-track/history/") @docs( tags=["playlist", "spotify", "history"], summary="Get spotify historical playlists by passed isrc. (v3)", ) @querystring_schema(V3PlaylistSpotifyByTrackHistory.Request) @dump_response_schema(V3PlaylistSpotifyByTrackHistory.Response) @paginate(cache_keys.V3_PLAYLISTS_SPOTIFY_BY_TRACK_HISTORY, response_kwargs=True) async def get(request: web.Request) -> web.Response: params = request["querystring"] result = await get_previous_playlists_dsp_by_track_ago(dsp=DSP.SPOTIFY, **params) return result["items"], dict(categories=result["categories"])