diff --git a/src/base_classes/sports.py b/src/base_classes/sports.py index e2bbbee2..bc630413 100644 --- a/src/base_classes/sports.py +++ b/src/base_classes/sports.py @@ -522,7 +522,8 @@ def _get_weeks_data(self) -> Optional[Dict]: """ try: # Fetch current week and next few days for immediate display - now = datetime.now(pytz.utc) + tz = pytz.timezone("EST") + now = datetime.now(tz) immediate_events = [] start_date = now + timedelta(weeks=-2) @@ -545,6 +546,29 @@ def _get_weeks_data(self) -> Optional[Dict]: def _custom_scorebug_layout(self, game: dict, draw_overlay: ImageDraw.ImageDraw): pass + def get_days_between_dates(self, start_date: datetime, end_date: datetime) -> list[datetime]: + """ + Generates a list of all days between two given dates, inclusive. + + Args: + start_date: The starting date (datetime.date object). + end_date: The ending date (datetime.date object). + + Returns: + A list of datetime.date objects representing each day in the range. + """ + if start_date > end_date: + # Handle cases where the start date is after the end date + # You might raise an error, return an empty list, or swap them + # For this example, we'll return an empty list. + return [] + + days_list = [] + current_date = start_date + while current_date <= end_date: + days_list.append(current_date) + current_date += timedelta(days=1) + return days_list class SportsUpcoming(SportsCore): def __init__(self, config: Dict[str, Any], display_manager: DisplayManager, cache_manager: CacheManager, logger: logging.Logger, sport_key: str): super().__init__(config, display_manager, cache_manager, logger, sport_key) diff --git a/src/ncaam_basketball_managers.py b/src/ncaam_basketball_managers.py index 45d4a953..730d66e5 100644 --- a/src/ncaam_basketball_managers.py +++ b/src/ncaam_basketball_managers.py @@ -1,5 +1,6 @@ +import itertools import logging -from datetime import datetime +from datetime import datetime, timedelta, timezone from pathlib import Path from typing import Any, Dict, Optional @@ -65,6 +66,67 @@ def __init__( ) self.league = "mens-college-basketball" + def _get_events(self, start_date: datetime, end_date: datetime) -> Optional[Dict]: + """ + Get partial data for immediate display while background fetch is in progress. + This fetches current/recent games only for quick response. + """ + events = [] + for group, date in list( + itertools.product( + [50, 51], self.get_days_between_dates(start_date, end_date) + ) + ): + try: + # Fetch todays games only + url = f"https://site.api.espn.com/apis/site/v2/sports/{self.sport}/{self.league}/scoreboard" + print(date) + print(group) + response = self.session.get( + url, + params={ + "date": date.strftime("%Y%m%d"), + "limit": 1000, + "groups": group, + }, + headers=self.headers, + timeout=10, + ) + response.raise_for_status() + data = response.json() + events.extend(data.get("events", [])) + print(len(events)) + except requests.exceptions.RequestException as e: + self.logger.error( + f"API error fetching todays games for {self.sport} - {self.league}: {e}" + ) + return None + self.logger.info( + f"Fetched {len(events)} todays games for {self.sport} - {self.league}" + ) + print(len(events)) + return {"events": events} + + def _get_weeks_data(self) -> Optional[Dict]: + """ + Get partial data for immediate display while background fetch is in progress. + This fetches current/recent games only for quick response. + """ + tz = pytz.timezone("EST") + now = datetime.now(tz) + start_date = now + timedelta(weeks=-2) + end_date = now + timedelta(weeks=1) + return self._get_events(start_date, end_date) + + def _fetch_todays_games(self) -> Dict | None: + """Fetch only today's games for live updates (not entire season).""" + tz = pytz.timezone("EST") + now = datetime.now(tz) + yesterday = now - timedelta(days=1) + data = self._get_events(yesterday, now) + # print(data) + return data + def _fetch_ncaam_basketball_api_data( self, use_cache: bool = True ) -> Optional[Dict]: