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.constants.youtube import YOUTUBE_MAX_MARKETS_LIMIT from server.schemas.youtube.markets import YoutubeMarkets, YoutubeTopMarkets from server.utils.pagination import multikeysort from server.utils.response import dump_response_schema router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/youtube/markets/top/") @docs(tags=["youtube"], summary="Top markets for Youtube video.") @querystring_schema(YoutubeTopMarkets.Request) @dump_response_schema(YoutubeTopMarkets.Response) async def get(request: web.Request): params = request["querystring"] video_id, start_date, end_date, limit = ( params["video_id"], params["start_date"], params["end_date"], params["limit"], ) markets_data = await services.dsp.get_top_markets( start_date=start_date, end_date=end_date, video_id=video_id, limit=YOUTUBE_MAX_MARKETS_LIMIT ) total_views = sum([i["views"] for i in markets_data]) result_data = [] for item in markets_data: if item["views"] > 0: item["percentage"] = round(100 * item["views"] / total_views) result_data.append(item) result = multikeysort(result_data, ["-views", "market"])[:limit] return {"items": result} @router.get(BASE_API_PREFIX + "/youtube/markets/") @docs(tags=["youtube"], summary="Youtube video markets.") @querystring_schema(YoutubeMarkets.Request) @dump_response_schema(YoutubeMarkets.Response) async def get(request: web.Request): params = request["querystring"] video_id, start_date, end_date = ( params["video_id"], params["start_date"], params["end_date"], ) video_markets, apollo_markets = await asyncio.gather( services.dsp.get_top_markets( start_date=start_date, end_date=end_date, video_id=video_id, limit=YOUTUBE_MAX_MARKETS_LIMIT ), services.apollo.get_markets(extended=True), ) markets = [i["market"] for i in video_markets if i["views"] > 0] merged_markets = [i for i in apollo_markets if i["code"] in markets] items = sorted(merged_markets, key=lambda d: d["name"]) return {"items": items}