from aiohttp import web from aiohttp_apispec import docs, querystring_schema from apollo_utils.core.utils.multikeysort import multikeysort from typing import List from server.constants import BASE_API_PREFIX, cache_keys from server.constants.tracks import TrackListAmazonOrderMap from server.scenarios.playlists.v0.amazon.tracks import _get_tracks_data as get_tracks_data from server.schemas.playlists.amazon.track import AmazonPlaylistTracklist from server.utils.glom import glom from server.utils.mappers.core.getters import getter from server.utils.pagination import paginate from server.utils.playlists.v0.spotify.misc import filter_playlist_tracklist from server.utils.response import dump_response_schema router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/playlists/amazon/tracklist/") @docs( tags=["playlist", "track", "amazon"], summary="Get Track data in Amazon playlist identified by passed isrc and playlist_id.", ) @querystring_schema(AmazonPlaylistTracklist.Request) @dump_response_schema(AmazonPlaylistTracklist.Response) @paginate(cache_keys.AMAZON_PLAYLIST_TRACKLIST) async def get(request: web.Request) -> List: params = request["querystring"] playlist_id, country_code = params["playlist_id"], params["market"] search, source_track_isrc = params["search"], params["source_track_isrc"] track_list, track_mapping, artist_mapping = await get_tracks_data( playlist_id=playlist_id, country_code=country_code ) for track in track_list: track["track_id"] = None track["name"] = glom(track, "amazon_track.name", default=None) isrc = track.get("isrc") gras_track = track.get("track") if isrc and isrc in track_mapping: apple_track_data = track_mapping[isrc] track["name"] = apple_track_data["attributes"]["name"] image_url_template = apple_track_data["attributes"]["artwork"]["url"] track["image_url"] = image_url_template.format(w=params["image_size"], h=params["image_size"]) track["artists"] = [ getter(i, "attributes.name", none_result="") for i in apple_track_data["relationships"]["artists"]["data"] ] track["track_id"] = apple_track_data["id"] elif gras_track: track["artists"] = ( [j.strip() for i in artist_mapping[isrc] for j in i["full_name"].split(",")] if artist_mapping.get(isrc) else [] ) track["name"] = gras_track["name"] if search: track_list = filter_playlist_tracklist(track_list, search, source_track_isrc) order_by = [TrackListAmazonOrderMap[order_item] for order_item in params.get("order_by")] final_result = multikeysort(track_list, order_by) return final_result