From 03f0a6e6e2515e53bfa3e5ca057f45d1dce0e79a Mon Sep 17 00:00:00 2001 From: Chuck <33324927+ChuckBuilds@users.noreply.github.com> Date: Mon, 11 Aug 2025 17:25:03 -0500 Subject: [PATCH] troubleshoot milb upcoming --- src/display_controller.py | 1 - src/milb_manager.py | 56 ++++++++++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/display_controller.py b/src/display_controller.py index 54e8cdb5..9b67495a 100644 --- a/src/display_controller.py +++ b/src/display_controller.py @@ -1139,7 +1139,6 @@ class DisplayController: manager_to_display = self.milb_recent elif self.current_display_mode == 'milb_upcoming' and self.milb_upcoming: manager_to_display = self.milb_upcoming - logger.info("Set manager_to_display to milb_upcoming") elif self.current_display_mode == 'soccer_recent' and self.soccer_recent: manager_to_display = self.soccer_recent elif self.current_display_mode == 'soccer_upcoming' and self.soccer_upcoming: diff --git a/src/milb_manager.py b/src/milb_manager.py index 1668ee3f..cfc85f11 100644 --- a/src/milb_manager.py +++ b/src/milb_manager.py @@ -211,7 +211,11 @@ class BaseMiLBManager: def _create_game_display(self, game_data: Dict[str, Any]) -> Image.Image: """Create a display image for an MiLB game with team logos, score, and game state.""" - self.logger.info(f"[MiLB] Creating game display for: {game_data.get('away_team')} @ {game_data.get('home_team')}") + # Throttle this info log to avoid spamming (once every 30s) + now_ts = time.time() + if not hasattr(self, '_last_create_log_ts') or (now_ts - getattr(self, '_last_create_log_ts', 0)) >= 30: + self.logger.info(f"[MiLB] Creating game display for: {game_data.get('away_team')} @ {game_data.get('home_team')}") + self._last_create_log_ts = now_ts width = self.display_manager.matrix.width height = self.display_manager.matrix.height image = Image.new('RGB', (width, height), color=(0, 0, 0)) @@ -258,19 +262,37 @@ class BaseMiLBManager: # For upcoming games, show date and time stacked in the center self.logger.debug(f"[MiLB] Game status: {game_data.get('status')}, status_state: {game_data.get('status_state')}") self.logger.debug(f"[MiLB] Full game data: {game_data}") - if game_data['status'] == 'status_scheduled': + is_upcoming_status = ( + game_data.get('status') == 'status_scheduled' or + game_data.get('status_state') not in ['post', 'final', 'completed'] + ) + if is_upcoming_status: # Ensure game_time_str is defined before use game_time_str = game_data.get('start_time', '') - # Show "Next Game" at the top using NHL-style font + # Show "Next Game" at the top using BDF font when available, else TTF fallback status_text = "Next Game" - # Set font size for BDF font - self.display_manager.calendar_font.set_char_size(height=7*64) # 7 pixels high, 64 units per pixel - status_width = self.display_manager.get_text_width(status_text, self.display_manager.calendar_font) - status_x = (width - status_width) // 2 - status_y = 2 - # Draw on the current image - self.display_manager.draw = draw - self.display_manager._draw_bdf_text(status_text, status_x, status_y, color=(255, 255, 255), font=self.display_manager.calendar_font) + try: + if hasattr(self.display_manager.calendar_font, 'set_char_size'): + # Likely a freetype.Face (BDF). Size to ~7px + self.display_manager.calendar_font.set_char_size(height=7*64) + status_width = self.display_manager.get_text_width(status_text, self.display_manager.calendar_font) + status_x = (width - status_width) // 2 + status_y = 2 + # Draw on the current image + self.display_manager.draw = draw + self.display_manager._draw_bdf_text(status_text, status_x, status_y, color=(255, 255, 255), font=self.display_manager.calendar_font) + else: + # Fallback to small TTF font + fallback_font = self.display_manager.small_font + status_width = self.display_manager.get_text_width(status_text, fallback_font) + status_x = (width - status_width) // 2 + status_y = 2 + self._draw_text_with_outline(draw, status_text, (status_x, status_y), fallback_font) + except Exception as e: + # As a last resort, draw with default PIL font + status_x = 2 + status_y = 2 + self._draw_text_with_outline(draw, status_text, (status_x, status_y), ImageFont.load_default()) if not game_time_str or 'TBD' in game_time_str: game_date_str = "TBD" @@ -309,11 +331,15 @@ class BaseMiLBManager: # Draw date and time using NHL-style fonts try: - date_font = ImageFont.truetype("assets/fonts/PressStart2P-Regular.ttf", 8) - time_font = ImageFont.truetype("assets/fonts/PressStart2P-Regular.ttf", 8) - self.logger.debug(f"[MiLB] Fonts loaded successfully") + # Prefer already loaded small font from DisplayManager to avoid I/O and failures + date_font = getattr(self.display_manager, 'small_font', None) + time_font = getattr(self.display_manager, 'small_font', None) + if date_font is None or time_font is None: + date_font = ImageFont.truetype("assets/fonts/PressStart2P-Regular.ttf", 8) + time_font = ImageFont.truetype("assets/fonts/PressStart2P-Regular.ttf", 8) + self.logger.debug(f"[MiLB] Fonts prepared successfully") except Exception as e: - self.logger.error(f"[MiLB] Failed to load fonts: {e}") + self.logger.error(f"[MiLB] Failed to prepare fonts: {e}") # Fallback to default font date_font = ImageFont.load_default() time_font = ImageFont.load_default()