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 LAST_WEEK_START_DAYS, PREVIOUS_WEEK_START_DAYS from server.utils.tracks import get_weekly_summary async def get_tracks_weekly_streams( dsp_list: List[str], isrc_list: List[str], end_date: date, country_code: str ) -> Tuple[Dict[str, int], Dict[str, int]]: """Get tracks two week streams sum. Args: dsp_list: DSP code list. isrc_list: Tracks ISRC list. end_date: Latest date. country_code: Streams country code. Returns: Current and previous week streams maps by ISRC. """ start_date = end_date - timedelta(days=PREVIOUS_WEEK_START_DAYS) week_start_date = end_date - timedelta(days=LAST_WEEK_START_DAYS) streams_list = await services.dsp.get_streams_isrc_chunks( isrc=isrc_list, start_date=start_date, end_date=end_date, dsp=dsp_list, country_code=country_code, group_by="date", ) last_streams_map, previous_streams_map = defaultdict(int), defaultdict(int) for item in streams_list: item_date, isrc = item.get("date"), item.get("isrc") if not item_date or not isrc: continue current_map = last_streams_map if date.fromisoformat(item_date) >= week_start_date else previous_streams_map current_map[isrc] += item.get("streams", 0) return last_streams_map, previous_streams_map async def get_tracks_weekly_streams_summary( dsp_list: List[str], isrc_list: List[str], end_date: date, country_code: str ) -> Dict[str, dict]: last_streams_map, previous_streams_map = await get_tracks_weekly_streams( dsp_list, isrc_list, end_date, country_code ) return get_weekly_summary(last_streams_map, previous_streams_map, prefix="streams")