from collections import defaultdict from datetime import date, timedelta from typing import Dict, List, Tuple from server.client import services from server.constants.common import PREVIOUS_WEEK_START_DAYS from server.constants.tracks import TiktokAnalyticsBreakdowns, TracksTopMarketsTiktokInclude from server.utils.common import fill_skipped_ends_for_dates from server.utils.tracks import get_weekly_summary async def get_tracks_weekly_creations( isrc_list: List[str], end_date: date, country_code: str ) -> Tuple[Dict[str, int], Dict[str, int]]: """Get tracks two week creations sum. Args: isrc_list: Tracks ISRC list. end_date: Latest date. country_code: country code. Returns: Current and previous week creations maps by ISRC. """ start_date = end_date - timedelta(days=PREVIOUS_WEEK_START_DAYS) isrc_to_analytics = await services.dsp.get_tiktok_tracks_analytics( isrc=isrc_list, start_date=start_date, end_date=end_date, country_code=country_code, breakdowns=TiktokAnalyticsBreakdowns.DAILY.value, metrics=TracksTopMarketsTiktokInclude.CREATIONS.value, related_isrcs=True, combine_isrc=False, ) last_streams_map, previous_streams_map = defaultdict(int), defaultdict(int) for isrc, item in isrc_to_analytics.items(): creations_list = item.get("breakdowns", {}).get("daily", {}).get("creations", []) if creations_list: response_dates = date.fromisoformat(item["min_date"]), date.fromisoformat(item["max_date"]) two_weeks_creations = fill_skipped_ends_for_dates( creations_list, (start_date, end_date), response_dates, default=0, nones_as_default=( None, "", ), ) last_week_sum, prev_week_sum = sum(two_weeks_creations[7:]), sum(two_weeks_creations[0:7]) else: last_week_sum, prev_week_sum = 0, 0 last_streams_map[isrc] = last_week_sum previous_streams_map[isrc] = prev_week_sum return last_streams_map, previous_streams_map async def get_tracks_weekly_creations_summary( isrc_list: List[str], end_date: date, country_code: str ) -> Dict[str, dict]: last_streams_map, previous_streams_map = await get_tracks_weekly_creations(isrc_list, end_date, country_code) return get_weekly_summary(last_streams_map, previous_streams_map, prefix="tt_creations")