import asyncio from aiohttp import web from aiohttp_apispec import docs, querystring_schema from server.client import services from server.constants import BASE_API_PREFIX from server.domains.artists.tracks import set_artist_tracks_streams from server.scenarios.artists.streams import get_artist_gras_id from server.scenarios.artists.tracks import get_artist_top_tracks from server.scenarios.tracks.get_tracks_weekly_streams import get_tracks_weekly_streams from server.schemas.artists.tracks import ArtistsTracks, ArtistsTracksTop from server.utils.response import dump_response_schema router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/artists/tracks/") @docs(tags=["artists", "tracks"], summary="Get tracks and streams by artist ID") @querystring_schema(ArtistsTracks.Request) @dump_response_schema(ArtistsTracks.Response, apply=False) async def get_artists_tracks(request: web.Request) -> web.Response: params = request["querystring"] country_code = params.get("country_code") result, end_date = await asyncio.gather( *[ services.filtr.get_trackplaylistadds( uri=params["artist_uri"], region=country_code, offset=params.get("offset"), limit=params.get("limit") ), services.dsp.get_streams_latest_date(), ] ) result_item_list = result.get("items", []) isrc_list = [i.get("spotifyTrack", {}).get("isrc") for i in result_item_list] last_streams_map, previous_streams_map = await get_tracks_weekly_streams( params["dsp_list"], isrc_list, end_date, country_code ) set_artist_tracks_streams(result_item_list, last_streams_map, previous_streams_map) return result @router.get(BASE_API_PREFIX + "/artists/tracks/top/") @docs(tags=["artists", "tracks", "streams"], summary="Get artist top tracks by streams.") @querystring_schema(ArtistsTracksTop.Request) @dump_response_schema(ArtistsTracksTop.Response) async def get(request: web.Request) -> web.Response: params = request["querystring"] gras_artist_id = await get_artist_gras_id(params.pop("spotify_artist_id")) result = [] if gras_artist_id: result = await get_artist_top_tracks(gras_artist_id, **params) return {"items": result}