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.playlists.v1.misc import set_playlists_names from server.schemas.playlists.v0.new_music_friday import PlaylistsNMFTrack, PlaylistsSummaryNMF from server.utils.pagination import get_links from server.utils.response import dump_response_schema router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/v1/playlists/summary/nmf/") @docs(tags=["playlists", "nmf"], summary="Get NMF available dates and playlists.") @dump_response_schema(PlaylistsSummaryNMF.Response) async def get_v1_playlists_summary_nmf(request: web.Request): available_dates, playlists, last_job_run = await asyncio.gather( *[ services.apollo.get_nmf_available_dates(), services.apollo.get_playlists_nmf(), services.apollo.get_value_by_key(key="nmf_job_run_ts"), ] ) await set_playlists_names(playlists, id_field="playlistId", name_field="name") latest_date = max(available_dates) return { "available_dates": available_dates, "playlists": playlists, "outdated_playlists": list( p for p in playlists if not p["fridayLastUpdatedDate"] or p["fridayLastUpdatedDate"] < latest_date ), "last_updated": last_job_run, } @router.get(BASE_API_PREFIX + "/v1/tracks/playlists/nmf/") @docs(tags=["track", "playlists", "nmf"], summary="Get tracks NMF playlists.") @querystring_schema(PlaylistsNMFTrack.Request) @dump_response_schema(PlaylistsNMFTrack.Response) async def get_v1_tracks_playlists_nmf(request: web.Request): params = request["querystring"] isrc, region, include, order_by = params["isrc"], params["region"], params["include"], params["order_by"] limit, offset = params["limit"], params["offset"] results = await services.apollo.get_tracks_playlists_nmf( isrc=isrc, region=region, include=include, order_by=order_by, limit=limit, offset=offset ) await set_playlists_names(results["items"], id_field="playlist_id", name_field="playlist_name") results.update(get_links(request, results["count"], offset, limit)) return results