change weather logging, changed odds api call to only pull odds for games we will see, expanded game fetch window to see more games on odds ticker (50days from 30).

This commit is contained in:
Chuck
2025-07-22 09:31:14 -05:00
parent 5f99cdeced
commit 4da2fd32e2
9 changed files with 64 additions and 57 deletions

View File

@@ -114,11 +114,12 @@
"max_games_per_league": 5, "max_games_per_league": 5,
"show_odds_only": false, "show_odds_only": false,
"sort_order": "soonest", "sort_order": "soonest",
"enabled_leagues": ["nfl","mlb", "ncaa_fb"], "enabled_leagues": ["nfl","mlb", "ncaa_fb", "milb"],
"update_interval": 3600, "update_interval": 3600,
"scroll_speed": 1, "scroll_speed": 1,
"scroll_delay": 0.01, "scroll_delay": 0.01,
"loop": true "loop": true,
"future_fetch_days": 50
}, },
"calendar": { "calendar": {
"enabled": true, "enabled": true,

View File

@@ -1122,21 +1122,17 @@ class MiLBUpcomingManager(BaseMiLBManager):
logger.info(f"[MiLB] Processing {len(games)} games for upcoming games...") logger.info(f"[MiLB] Processing {len(games)} games for upcoming games...")
for game_id, game in games.items(): for game_id, game in games.items():
# Only fetch odds for games that will be displayed
if self.milb_config.get("show_favorite_teams_only", False):
if not self.favorite_teams:
continue
if game['home_team'] not in self.favorite_teams and game['away_team'] not in self.favorite_teams:
continue
# Convert game time to UTC datetime # Convert game time to UTC datetime
game_time_str = game['start_time'].replace('Z', '+00:00') game_time_str = game['start_time'].replace('Z', '+00:00')
game_time = datetime.fromisoformat(game_time_str) game_time = datetime.fromisoformat(game_time_str)
if game_time.tzinfo is None: if game_time.tzinfo is None:
game_time = game_time.replace(tzinfo=timezone.utc) game_time = game_time.replace(tzinfo=timezone.utc)
# Check if this is a favorite team game
is_favorite_game = (game['home_team'] in self.favorite_teams or
game['away_team'] in self.favorite_teams)
if is_favorite_game:
logger.info(f"[MiLB] Checking favorite team game: {game['away_team']} @ {game['home_team']}")
logger.info(f"[MiLB] Game time (UTC): {game_time}")
logger.info(f"[MiLB] Game status: {game['status']}, State: {game['status_state']}")
# For upcoming games, we'll consider any game that: # For upcoming games, we'll consider any game that:
# 1. Is not final (not 'post' or 'final' state) # 1. Is not final (not 'post' or 'final' state)
# 2. Has a future start time # 2. Has a future start time
@@ -1144,8 +1140,9 @@ class MiLBUpcomingManager(BaseMiLBManager):
game['status_state'] not in ['post', 'final', 'completed'] and game['status_state'] not in ['post', 'final', 'completed'] and
game_time > datetime.now(timezone.utc) game_time > datetime.now(timezone.utc)
) )
if is_upcoming: if is_upcoming:
if self.show_odds:
self._fetch_odds(game)
new_upcoming_games.append(game) new_upcoming_games.append(game)
logger.info(f"[MiLB] Added favorite team game to upcoming list: {game['away_team']} @ {game['home_team']}") logger.info(f"[MiLB] Added favorite team game to upcoming list: {game['away_team']} @ {game['home_team']}")

View File

@@ -1236,32 +1236,24 @@ class MLBUpcomingManager(BaseMLBManager):
for game_id, game in games.items(): for game_id, game in games.items():
self.logger.debug(f"[MLB] Processing game {game_id} for upcoming games...") self.logger.debug(f"[MLB] Processing game {game_id} for upcoming games...")
# Check if this is a favorite team game first # Only fetch odds for games that will be displayed
if self.mlb_config.get("show_favorite_teams_only", False):
if not self.favorite_teams:
continue
if game['home_team'] not in self.favorite_teams and game['away_team'] not in self.favorite_teams:
continue
is_favorite_game = (game['home_team'] in self.favorite_teams or is_favorite_game = (game['home_team'] in self.favorite_teams or
game['away_team'] in self.favorite_teams) game['away_team'] in self.favorite_teams)
if not is_favorite_game:
self.logger.debug(f"[MLB] Skipping game {game_id} - not a favorite team.")
continue
game_time = datetime.fromisoformat(game['start_time'].replace('Z', '+00:00')) game_time = datetime.fromisoformat(game['start_time'].replace('Z', '+00:00'))
# Ensure game_time is timezone-aware (UTC)
if game_time.tzinfo is None: if game_time.tzinfo is None:
game_time = game_time.replace(tzinfo=timezone.utc) game_time = game_time.replace(tzinfo=timezone.utc)
self.logger.info(f"[MLB] Favorite team game found: {game['away_team']} @ {game['home_team']} at {game_time}") self.logger.info(f"[MLB] Favorite team game found: {game['away_team']} @ {game['home_team']} at {game_time}")
self.logger.info(f"[MLB] Game status: {game['status']}, State: {game['status_state']}") self.logger.info(f"[MLB] Game status: {game['status']}, State: {game['status_state']}")
# For upcoming games, we'll consider any game that:
# 1. Is not final (not 'post' or 'final' state)
# 2. Has a future start time
is_upcoming = ( is_upcoming = (
game['status_state'] not in ['post', 'final', 'completed'] and game['status_state'] not in ['post', 'final', 'completed'] and
game_time > datetime.now(timezone.utc) game_time > datetime.now(timezone.utc)
) )
self.logger.info(f"[MLB] Is upcoming: {is_upcoming}") self.logger.info(f"[MLB] Is upcoming: {is_upcoming}")
if is_upcoming: if is_upcoming:
self.logger.info(f"[MLB] Adding game {game_id} to upcoming games list.") self.logger.info(f"[MLB] Adding game {game_id} to upcoming games list.")
self._fetch_odds(game) self._fetch_odds(game)

View File

@@ -748,14 +748,15 @@ class NBALiveManager(BaseNBAManager):
for event in data["events"]: for event in data["events"]:
details = self._extract_game_details(event) details = self._extract_game_details(event)
if details and details["is_live"]: if details and details["is_live"]:
if not self.favorite_teams or ( # Only fetch odds for games that will be displayed
details["home_abbr"] in self.favorite_teams or if self.nba_config.get("show_favorite_teams_only", False):
details["away_abbr"] in self.favorite_teams if not self.favorite_teams:
): continue
# Fetch odds if enabled if details["home_abbr"] not in self.favorite_teams and details["away_abbr"] not in self.favorite_teams:
if self.show_odds: continue
self._fetch_odds(details) if self.show_odds:
new_live_games.append(details) self._fetch_odds(details)
new_live_games.append(details)
# Update game list and current game # Update game list and current game
if new_live_games: if new_live_games:

View File

@@ -1195,11 +1195,19 @@ class NCAAFBUpcomingManager(BaseNCAAFBManager): # Renamed class
game = self._extract_game_details(event) game = self._extract_game_details(event)
# Filter criteria: must be upcoming ('pre' state) # Filter criteria: must be upcoming ('pre' state)
if game and game['is_upcoming']: if game and game['is_upcoming']:
processed_games.append(game) # Only fetch odds for games that will be displayed
# Count favorite team games for logging if self.ncaa_fb_config.get("show_favorite_teams_only", False):
if (game['home_abbr'] in self.favorite_teams or if not self.favorite_teams:
game['away_abbr'] in self.favorite_teams): continue
favorite_games_found += 1 if game['home_abbr'] not in self.favorite_teams and game['away_abbr'] not in self.favorite_teams:
continue
processed_games.append(game)
# Count favorite team games for logging
if (game['home_abbr'] in self.favorite_teams or
game['away_abbr'] in self.favorite_teams):
favorite_games_found += 1
if self.show_odds:
self._fetch_odds(game)
# Summary logging instead of verbose debug # Summary logging instead of verbose debug
self.logger.info(f"[NCAAFB Upcoming] Found {len(processed_games)} total upcoming games") self.logger.info(f"[NCAAFB Upcoming] Found {len(processed_games)} total upcoming games")

View File

@@ -1085,10 +1085,15 @@ class NFLUpcomingManager(BaseNFLManager): # Renamed class
game = self._extract_game_details(event) game = self._extract_game_details(event)
# Filter criteria: must be upcoming ('pre' state) # Filter criteria: must be upcoming ('pre' state)
if game and game['is_upcoming']: if game and game['is_upcoming']:
# Fetch odds if enabled # Only fetch odds for games that will be displayed
if self.show_odds: if self.nfl_config.get("show_favorite_teams_only", False):
self._fetch_odds(game) if not self.favorite_teams:
processed_games.append(game) continue
if game['home_abbr'] not in self.favorite_teams and game['away_abbr'] not in self.favorite_teams:
continue
if self.show_odds:
self._fetch_odds(game)
processed_games.append(game)
# Debug logging to see what games we have # Debug logging to see what games we have
self.logger.debug(f"[NFL Upcoming] Processed {len(processed_games)} upcoming games") self.logger.debug(f"[NFL Upcoming] Processed {len(processed_games)} upcoming games")

View File

@@ -871,9 +871,13 @@ class NHLUpcomingManager(BaseNHLManager):
self.logger.debug(f"[NHL] Processing game: {game['away_abbr']} vs {game['home_abbr']}") self.logger.debug(f"[NHL] Processing game: {game['away_abbr']} vs {game['home_abbr']}")
self.logger.debug(f"[NHL] Game status: is_final={game['is_final']}, is_upcoming={game['is_upcoming']}, is_within_window={game['is_within_window']}") self.logger.debug(f"[NHL] Game status: is_final={game['is_final']}, is_upcoming={game['is_upcoming']}, is_within_window={game['is_within_window']}")
self.logger.debug(f"[NHL] Game time: {game['start_time_utc']}") self.logger.debug(f"[NHL] Game time: {game['start_time_utc']}")
# Only fetch odds for games that will be displayed
if self.nhl_config.get("show_favorite_teams_only", False):
if not self.favorite_teams:
continue
if game['home_abbr'] not in self.favorite_teams and game['away_abbr'] not in self.favorite_teams:
continue
if not game['is_final'] and game['is_within_window']: if not game['is_final'] and game['is_within_window']:
# Fetch odds if enabled
if self.show_odds: if self.show_odds:
self._fetch_odds(game) self._fetch_odds(game)
new_upcoming_games.append(game) new_upcoming_games.append(game)

View File

@@ -259,12 +259,9 @@ class OddsTickerManager:
away_abbr = away_team['team']['abbreviation'] away_abbr = away_team['team']['abbreviation']
# Only process favorite teams if enabled # Only process favorite teams if enabled
if self.show_favorite_teams_only: if self.show_favorite_teams_only:
# Skip if both teams have already met their quota if not favorite_teams:
for team in [home_abbr, away_abbr]: continue
if team in team_games_found and team_games_found[team] >= max_games: if home_abbr not in favorite_teams and away_abbr not in favorite_teams:
continue
# Only add if at least one team still needs games
if not ((home_abbr in team_games_found and team_games_found[home_abbr] < max_games) or (away_abbr in team_games_found and team_games_found[away_abbr] < max_games)):
continue continue
# Build game dict (existing logic) # Build game dict (existing logic)
home_record = home_team.get('records', [{}])[0].get('summary', '') if home_team.get('records') else '' home_record = home_team.get('records', [{}])[0].get('summary', '') if home_team.get('records') else ''

View File

@@ -202,19 +202,21 @@ class WeatherManager:
"""Get current weather data, fetching new data if needed.""" """Get current weather data, fetching new data if needed."""
current_time = time.time() current_time = time.time()
update_interval = self.weather_config.get('update_interval', 300) update_interval = self.weather_config.get('update_interval', 300)
# Add a throttle for log spam
log_throttle_interval = 600 # 10 minutes
if not hasattr(self, '_last_weather_log_time'):
self._last_weather_log_time = 0
# Check if we need to update based on time or if we have no data # Check if we need to update based on time or if we have no data
if (not self.weather_data or if (not self.weather_data or
current_time - self.last_update > update_interval): current_time - self.last_update > update_interval):
# Check if data has changed before fetching # Check if data has changed before fetching
current_state = self._get_weather_state() current_state = self._get_weather_state()
if current_state and not self.cache_manager.has_data_changed('weather', current_state): if current_state and not self.cache_manager.has_data_changed('weather', current_state):
print("Weather data hasn't changed, using existing data") if current_time - self._last_weather_log_time > log_throttle_interval:
print("Weather data hasn't changed, using existing data")
self._last_weather_log_time = current_time
return self.weather_data return self.weather_data
self._fetch_weather() self._fetch_weather()
return self.weather_data return self.weather_data
def _get_weather_state(self) -> Dict[str, Any]: def _get_weather_state(self) -> Dict[str, Any]: