From 7c1fb5436b8c0138d3114564dd14faf63b86d5e6 Mon Sep 17 00:00:00 2001 From: Olin Osborne III Date: Thu, 19 Mar 2026 02:31:07 -0400 Subject: [PATCH] fix(plugins): replace display_manager.matrix.width/height with display_manager.width/height Mechanical replacement across 20 plugins (39 Python files). Bumped patch versions for all affected plugins. Regenerated plugins.json. --- plugins.json | 82 +++++++++---------- plugins/baseball-scoreboard/logo_manager.py | 4 +- plugins/baseball-scoreboard/manager.py | 4 +- plugins/baseball-scoreboard/manifest.json | 2 +- plugins/baseball-scoreboard/scroll_display.py | 4 +- plugins/baseball-scoreboard/sports.py | 12 +-- plugins/basketball-scoreboard/basketball.py | 4 +- plugins/basketball-scoreboard/manager.py | 4 +- plugins/basketball-scoreboard/manifest.json | 2 +- .../basketball-scoreboard/scroll_display.py | 4 +- plugins/basketball-scoreboard/sports.py | 12 +-- plugins/calendar/manager.py | 4 +- plugins/calendar/manifest.json | 2 +- plugins/countdown/manager.py | 12 +-- plugins/countdown/manifest.json | 2 +- plugins/f1-scoreboard/manager.py | 4 +- plugins/f1-scoreboard/manifest.json | 2 +- plugins/f1-scoreboard/scroll_display.py | 4 +- plugins/football-scoreboard/football.py | 4 +- plugins/football-scoreboard/manager.py | 4 +- plugins/football-scoreboard/manifest.json | 2 +- plugins/football-scoreboard/scroll_display.py | 4 +- plugins/football-scoreboard/sports.py | 12 +-- plugins/hockey-scoreboard/base_classes.py | 4 +- plugins/hockey-scoreboard/manager.py | 4 +- plugins/hockey-scoreboard/manifest.json | 2 +- .../hockey-scoreboard/scoreboard_renderer.py | 24 +++--- plugins/hockey-scoreboard/scroll_display.py | 4 +- plugins/hockey-scoreboard/sports.py | 4 +- plugins/ledmatrix-flights/manager.py | 4 +- plugins/ledmatrix-flights/manifest.json | 2 +- plugins/ledmatrix-music/manager.py | 12 +-- plugins/ledmatrix-music/manifest.json | 2 +- plugins/ledmatrix-stocks/display_renderer.py | 2 +- plugins/ledmatrix-stocks/manifest.json | 2 +- plugins/ledmatrix-weather/manager.py | 18 ++-- plugins/ledmatrix-weather/manifest.json | 2 +- plugins/mqtt-notifications/manager.py | 12 +-- plugins/mqtt-notifications/manifest.json | 2 +- plugins/odds-ticker/manager.py | 20 ++--- plugins/odds-ticker/manifest.json | 14 +++- plugins/odds-ticker/odds_renderer.py | 24 +++--- plugins/soccer-scoreboard/manager.py | 4 +- plugins/soccer-scoreboard/manifest.json | 2 +- plugins/soccer-scoreboard/scroll_display.py | 4 +- plugins/soccer-scoreboard/sports.py | 12 +-- plugins/static-image/manager.py | 8 +- plugins/static-image/manifest.json | 2 +- plugins/stock-news/manager.py | 12 +-- plugins/stock-news/manifest.json | 2 +- plugins/text-display/manager.py | 14 ++-- plugins/text-display/manifest.json | 2 +- plugins/ufc-scoreboard/manager.py | 4 +- plugins/ufc-scoreboard/manifest.json | 2 +- plugins/ufc-scoreboard/scroll_display.py | 4 +- plugins/ufc-scoreboard/sports.py | 12 +-- plugins/web-ui-info/manager.py | 4 +- plugins/web-ui-info/manifest.json | 3 +- plugins/youtube-stats/manager.py | 4 +- plugins/youtube-stats/manifest.json | 2 +- 60 files changed, 227 insertions(+), 218 deletions(-) diff --git a/plugins.json b/plugins.json index 5638bd8e..035d4585 100644 --- a/plugins.json +++ b/plugins.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "last_updated": "2026-02-26", + "last_updated": "2026-03-19", "plugins": [ { "id": "hello-world", @@ -59,10 +59,10 @@ "repo": "https://github.com/ChuckBuilds/ledmatrix-plugins", "branch": "main", "plugin_path": "plugins/ledmatrix-weather", - "latest_version": "2.1.1", + "latest_version": "2.1.2", "stars": 0, "downloads": 0, - "last_updated": "2026-02-15", + "last_updated": "2026-03-19", "verified": true, "screenshot": "" }, @@ -83,10 +83,10 @@ "plugin_path": "plugins/static-image", "stars": 0, "downloads": 0, - "last_updated": "2025-11-05", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.2" + "latest_version": "1.0.3" }, { "id": "text-display", @@ -105,10 +105,10 @@ "plugin_path": "plugins/text-display", "stars": 0, "downloads": 0, - "last_updated": "2025-10-19", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.1" + "latest_version": "1.0.2" }, { "id": "of-the-day", @@ -150,10 +150,10 @@ "plugin_path": "plugins/ledmatrix-music", "stars": 0, "downloads": 0, - "last_updated": "2025-11-05", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.3" + "latest_version": "1.0.4" }, { "id": "calendar", @@ -172,10 +172,10 @@ "plugin_path": "plugins/calendar", "stars": 0, "downloads": 0, - "last_updated": "2025-10-19", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.1" + "latest_version": "1.0.2" }, { "id": "hockey-scoreboard", @@ -196,10 +196,10 @@ "plugin_path": "plugins/hockey-scoreboard", "stars": 0, "downloads": 0, - "last_updated": "2026-02-25", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.2.4" + "latest_version": "1.2.5" }, { "id": "football-scoreboard", @@ -221,10 +221,10 @@ "plugin_path": "plugins/football-scoreboard", "stars": 0, "downloads": 0, - "last_updated": "2026-02-25", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "2.3.4" + "latest_version": "2.3.5" }, { "id": "ufc-scoreboard", @@ -245,10 +245,10 @@ "plugin_path": "plugins/ufc-scoreboard", "stars": 0, "downloads": 0, - "last_updated": "2026-02-25", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.2.3" + "latest_version": "1.2.4" }, { "id": "basketball-scoreboard", @@ -270,10 +270,10 @@ "plugin_path": "plugins/basketball-scoreboard", "stars": 0, "downloads": 0, - "last_updated": "2026-02-25", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.5.4" + "latest_version": "1.5.5" }, { "id": "baseball-scoreboard", @@ -296,10 +296,10 @@ "plugin_path": "plugins/baseball-scoreboard", "stars": 0, "downloads": 0, - "last_updated": "2026-02-25", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.5.4" + "latest_version": "1.5.5" }, { "id": "soccer-scoreboard", @@ -325,10 +325,10 @@ "plugin_path": "plugins/soccer-scoreboard", "stars": 0, "downloads": 0, - "last_updated": "2026-02-25", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.4.4" + "latest_version": "1.4.5" }, { "id": "odds-ticker", @@ -352,10 +352,10 @@ "plugin_path": "plugins/odds-ticker", "stars": 0, "downloads": 0, - "last_updated": "2026-02-23", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.1.1" + "latest_version": "1.1.2" }, { "id": "leaderboard", @@ -429,10 +429,10 @@ "plugin_path": "plugins/stock-news", "stars": 0, "downloads": 0, - "last_updated": "2025-10-19", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.2" + "latest_version": "1.0.3" }, { "id": "stocks", @@ -454,10 +454,10 @@ "plugin_path": "plugins/ledmatrix-stocks", "stars": 0, "downloads": 0, - "last_updated": "2026-02-12", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "2.0.2" + "latest_version": "2.0.3" }, { "id": "ledmatrix-flights", @@ -479,10 +479,10 @@ "plugin_path": "plugins/ledmatrix-flights", "stars": 0, "downloads": 0, - "last_updated": "2025-11-05", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.0" + "latest_version": "1.0.1" }, { "id": "christmas-countdown", @@ -550,10 +550,10 @@ "plugin_path": "plugins/youtube-stats", "stars": 0, "downloads": 0, - "last_updated": "2025-01-14", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.0" + "latest_version": "1.0.1" }, { "id": "7-segment-clock", @@ -596,10 +596,10 @@ "plugin_path": "plugins/mqtt-notifications", "stars": 0, "downloads": 0, - "last_updated": "2026-02-11", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.0" + "latest_version": "1.0.1" }, { "id": "countdown", @@ -619,10 +619,10 @@ "plugin_path": "plugins/countdown", "stars": 0, "downloads": 0, - "last_updated": "2026-02-11", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.0" + "latest_version": "1.0.1" }, { "id": "f1-scoreboard", @@ -644,10 +644,10 @@ "plugin_path": "plugins/f1-scoreboard", "stars": 0, "downloads": 0, - "last_updated": "2026-02-25", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.2.2" + "latest_version": "1.2.3" }, { "id": "pga-tour-leaderboard", @@ -689,10 +689,10 @@ "plugin_path": "plugins/web-ui-info", "stars": 0, "downloads": 0, - "last_updated": "2026-02-11", + "last_updated": "2026-03-19", "verified": true, "screenshot": "", - "latest_version": "1.0.0" + "latest_version": "1.0.1" } ] } diff --git a/plugins/baseball-scoreboard/logo_manager.py b/plugins/baseball-scoreboard/logo_manager.py index 99617912..21161508 100644 --- a/plugins/baseball-scoreboard/logo_manager.py +++ b/plugins/baseball-scoreboard/logo_manager.py @@ -43,8 +43,8 @@ def __init__(self, display_manager, logger: logging.Logger, sport_key: str = Non # Get display dimensions if display_manager and hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height elif display_manager: # Fallback to width/height properties (which also check matrix) self.display_width = getattr(display_manager, "width", 128) diff --git a/plugins/baseball-scoreboard/manager.py b/plugins/baseball-scoreboard/manager.py index 3c0399d0..755a178b 100644 --- a/plugins/baseball-scoreboard/manager.py +++ b/plugins/baseball-scoreboard/manager.py @@ -110,8 +110,8 @@ def __init__( self.is_enabled = config.get("enabled", True) # Get display dimensions from display_manager properties if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/baseball-scoreboard/manifest.json b/plugins/baseball-scoreboard/manifest.json index f3dad1c1..cfbf845b 100644 --- a/plugins/baseball-scoreboard/manifest.json +++ b/plugins/baseball-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "baseball-scoreboard", "name": "Baseball Scoreboard", - "version": "1.5.4", + "version": "1.5.5", "author": "ChuckBuilds", "description": "Live, recent, and upcoming baseball games across MLB, MiLB, and NCAA Baseball with real-time scores and schedules", "category": "sports", diff --git a/plugins/baseball-scoreboard/scroll_display.py b/plugins/baseball-scoreboard/scroll_display.py index 196062a1..4c95d4c2 100644 --- a/plugins/baseball-scoreboard/scroll_display.py +++ b/plugins/baseball-scoreboard/scroll_display.py @@ -77,8 +77,8 @@ def __init__( # Get display dimensions if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/baseball-scoreboard/sports.py b/plugins/baseball-scoreboard/sports.py index 66921b7e..a4860fcd 100644 --- a/plugins/baseball-scoreboard/sports.py +++ b/plugins/baseball-scoreboard/sports.py @@ -39,8 +39,8 @@ def __init__( # Get display dimensions from matrix (same as base SportsCore class) # This ensures proper scaling for different display sizes if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: # Fallback to width/height properties (which also check matrix) self.display_width = getattr(display_manager, "width", 128) @@ -1208,8 +1208,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) @@ -1768,8 +1768,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) diff --git a/plugins/basketball-scoreboard/basketball.py b/plugins/basketball-scoreboard/basketball.py index b1fa1f5e..6947afbd 100644 --- a/plugins/basketball-scoreboard/basketball.py +++ b/plugins/basketball-scoreboard/basketball.py @@ -155,8 +155,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new('RGBA', (display_width, display_height), (0, 0, 0, 255)) overlay = Image.new('RGBA', (display_width, display_height), (0, 0, 0, 0)) diff --git a/plugins/basketball-scoreboard/manager.py b/plugins/basketball-scoreboard/manager.py index e1951566..8247355d 100644 --- a/plugins/basketball-scoreboard/manager.py +++ b/plugins/basketball-scoreboard/manager.py @@ -81,8 +81,8 @@ def __init__( self.is_enabled = config.get("enabled", True) # Get display dimensions from display_manager properties if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/basketball-scoreboard/manifest.json b/plugins/basketball-scoreboard/manifest.json index c40e1296..7977c681 100644 --- a/plugins/basketball-scoreboard/manifest.json +++ b/plugins/basketball-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "basketball-scoreboard", "name": "Basketball Scoreboard", - "version": "1.5.4", + "version": "1.5.5", "description": "Live, recent, and upcoming basketball games across NBA, NCAA Men's, NCAA Women's, and WNBA with real-time scores, schedules, and March Madness tournament support", "author": "ChuckBuilds", "category": "sports", diff --git a/plugins/basketball-scoreboard/scroll_display.py b/plugins/basketball-scoreboard/scroll_display.py index fb334fe9..529337da 100644 --- a/plugins/basketball-scoreboard/scroll_display.py +++ b/plugins/basketball-scoreboard/scroll_display.py @@ -78,8 +78,8 @@ def __init__( # Get display dimensions if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/basketball-scoreboard/sports.py b/plugins/basketball-scoreboard/sports.py index 7e618c26..cc27940c 100644 --- a/plugins/basketball-scoreboard/sports.py +++ b/plugins/basketball-scoreboard/sports.py @@ -52,8 +52,8 @@ def __init__( # Get display dimensions from matrix (same as base SportsCore class) # This ensures proper scaling for different display sizes if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: # Fallback to width/height properties (which also check matrix) self.display_width = getattr(display_manager, "width", 128) @@ -1550,8 +1550,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) @@ -2078,8 +2078,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) diff --git a/plugins/calendar/manager.py b/plugins/calendar/manager.py index 53d52b5c..34364154 100644 --- a/plugins/calendar/manager.py +++ b/plugins/calendar/manager.py @@ -278,9 +278,9 @@ def _get_display_dimensions(self, width: Optional[int] = None, height: Optional[ # Try to get from display_manager.matrix first if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix is not None: if resolved_width is None: - resolved_width = self.display_manager.matrix.width + resolved_width = self.display_manager.width if resolved_height is None: - resolved_height = self.display_manager.matrix.height + resolved_height = self.display_manager.height # Try direct attributes if still missing if resolved_width is None: diff --git a/plugins/calendar/manifest.json b/plugins/calendar/manifest.json index 0e4a00f6..295a4123 100644 --- a/plugins/calendar/manifest.json +++ b/plugins/calendar/manifest.json @@ -1,7 +1,7 @@ { "id": "calendar", "name": "Google Calendar", - "version": "1.0.1", + "version": "1.0.2", "author": "ChuckBuilds", "description": "Display upcoming events from Google Calendar with date, time, and event details. Shows next 1-3 events with automatic rotation and timezone support.", "category": "productivity", diff --git a/plugins/countdown/manager.py b/plugins/countdown/manager.py index 28b4d349..922480cf 100644 --- a/plugins/countdown/manager.py +++ b/plugins/countdown/manager.py @@ -412,8 +412,8 @@ def display(self, force_clear: bool = False) -> None: try: # Get display dimensions - display_width = self.display_manager.matrix.width - display_height = self.display_manager.matrix.height + display_width = self.display_manager.width + display_height = self.display_manager.height # Calculate layout: left 1/3 for image, right 2/3 for text image_width = display_width // 3 @@ -540,8 +540,8 @@ def display(self, force_clear: bool = False) -> None: def _display_no_countdowns(self) -> None: """Display message when no countdowns are enabled.""" try: - display_width = self.display_manager.matrix.width - display_height = self.display_manager.matrix.height + display_width = self.display_manager.width + display_height = self.display_manager.height img = Image.new('RGB', (display_width, display_height), self.background_color) self.display_manager.image = img.copy() @@ -583,8 +583,8 @@ def _display_no_countdowns(self) -> None: def _display_error(self) -> None: """Display error message when something goes wrong.""" try: - display_width = self.display_manager.matrix.width - display_height = self.display_manager.matrix.height + display_width = self.display_manager.width + display_height = self.display_manager.height img = Image.new('RGB', (display_width, display_height), (0, 0, 0)) self.display_manager.image = img.copy() diff --git a/plugins/countdown/manifest.json b/plugins/countdown/manifest.json index 779cccae..e13e39a1 100644 --- a/plugins/countdown/manifest.json +++ b/plugins/countdown/manifest.json @@ -1,7 +1,7 @@ { "id": "countdown", "name": "Countdown Display", - "version": "1.0.0", + "version": "1.0.1", "author": "Charles", "description": "Create and manage customizable countdowns with images. Perfect for birthdays, holidays, events, and special occasions.", "entry_point": "manager.py", diff --git a/plugins/f1-scoreboard/manager.py b/plugins/f1-scoreboard/manager.py index 74cd89c2..137bb3e6 100644 --- a/plugins/f1-scoreboard/manager.py +++ b/plugins/f1-scoreboard/manager.py @@ -40,8 +40,8 @@ def __init__(self, plugin_id, config, display_manager, # Display dimensions if hasattr(display_manager, "matrix") and display_manager.matrix: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/f1-scoreboard/manifest.json b/plugins/f1-scoreboard/manifest.json index a48af5c2..755e0e93 100644 --- a/plugins/f1-scoreboard/manifest.json +++ b/plugins/f1-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "f1-scoreboard", "name": "F1 Scoreboard", - "version": "1.2.2", + "version": "1.2.3", "author": "ChuckBuilds", "class_name": "F1ScoreboardPlugin", "entry_point": "manager.py", diff --git a/plugins/f1-scoreboard/scroll_display.py b/plugins/f1-scoreboard/scroll_display.py index 05ac2086..05b75d2e 100644 --- a/plugins/f1-scoreboard/scroll_display.py +++ b/plugins/f1-scoreboard/scroll_display.py @@ -37,8 +37,8 @@ def __init__(self, display_manager, config: Optional[Dict[str, Any]] = None, # Get display dimensions if hasattr(display_manager, "matrix") and display_manager.matrix: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/football-scoreboard/football.py b/plugins/football-scoreboard/football.py index 3ef7ec62..0573b633 100644 --- a/plugins/football-scoreboard/football.py +++ b/plugins/football-scoreboard/football.py @@ -167,8 +167,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new('RGBA', (display_width, display_height), (0, 0, 0, 255)) overlay = Image.new('RGBA', (display_width, display_height), (0, 0, 0, 0)) diff --git a/plugins/football-scoreboard/manager.py b/plugins/football-scoreboard/manager.py index 07253d01..f96a6f55 100644 --- a/plugins/football-scoreboard/manager.py +++ b/plugins/football-scoreboard/manager.py @@ -96,8 +96,8 @@ def __init__( self.is_enabled = config.get("enabled", True) # Get display dimensions from display_manager properties if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/football-scoreboard/manifest.json b/plugins/football-scoreboard/manifest.json index 936e89bd..fc464728 100644 --- a/plugins/football-scoreboard/manifest.json +++ b/plugins/football-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "football-scoreboard", "name": "Football Scoreboard", - "version": "2.3.4", + "version": "2.3.5", "author": "ChuckBuilds", "class_name": "FootballScoreboardPlugin", "description": "Standalone plugin for live, recent, and upcoming football games across NFL and NCAA Football with real-time scores, down/distance, possession, and game status. Now with organized nested config!", diff --git a/plugins/football-scoreboard/scroll_display.py b/plugins/football-scoreboard/scroll_display.py index 8b287b48..1fcca785 100644 --- a/plugins/football-scoreboard/scroll_display.py +++ b/plugins/football-scoreboard/scroll_display.py @@ -66,8 +66,8 @@ def __init__( # Get display dimensions if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/football-scoreboard/sports.py b/plugins/football-scoreboard/sports.py index 921c8688..8e5ac6b1 100644 --- a/plugins/football-scoreboard/sports.py +++ b/plugins/football-scoreboard/sports.py @@ -39,8 +39,8 @@ def __init__( # Get display dimensions from matrix (same as base SportsCore class) # This ensures proper scaling for different display sizes if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: # Fallback to width/height properties (which also check matrix) self.display_width = getattr(display_manager, "width", 128) @@ -1208,8 +1208,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) @@ -1768,8 +1768,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) diff --git a/plugins/hockey-scoreboard/base_classes.py b/plugins/hockey-scoreboard/base_classes.py index 37fd2a7c..84a414e8 100644 --- a/plugins/hockey-scoreboard/base_classes.py +++ b/plugins/hockey-scoreboard/base_classes.py @@ -35,8 +35,8 @@ def __init__(self, config: Dict[str, Any], display_manager, cache_manager, self.config = config self.cache_manager = cache_manager self.display_manager = display_manager - self.display_width = self.display_manager.matrix.width - self.display_height = self.display_manager.matrix.height + self.display_width = self.display_manager.width + self.display_height = self.display_manager.height self.sport_key = sport_key self.sport = None diff --git a/plugins/hockey-scoreboard/manager.py b/plugins/hockey-scoreboard/manager.py index 81760b05..a92f7543 100644 --- a/plugins/hockey-scoreboard/manager.py +++ b/plugins/hockey-scoreboard/manager.py @@ -79,8 +79,8 @@ def __init__( self.is_enabled = config.get("enabled", True) # Get display dimensions from display_manager properties if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/hockey-scoreboard/manifest.json b/plugins/hockey-scoreboard/manifest.json index 9f436ff2..1d7c6773 100644 --- a/plugins/hockey-scoreboard/manifest.json +++ b/plugins/hockey-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "hockey-scoreboard", "name": "Hockey Scoreboard", - "version": "1.2.4", + "version": "1.2.5", "author": "ChuckBuilds", "description": "Live, recent, and upcoming hockey games across NHL, NCAA Men's, and NCAA Women's hockey with real-time scores and schedules", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/hockey-scoreboard", diff --git a/plugins/hockey-scoreboard/scoreboard_renderer.py b/plugins/hockey-scoreboard/scoreboard_renderer.py index 82978b72..bffa7b85 100644 --- a/plugins/hockey-scoreboard/scoreboard_renderer.py +++ b/plugins/hockey-scoreboard/scoreboard_renderer.py @@ -70,8 +70,8 @@ def _load_and_resize_logo(self, team_abbrev: str, logo_path: Path) -> Optional[I logo = logo.convert('RGBA') # Resize logo to fit display - max_width = int(self.display_manager.matrix.width * 1.5) - max_height = int(self.display_manager.matrix.height * 1.5) + max_width = int(self.display_manager.width * 1.5) + max_height = int(self.display_manager.height * 1.5) logo.thumbnail((max_width, max_height), RESAMPLE_FILTER) self._logo_cache[team_abbrev] = logo @@ -93,8 +93,8 @@ def render_live_game(self, game: Dict, show_shots: bool = False, show_powerplay: bool = True) -> None: """Render a live hockey game with proper scorebug layout matching NHL manager.""" try: - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height # Create main image with transparency (matching NHL manager) main_img = Image.new("RGBA", (matrix_width, matrix_height), (0, 0, 0, 255)) @@ -193,8 +193,8 @@ def render_live_game(self, game: Dict, show_shots: bool = False, def render_recent_game(self, game: Dict) -> None: """Render a recent hockey game with proper scorebug layout matching NHL manager.""" try: - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height # Create main image with transparency (matching NHL manager) main_img = Image.new("RGBA", (matrix_width, matrix_height), (0, 0, 0, 255)) @@ -268,8 +268,8 @@ def render_recent_game(self, game: Dict) -> None: def render_upcoming_game(self, game: Dict) -> None: """Render an upcoming hockey game with proper scorebug layout matching NHL manager.""" try: - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height # Create main image with transparency (matching NHL manager) main_img = Image.new("RGBA", (matrix_width, matrix_height), (0, 0, 0, 255)) @@ -380,8 +380,8 @@ def render_upcoming_game(self, game: Dict) -> None: def render_no_games(self, mode: str) -> None: """Render message when no games are available.""" - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height img = Image.new('RGB', (matrix_width, matrix_height), (0, 0, 0)) draw = ImageDraw.Draw(img) @@ -403,8 +403,8 @@ def render_no_games(self, mode: str) -> None: def _display_error(self, message: str): """Display error message.""" - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height img = Image.new('RGB', (matrix_width, matrix_height), (0, 0, 0)) draw = ImageDraw.Draw(img) diff --git a/plugins/hockey-scoreboard/scroll_display.py b/plugins/hockey-scoreboard/scroll_display.py index 5490f399..91304a3a 100644 --- a/plugins/hockey-scoreboard/scroll_display.py +++ b/plugins/hockey-scoreboard/scroll_display.py @@ -76,8 +76,8 @@ def __init__( # Get display dimensions if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/hockey-scoreboard/sports.py b/plugins/hockey-scoreboard/sports.py index 9dd8730e..59603257 100644 --- a/plugins/hockey-scoreboard/sports.py +++ b/plugins/hockey-scoreboard/sports.py @@ -46,8 +46,8 @@ def __init__( # Get display dimensions from matrix (same as base SportsCore class) # This ensures proper scaling for different display sizes if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: # Fallback to width/height properties (which also check matrix) self.display_width = getattr(display_manager, "width", 128) diff --git a/plugins/ledmatrix-flights/manager.py b/plugins/ledmatrix-flights/manager.py index c862a806..45284704 100644 --- a/plugins/ledmatrix-flights/manager.py +++ b/plugins/ledmatrix-flights/manager.py @@ -129,8 +129,8 @@ def __init__(self, plugin_id: str, config: Dict[str, Any], display_manager, cach self.cached_pixels_per_mile = None # Actual scale of the cached map # Display configuration - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height self.show_trails = self.config.get('show_trails', False) self.trail_length = self.config.get('trail_length', 10) diff --git a/plugins/ledmatrix-flights/manifest.json b/plugins/ledmatrix-flights/manifest.json index 618982fe..4097c79a 100644 --- a/plugins/ledmatrix-flights/manifest.json +++ b/plugins/ledmatrix-flights/manifest.json @@ -1,7 +1,7 @@ { "id": "ledmatrix-flights", "name": "Flight Tracker", - "version": "1.0.0", + "version": "1.0.1", "description": "Real-time aircraft tracking with ADS-B data, map backgrounds, flight plans, and proximity alerts", "author": "ChuckBuilds", "entry_point": "manager.py", diff --git a/plugins/ledmatrix-music/manager.py b/plugins/ledmatrix-music/manager.py index 8a331c80..ad2a635d 100644 --- a/plugins/ledmatrix-music/manager.py +++ b/plugins/ledmatrix-music/manager.py @@ -837,8 +837,8 @@ def display(self, force_clear: bool = False) -> None: self.display_manager.clear() text_width = self.display_manager.get_text_width("Nothing Playing", self.display_manager.regular_font) - x_pos = (self.display_manager.matrix.width - text_width) // 2 - y_pos = (self.display_manager.matrix.height // 2) - 4 + x_pos = (self.display_manager.width - text_width) // 2 + y_pos = (self.display_manager.height // 2) - 4 self.display_manager.draw_text("Nothing Playing", x=x_pos, y=y_pos, font=self.display_manager.regular_font) self.display_manager.update_display() self.is_currently_showing_nothing_playing = True @@ -884,10 +884,10 @@ def display(self, force_clear: bool = False) -> None: pass if not perform_full_refresh_this_cycle: - self.display_manager.draw.rectangle([0, 0, self.display_manager.matrix.width, self.display_manager.matrix.height], fill=(0, 0, 0)) + self.display_manager.draw.rectangle([0, 0, self.display_manager.width, self.display_manager.height], fill=(0, 0, 0)) - matrix_height = self.display_manager.matrix.height - matrix_width = self.display_manager.matrix.width + matrix_height = self.display_manager.height + matrix_width = self.display_manager.width # Album art should always fill the full height of the display album_art_size = matrix_height @@ -951,7 +951,7 @@ def display(self, force_clear: bool = False) -> None: font_album = self.album_font if self.album_font else self.display_manager.bdf_5x7_font # Calculate y positions as percentages of display height for scaling - matrix_height = self.display_manager.matrix.height + matrix_height = self.display_manager.height # Define positions as percentages (0.0 to 1.0) - these scale with display size ARTIST_Y_PERCENT = 0.34 # 34% from top diff --git a/plugins/ledmatrix-music/manifest.json b/plugins/ledmatrix-music/manifest.json index 7965f464..c9271efb 100644 --- a/plugins/ledmatrix-music/manifest.json +++ b/plugins/ledmatrix-music/manifest.json @@ -1,7 +1,7 @@ { "id": "ledmatrix-music", "name": "Music Player - Now Playing", - "version": "1.0.3", + "version": "1.0.4", "description": "Real-time now playing display for Spotify and YouTube Music with album art, scrolling text, and progress bars", "author": "ChuckBuilds", "entry_point": "manager.py", diff --git a/plugins/ledmatrix-stocks/display_renderer.py b/plugins/ledmatrix-stocks/display_renderer.py index 0b2667c7..a7d1300c 100644 --- a/plugins/ledmatrix-stocks/display_renderer.py +++ b/plugins/ledmatrix-stocks/display_renderer.py @@ -171,7 +171,7 @@ def _load_custom_font_from_element_config(self, element_config: Dict[str, Any]) def create_stock_display(self, symbol: str, data: Dict[str, Any]) -> Image.Image: """Create a display image for a single stock or crypto - matching old stock manager layout exactly.""" # Create a wider image for scrolling - adjust width based on chart toggle - # Match old stock_manager: width = int(self.display_manager.matrix.width * (2 if self.toggle_chart else 1.5)) + # Match old stock_manager: width = int(self.display_manager.width * (2 if self.toggle_chart else 1.5)) # Ensure dimensions are integers width = int(self.display_width * (2 if self.toggle_chart else 1.5)) height = int(self.display_height) diff --git a/plugins/ledmatrix-stocks/manifest.json b/plugins/ledmatrix-stocks/manifest.json index c1952422..33b2ba70 100644 --- a/plugins/ledmatrix-stocks/manifest.json +++ b/plugins/ledmatrix-stocks/manifest.json @@ -1,7 +1,7 @@ { "id": "ledmatrix-stocks", "name": "Stock & Crypto Ticker", - "version": "2.0.2", + "version": "2.0.3", "description": "Displays scrolling stock tickers with prices, changes, and optional charts for stocks and cryptocurrencies", "author": "LEDMatrix Team", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/ledmatrix-stocks", diff --git a/plugins/ledmatrix-weather/manager.py b/plugins/ledmatrix-weather/manager.py index f06369f0..bc40d178 100644 --- a/plugins/ledmatrix-weather/manager.py +++ b/plugins/ledmatrix-weather/manager.py @@ -218,8 +218,8 @@ def _get_layout(self) -> dict: if hasattr(self, '_layout_cache'): return self._layout_cache - width = self.display_manager.matrix.width - height = self.display_manager.matrix.height + width = self.display_manager.width + height = self.display_manager.height h_scale = height / 32.0 # Fixed font metrics (do not change with display size) @@ -563,7 +563,7 @@ def _on_mode_changed(self, new_mode: str) -> None: def _display_no_data(self) -> None: """Display a diagnostic message when no weather data is available.""" - img = Image.new('RGB', (self.display_manager.matrix.width, self.display_manager.matrix.height), (0, 0, 0)) + img = Image.new('RGB', (self.display_manager.width, self.display_manager.height), (0, 0, 0)) draw = ImageDraw.Draw(img) from PIL import ImageFont @@ -590,8 +590,8 @@ def _display_no_data(self) -> None: def _render_current_weather_image(self) -> Optional[Image.Image]: """Render current weather conditions to an Image without display side effects.""" try: - width = self.display_manager.matrix.width - height = self.display_manager.matrix.height + width = self.display_manager.width + height = self.display_manager.height img = Image.new('RGB', (width, height), (0, 0, 0)) draw = ImageDraw.Draw(img) @@ -747,8 +747,8 @@ def _render_hourly_forecast_image(self) -> Optional[Image.Image]: if not self.hourly_forecast: return None - width = self.display_manager.matrix.width - height = self.display_manager.matrix.height + width = self.display_manager.width + height = self.display_manager.height img = Image.new('RGB', (width, height), (0, 0, 0)) draw = ImageDraw.Draw(img) @@ -819,8 +819,8 @@ def _render_daily_forecast_image(self) -> Optional[Image.Image]: if not self.daily_forecast: return None - width = self.display_manager.matrix.width - height = self.display_manager.matrix.height + width = self.display_manager.width + height = self.display_manager.height img = Image.new('RGB', (width, height), (0, 0, 0)) draw = ImageDraw.Draw(img) diff --git a/plugins/ledmatrix-weather/manifest.json b/plugins/ledmatrix-weather/manifest.json index d355ccc7..28c2be5d 100644 --- a/plugins/ledmatrix-weather/manifest.json +++ b/plugins/ledmatrix-weather/manifest.json @@ -1,7 +1,7 @@ { "id": "ledmatrix-weather", "name": "Weather Display", - "version": "2.1.1", + "version": "2.1.2", "author": "ChuckBuilds", "class_name": "WeatherPlugin", "description": "Comprehensive weather display with current conditions, hourly forecast, daily forecast, UV index, wind direction, and weather icons. Features state caching, API counter tracking, and error handling. Powered by OpenWeatherMap API with beautiful weather icons.", diff --git a/plugins/mqtt-notifications/manager.py b/plugins/mqtt-notifications/manager.py index 4a2eac36..d8bda0e3 100644 --- a/plugins/mqtt-notifications/manager.py +++ b/plugins/mqtt-notifications/manager.py @@ -422,8 +422,8 @@ def _load_image(self, image_source: str) -> Optional[Image.Image]: def _resize_image(self, img: Image.Image) -> Image.Image: """Resize image to fit matrix dimensions while maintaining aspect ratio.""" - matrix_width = self.display_manager.matrix.width if self.display_manager.matrix else 128 - matrix_height = self.display_manager.matrix.height if self.display_manager.matrix else 32 + matrix_width = self.display_manager.width if self.display_manager.matrix else 128 + matrix_height = self.display_manager.height if self.display_manager.matrix else 32 # Calculate scaling to fit scale_w = matrix_width / img.width @@ -462,8 +462,8 @@ def _create_text_cache(self, text: str) -> Optional[Image.Image]: return None try: - matrix_width = self.display_manager.matrix.width if self.display_manager.matrix else 128 - matrix_height = self.display_manager.matrix.height if self.display_manager.matrix else 32 + matrix_width = self.display_manager.width if self.display_manager.matrix else 128 + matrix_height = self.display_manager.height if self.display_manager.matrix else 32 # Create temporary image to measure text temp_img = Image.new('RGB', (1, 1)) @@ -529,8 +529,8 @@ def display(self, force_clear: bool = False) -> bool: return False try: - matrix_width = self.display_manager.matrix.width if self.display_manager.matrix else 128 - matrix_height = self.display_manager.matrix.height if self.display_manager.matrix else 32 + matrix_width = self.display_manager.width if self.display_manager.matrix else 128 + matrix_height = self.display_manager.height if self.display_manager.matrix else 32 content = message.get('content', {}) diff --git a/plugins/mqtt-notifications/manifest.json b/plugins/mqtt-notifications/manifest.json index 0b81fa6f..0bb62d6c 100644 --- a/plugins/mqtt-notifications/manifest.json +++ b/plugins/mqtt-notifications/manifest.json @@ -1,7 +1,7 @@ { "id": "mqtt-notifications", "name": "MQTT Notifications", - "version": "1.0.0", + "version": "1.0.1", "author": "ChuckBuilds", "description": "Display text or images from HomeAssistant via MQTT. Supports dynamic MQTT topics with wildcard support for flexible notification handling that interrupts the normal display rotation.", "category": "integration", diff --git a/plugins/odds-ticker/manager.py b/plugins/odds-ticker/manager.py index fa19a3ea..5d3f0be4 100644 --- a/plugins/odds-ticker/manager.py +++ b/plugins/odds-ticker/manager.py @@ -311,8 +311,8 @@ def get_config(section, key, default, old_key=None): logger.info(f"High FPS scrolling enabled: enable_scrolling={self.enable_scrolling}, target_fps={self.target_fps}") # Initialize ScrollHelper for scrolling functionality - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') else 128 - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') else 32 + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') else 128 + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') else 32 self.scroll_helper = ScrollHelper(display_width, display_height, logger=self.logger) # Configure ScrollHelper with plugin settings @@ -1659,8 +1659,8 @@ def _draw_base_indicators(self, draw: ImageDraw.Draw, bases_occupied: List[bool] def _create_game_display(self, game: Dict[str, Any]) -> Image.Image: """Create a display image for a game in the new format.""" - width = self.display_manager.matrix.width - height = self.display_manager.matrix.height + width = self.display_manager.width + height = self.display_manager.height # Make logos use most of the display height, with a small margin logo_size = int(height * 1.2) @@ -2194,7 +2194,7 @@ def _create_ticker_image(self): return gap_width = 24 # Gap between games - height = self.display_manager.matrix.height + height = self.display_manager.height # Use ScrollHelper to create the scrolling image # ScrollHelper automatically adds display_width padding at the start @@ -2206,7 +2206,7 @@ def _create_ticker_image(self): # Add white vertical bars between games for visual separation # ScrollHelper places items with gaps, so we need to find where to add bars - display_width = self.display_manager.matrix.width + display_width = self.display_manager.width current_x = display_width # Start after initial padding for idx, img in enumerate(game_images): @@ -2781,8 +2781,8 @@ def create_image(): # Display the visible portion (use paste like leaderboard for better performance) if visible_image: # Ensure display_manager.image exists and is the right size - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height if not hasattr(self.display_manager, 'image') or self.display_manager.image is None: self.display_manager.image = Image.new('RGB', (matrix_width, matrix_height), (0, 0, 0)) elif self.display_manager.image.size != (matrix_width, matrix_height): @@ -2810,8 +2810,8 @@ def create_image(): def _display_fallback_message(self): """Display a fallback message when no games data is available.""" try: - width = self.display_manager.matrix.width - height = self.display_manager.matrix.height + width = self.display_manager.width + height = self.display_manager.height logger.info(f"Displaying fallback message on {width}x{height} display") diff --git a/plugins/odds-ticker/manifest.json b/plugins/odds-ticker/manifest.json index 6918baf2..d7ec1efd 100644 --- a/plugins/odds-ticker/manifest.json +++ b/plugins/odds-ticker/manifest.json @@ -1,11 +1,21 @@ { "id": "odds-ticker", "name": "Odds Ticker", - "version": "1.1.1", + "version": "1.1.2", "description": "Displays scrolling odds and betting lines for upcoming games across multiple sports leagues including NFL, NBA, MLB, NCAA Football, and more", "author": "ChuckBuilds", "category": "sports", - "tags": ["odds", "betting", "ticker", "sports", "nfl", "nba", "mlb", "ncaa", "scrolling"], + "tags": [ + "odds", + "betting", + "ticker", + "sports", + "nfl", + "nba", + "mlb", + "ncaa", + "scrolling" + ], "repo": "https://github.com/ChuckBuilds/ledmatrix-plugins", "branch": "main", "plugin_path": "plugins/odds-ticker", diff --git a/plugins/odds-ticker/odds_renderer.py b/plugins/odds-ticker/odds_renderer.py index 60c33853..8b2993d6 100644 --- a/plugins/odds-ticker/odds_renderer.py +++ b/plugins/odds-ticker/odds_renderer.py @@ -193,8 +193,8 @@ def create_ticker_image(self, games_data: List[Dict]) -> Image.Image: return self._create_no_data_image() try: - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height # Create game images using the original method game_images = [self._create_game_display(game) for game in games_data] @@ -247,8 +247,8 @@ def create_ticker_image(self, games_data: List[Dict]) -> Image.Image: def _create_game_display(self, game: Dict) -> Image.Image: """Create a display image for a game matching the original odds_ticker_manager layout exactly.""" - width = self.display_manager.matrix.width - height = self.display_manager.matrix.height + width = self.display_manager.width + height = self.display_manager.height # Make logos use most of the display height, with a small margin logo_size = int(height * 1.2) @@ -524,8 +524,8 @@ def _format_odds_display(self, odds: Dict) -> str: def _create_no_data_image(self) -> Image.Image: """Create image when no data is available.""" - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height img = Image.new('RGB', (matrix_width, matrix_height), (0, 0, 0)) draw = ImageDraw.Draw(img) @@ -537,8 +537,8 @@ def _create_no_data_image(self) -> Image.Image: def _display_fallback_message(self): """Display a fallback message when no games data is available.""" try: - width = self.display_manager.matrix.width - height = self.display_manager.matrix.height + width = self.display_manager.width + height = self.display_manager.height logger.info(f"Displaying fallback message on {width}x{height} display") @@ -588,8 +588,8 @@ def _draw_text_with_outline(self, draw: ImageDraw.Draw, text: str, position: tup def _create_error_image(self, message: str) -> Image.Image: """Create error image.""" - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height img = Image.new('RGB', (matrix_width, matrix_height), (0, 0, 0)) draw = ImageDraw.Draw(img) @@ -631,8 +631,8 @@ def render_scrolling_ticker(self, ticker_image: Image.Image) -> bool: try: current_time = time.time() - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height # Check if we should be scrolling should_scroll = current_time - self.last_scroll_time >= self.scroll_delay diff --git a/plugins/soccer-scoreboard/manager.py b/plugins/soccer-scoreboard/manager.py index 1dd87040..a717325b 100644 --- a/plugins/soccer-scoreboard/manager.py +++ b/plugins/soccer-scoreboard/manager.py @@ -146,8 +146,8 @@ def __init__( self.is_enabled = config.get("enabled", True) # Get display dimensions from display_manager properties if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/soccer-scoreboard/manifest.json b/plugins/soccer-scoreboard/manifest.json index fb21ad8c..f9fc51f5 100644 --- a/plugins/soccer-scoreboard/manifest.json +++ b/plugins/soccer-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "soccer-scoreboard", "name": "Soccer Scoreboard", - "version": "1.4.4", + "version": "1.4.5", "author": "ChuckBuilds", "description": "Live, recent, and upcoming soccer games across multiple leagues including Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS, and more", "category": "sports", diff --git a/plugins/soccer-scoreboard/scroll_display.py b/plugins/soccer-scoreboard/scroll_display.py index 1f9c3de8..6deacca9 100644 --- a/plugins/soccer-scoreboard/scroll_display.py +++ b/plugins/soccer-scoreboard/scroll_display.py @@ -594,8 +594,8 @@ def get_scroll_display(self, game_type: str) -> ScrollDisplay: ScrollDisplay instance for the game type """ if game_type not in self._scroll_displays: - display_width = self.display_manager.matrix.width - display_height = self.display_manager.matrix.height + display_width = self.display_manager.width + display_height = self.display_manager.height self._scroll_displays[game_type] = ScrollDisplay( self.display_manager, display_width, diff --git a/plugins/soccer-scoreboard/sports.py b/plugins/soccer-scoreboard/sports.py index f481af1f..e1c468d6 100644 --- a/plugins/soccer-scoreboard/sports.py +++ b/plugins/soccer-scoreboard/sports.py @@ -49,8 +49,8 @@ def __init__( # Get display dimensions from matrix (same as base SportsCore class) # This ensures proper scaling for different display sizes if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: # Fallback to width/height properties (which also check matrix) self.display_width = getattr(display_manager, "width", 128) @@ -1353,8 +1353,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) @@ -1869,8 +1869,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) diff --git a/plugins/static-image/manager.py b/plugins/static-image/manager.py index 282f387a..a4c7fe60 100644 --- a/plugins/static-image/manager.py +++ b/plugins/static-image/manager.py @@ -429,8 +429,8 @@ def _load_image(self) -> bool: num_frames = 1 # Get display dimensions - display_width = self.display_manager.matrix.width - display_height = self.display_manager.matrix.height + display_width = self.display_manager.width + display_height = self.display_manager.height if is_animated and num_frames > 1: # Handle animated GIF @@ -942,8 +942,8 @@ def _display_error(self) -> None: self.logger.warning(f"Error getting font from font manager: {e}") img = Image.new('RGB', - (self.display_manager.matrix.width, - self.display_manager.matrix.height), + (self.display_manager.width, + self.display_manager.height), (0, 0, 0)) if error_font: diff --git a/plugins/static-image/manifest.json b/plugins/static-image/manifest.json index a9a6b750..f0faf6c4 100644 --- a/plugins/static-image/manifest.json +++ b/plugins/static-image/manifest.json @@ -1,7 +1,7 @@ { "id": "static-image", "name": "Static Image Display", - "version": "1.0.2", + "version": "1.0.3", "author": "ChuckBuilds", "description": "Display static images on your LED matrix with automatic scaling, aspect ratio preservation, and transparency support. Perfect for logos, artwork, or custom graphics.", "entry_point": "manager.py", diff --git a/plugins/stock-news/manager.py b/plugins/stock-news/manager.py index 919706e5..f2c6dfa8 100644 --- a/plugins/stock-news/manager.py +++ b/plugins/stock-news/manager.py @@ -320,8 +320,8 @@ def display(self, display_mode: str = None, force_clear: bool = False) -> None: def _display_scrolling_stock_news(self): """Display scrolling stock news headlines.""" try: - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height # Create base image img = Image.new('RGB', (matrix_width, matrix_height), (0, 0, 0)) @@ -368,8 +368,8 @@ def _display_scrolling_stock_news(self): def _display_no_news(self): """Display message when no news is available.""" - img = Image.new('RGB', (self.display_manager.matrix.width, - self.display_manager.matrix.height), + img = Image.new('RGB', (self.display_manager.width, + self.display_manager.height), (0, 0, 0)) draw = ImageDraw.Draw(img) draw.text((5, 12), "No Stock News", fill=(150, 150, 150)) @@ -379,8 +379,8 @@ def _display_no_news(self): def _display_error(self, message: str): """Display error message.""" - img = Image.new('RGB', (self.display_manager.matrix.width, - self.display_manager.matrix.height), + img = Image.new('RGB', (self.display_manager.width, + self.display_manager.height), (0, 0, 0)) draw = ImageDraw.Draw(img) draw.text((5, 12), message, fill=(255, 0, 0)) diff --git a/plugins/stock-news/manifest.json b/plugins/stock-news/manifest.json index 1c89c42a..1019b105 100644 --- a/plugins/stock-news/manifest.json +++ b/plugins/stock-news/manifest.json @@ -1,7 +1,7 @@ { "id": "stock-news", "name": "Stock News Ticker", - "version": "1.0.2", + "version": "1.0.3", "author": "ChuckBuilds", "description": "Displays scrolling stock-specific news headlines and financial updates from RSS feeds, focused on market news and company updates", "category": "financial", diff --git a/plugins/text-display/manager.py b/plugins/text-display/manager.py index 3a8bc423..0b016d77 100644 --- a/plugins/text-display/manager.py +++ b/plugins/text-display/manager.py @@ -98,8 +98,8 @@ def __init__(self, plugin_id: str, config: Dict[str, Any], self._calculate_text_dimensions() # Initialize ScrollHelper for scrolling functionality - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') else 128 - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') else 32 + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') else 128 + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') else 32 self.scroll_helper = ScrollHelper(display_width, display_height, logger=self.logger) # Configure ScrollHelper with plugin settings @@ -257,8 +257,8 @@ def _create_text_cache(self): return try: - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height # Total width: initial padding + text + final padding (so text scrolls completely off) + gap # Structure: [display_width padding] [text] [display_width padding] [gap] @@ -304,7 +304,7 @@ def _create_text_cache(self): def update(self) -> None: """Update scroll position if scrolling is enabled using ScrollHelper.""" - if not self.scroll_enabled or self.text_width <= self.display_manager.matrix.width: + if not self.scroll_enabled or self.text_width <= self.display_manager.width: # Reset scroll position if scrolling is disabled or text fits if self.scroll_helper: self.scroll_helper.reset_scroll() @@ -339,8 +339,8 @@ def display(self, force_clear: bool = False) -> None: return try: - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height if self.scroll_enabled and self.text_width > matrix_width: # Scrolling text - use ScrollHelper diff --git a/plugins/text-display/manifest.json b/plugins/text-display/manifest.json index 0b4d15ba..94a783a2 100644 --- a/plugins/text-display/manifest.json +++ b/plugins/text-display/manifest.json @@ -1,7 +1,7 @@ { "id": "text-display", "name": "Text Display", - "version": "1.0.1", + "version": "1.0.2", "author": "ChuckBuilds", "description": "Display custom scrolling or static text with configurable fonts, colors, and scroll speed. Perfect for announcements, messages, or custom displays.", "category": "display", diff --git a/plugins/ufc-scoreboard/manager.py b/plugins/ufc-scoreboard/manager.py index 05f3f51e..ee8f24ef 100644 --- a/plugins/ufc-scoreboard/manager.py +++ b/plugins/ufc-scoreboard/manager.py @@ -73,8 +73,8 @@ def __init__( # Basic configuration self.is_enabled = config.get("enabled", True) if hasattr(display_manager, "matrix") and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/ufc-scoreboard/manifest.json b/plugins/ufc-scoreboard/manifest.json index 00695b48..df495471 100644 --- a/plugins/ufc-scoreboard/manifest.json +++ b/plugins/ufc-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "ufc-scoreboard", "name": "UFC Scoreboard", - "version": "1.2.3", + "version": "1.2.4", "author": "LegoGuy1000", "contributors": [ { diff --git a/plugins/ufc-scoreboard/scroll_display.py b/plugins/ufc-scoreboard/scroll_display.py index ae980ec8..8fc2525a 100644 --- a/plugins/ufc-scoreboard/scroll_display.py +++ b/plugins/ufc-scoreboard/scroll_display.py @@ -55,8 +55,8 @@ def __init__( # Get display dimensions if hasattr(display_manager, "matrix") and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: self.display_width = getattr(display_manager, "width", 128) self.display_height = getattr(display_manager, "height", 32) diff --git a/plugins/ufc-scoreboard/sports.py b/plugins/ufc-scoreboard/sports.py index 7fc17bfd..b4f5cefa 100644 --- a/plugins/ufc-scoreboard/sports.py +++ b/plugins/ufc-scoreboard/sports.py @@ -43,8 +43,8 @@ def __init__( # Get display dimensions from matrix (same as base SportsCore class) # This ensures proper scaling for different display sizes if hasattr(display_manager, 'matrix') and display_manager.matrix is not None: - self.display_width = display_manager.matrix.width - self.display_height = display_manager.matrix.height + self.display_width = display_manager.width + self.display_height = display_manager.height else: # Fallback to width/height properties (which also check matrix) self.display_width = getattr(display_manager, "width", 128) @@ -1220,8 +1220,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) @@ -1780,8 +1780,8 @@ def _draw_scorebug_layout(self, game: Dict, force_clear: bool = False) -> None: self.display_manager.clear() # Use display_manager.matrix dimensions directly to ensure full display coverage - display_width = self.display_manager.matrix.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width - display_height = self.display_manager.matrix.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height + display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width + display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height main_img = Image.new( "RGBA", (display_width, display_height), (0, 0, 0, 255) diff --git a/plugins/web-ui-info/manager.py b/plugins/web-ui-info/manager.py index ea75f645..e9b157ae 100644 --- a/plugins/web-ui-info/manager.py +++ b/plugins/web-ui-info/manager.py @@ -227,8 +227,8 @@ def display(self, force_clear: bool = False) -> None: self.display_manager.clear() # Get display dimensions - width = self.display_manager.matrix.width - height = self.display_manager.matrix.height + width = self.display_manager.width + height = self.display_manager.height # Create a new image for the display img = Image.new('RGB', (width, height), (0, 0, 0)) diff --git a/plugins/web-ui-info/manifest.json b/plugins/web-ui-info/manifest.json index 63b226fc..e69cc97b 100644 --- a/plugins/web-ui-info/manifest.json +++ b/plugins/web-ui-info/manifest.json @@ -1,7 +1,7 @@ { "id": "web-ui-info", "name": "Web UI Info", - "version": "1.0.0", + "version": "1.0.1", "author": "LEDMatrix", "description": "Displays the web UI URL for easy access. Shows 'visit web ui at http://[deviceID]:5000'", "entry_point": "manager.py", @@ -19,4 +19,3 @@ "update_interval": 300, "default_duration": 10 } - diff --git a/plugins/youtube-stats/manager.py b/plugins/youtube-stats/manager.py index 8eaf14cc..e46e62de 100644 --- a/plugins/youtube-stats/manager.py +++ b/plugins/youtube-stats/manager.py @@ -185,8 +185,8 @@ def _create_display(self, channel_stats: Dict[str, Any]) -> Optional[Image.Image try: # Create a new image with the matrix dimensions - matrix_width = self.display_manager.matrix.width - matrix_height = self.display_manager.matrix.height + matrix_width = self.display_manager.width + matrix_height = self.display_manager.height image = Image.new('RGB', (matrix_width, matrix_height)) draw = ImageDraw.Draw(image) diff --git a/plugins/youtube-stats/manifest.json b/plugins/youtube-stats/manifest.json index 2b854dcc..650ec4ec 100644 --- a/plugins/youtube-stats/manifest.json +++ b/plugins/youtube-stats/manifest.json @@ -1,7 +1,7 @@ { "id": "youtube-stats", "name": "YouTube Stats", - "version": "1.0.0", + "version": "1.0.1", "author": "ChuckBuilds", "description": "Display YouTube channel statistics including subscriber count, total views, and channel name on your LED matrix", "category": "social",