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_playlists import TrackPositionsPlaylists from server.scenarios.playlists.by_track.extended.common import get_track_playlists_extended from server.scenarios.playlists.tracks.common import get_playlist_tracklist_v_3_1_v_3_2 from server.schemas.playlists.apple.tracks import V1PlaylistsAppleTracklist, V1PlaylistsAppleTracks, \ V1PlaylistsAppleTracksHistory from server.utils.pagination import paginate from server.utils.response import dump_response_schema router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/v1/playlists/apple/tracks/") @docs( tags=["playlists", "apple", "tracks"], summary="Get current Apple playlist's tracks.", ) @querystring_schema(V1PlaylistsAppleTracks.Request) @dump_response_schema(V1PlaylistsAppleTracks.Response, apply=False) async def get(request: web.Request) -> web.Response: params = request["querystring"] playlist_id, country_code = params["playlist_id"], params["country_code"] result = {"items": []} if country_code: result = await get_track_playlists_extended( dsp=DSP.APPLE, playlist_id=playlist_id, country_code=[country_code], streams_country_code=[country_code], delphi_include=[ TrackPositionsPlaylists.INCLUDE.TRACK_INFO, TrackPositionsPlaylists.INCLUDE.STREAMS_FOR_PERIOD, ], expand_isrc_by_track_positions=True, ) return V1PlaylistsAppleTracks.Response(context={"country_code": country_code}).dump({"tracklist": result["items"]}) @router.get(BASE_API_PREFIX + "/v1/playlists/apple/tracks/history/") @docs( tags=["playlists", "apple", "tracks"], summary="Get Apple playlist's tracks for chosen date.", ) @querystring_schema(V1PlaylistsAppleTracksHistory.Request) @dump_response_schema(V1PlaylistsAppleTracksHistory.Response, apply=False) async def get(request: web.Request) -> web.Response: params = request["querystring"] playlist_id, tracklist_date, country_code = params["playlist_id"], params["date"], params["country_code"] result = {"items": []} if country_code: result = await get_track_playlists_extended( dsp=DSP.APPLE, playlist_id=playlist_id, country_code=[country_code], streams_country_code=[country_code], start_date=tracklist_date, end_date=tracklist_date, delphi_include=[ TrackPositionsPlaylists.INCLUDE.PLAYLISTS, TrackPositionsPlaylists.INCLUDE.TRACK_INFO, TrackPositionsPlaylists.INCLUDE.STREAMS_FOR_PERIOD, ], expand_isrc_by_track_positions=True, is_sony_country_code=country_code, include_is_sony=True, include_audio_features=True, ) return V1PlaylistsAppleTracksHistory.Response(context={"country_code": country_code}).dump( {"tracklist": result["items"]} ) @router.get(BASE_API_PREFIX + "/v1/playlists/apple/tracklist/") @docs( tags=["playlists", "tracks", "apple"], summary="Get Track data in Apple playlist identified by passed isrc and playlist_id.", ) @querystring_schema(V1PlaylistsAppleTracklist.Request) @dump_response_schema(V1PlaylistsAppleTracklist.Response, apply=False) @paginate(cache_keys.V1_APPLE_PLAYLIST_TRACKLIST) async def get(request: web.Request) -> web.Response: return await get_playlist_tracklist_v_3_1_v_3_2( dsp=DSP.APPLE, schema=V1PlaylistsAppleTracklist.Response.TracklistItem, cache_key=cache_keys.V1_APPLE_PLAYLIST_TRACKLIST, **request["querystring"], )