from aiohttp import web from aiohttp_apispec import docs, querystring_schema from apollo_utils.core.constants.dsp import DSP from datetime import date from dateutil import relativedelta from server.client.utils import str_to_date from server.constants import BASE_API_PREFIX from server.constants.market import isrc_to_country_code from server.constants.playlists.delphi.by_api.track_positions_playlists import TrackPositionsPlaylists from server.scenarios.playlists.tracks.common import get_playlist_tracklist from server.schemas.playlists.apple.tracklist_graph import V1PlaylistsAppleTracklistGraph from server.utils.response import dump_response_schema router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/v1/playlists/apple/tracklist-graph/") @docs( tags=["playlist", "apple"], summary="Get frontline and local tracks graphs.", ) @querystring_schema(V1PlaylistsAppleTracklistGraph.Request) @dump_response_schema(V1PlaylistsAppleTracklistGraph.Response, apply=True) async def get(request: web.Request) -> web.Response: params = request["querystring"] playlist_id, country_code = params["playlist_id"], params["country_code"].lower() date_30_month_ago = date.today() - relativedelta.relativedelta(months=30) track_list = await get_playlist_tracklist( dsp=DSP.APPLE, playlist_id=playlist_id, include_list=[TrackPositionsPlaylists.INCLUDE.TRACK_INFO], country_code_list=country_code, ) local_count, frontline_count = 0, 0 for item in track_list: isrc, track = item["isrc"], item["track"] if isrc_to_country_code(isrc) == country_code: local_count += 1 if not track: continue release_date = str_to_date(track.get("release_date") or track.get("album", {}).get("release_date")) if release_date and release_date >= date_30_month_ago: frontline_count += 1 return {"frontline_tracks": frontline_count, "local_tracks": local_count, "tracks_num": len(track_list)}