import datetime import logging from aiohttp import web from aiohttp_apispec import docs, querystring_schema from apollo_utils.core.utils.multikeysort import multikeysort from apollo_utils.service.clients.aiohttp.utils.response import dump_response_schema from dateutil.relativedelta import relativedelta from typing import Dict, List from server.constants import BASE_API_PREFIX, DSP, cache_keys from server.constants.tracks import TrackPlaylistsAmazonOrderMap from server.schemas.playlists.amazon.by_track import PlaylistsAmazonByTrack from server.utils.pagination import paginate from server.utils.playlists.v0.common import get_playlists_data logger = logging.getLogger("app") router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/playlists/amazon/by-track/") @docs(tags=["amazon", "playlists"], summary="Get current amazon playlists by track") @querystring_schema(PlaylistsAmazonByTrack.Request) @dump_response_schema(PlaylistsAmazonByTrack.Response) @paginate(cache_keys.AMAZON_TRACK_PLAYLISTS, response_kwargs=True) async def get_amazon_by_track(request: web.Request) -> [List, Dict]: params = request["querystring"] search, recent_adds_only = ( params["search"], params["recent_adds_only"], ) playlists, result_streams_type = await get_playlists_data( dsp=DSP.AMAZON, isrc=params["isrc"], streams_type=params["streams_type"], markets_list=params["markets_list"], start_date=params.get("start_date"), end_date=params.get("end_date"), keep_zero_streams=params["keep_zero_streams"], ) final_result = [] week_ago_date = datetime.date.today() - relativedelta(days=6) for row in playlists: added_date = datetime.datetime.strptime(row["earliest_position_date"], "%Y-%m-%d").date() if recent_adds_only and added_date < week_ago_date: continue name = row["playlist"]["name"] if search and (not name or search.lower() not in name.lower()): continue row["id"] = [row["playlist"]["amazon_playlist_id"], row["playlist_id"].replace("amazon_", "")] row["playlist_id_int"] = int(row["playlist"]["dsp_playlist_id"]) final_result.append(row) order_by = [TrackPlaylistsAmazonOrderMap[order_item] for order_item in params.get("order_by")] final_result = multikeysort(final_result, order_by) return final_result, dict(streams_type=result_streams_type)