Refactor YouTubeDisplay to use shared DisplayManager and follow consistent display pattern

This commit is contained in:
ChuckBuilds
2025-04-22 10:47:54 -05:00
parent a33adf6338
commit f303ea69b5
2 changed files with 34 additions and 14 deletions

View File

@@ -35,7 +35,7 @@ class DisplayController:
self.stocks = StockManager(self.config, self.display_manager) if self.config.get('stocks', {}).get('enabled', False) else None self.stocks = StockManager(self.config, self.display_manager) if self.config.get('stocks', {}).get('enabled', False) else None
self.news = StockNewsManager(self.config, self.display_manager) if self.config.get('stock_news', {}).get('enabled', False) else None self.news = StockNewsManager(self.config, self.display_manager) if self.config.get('stock_news', {}).get('enabled', False) else None
self.calendar = CalendarManager(self.display_manager.matrix, self.display_manager.current_canvas, self.config) if self.config.get('calendar', {}).get('enabled', False) else None self.calendar = CalendarManager(self.display_manager.matrix, self.display_manager.current_canvas, self.config) if self.config.get('calendar', {}).get('enabled', False) else None
self.youtube = YouTubeDisplay() if self.config.get('youtube', {}).get('enabled', False) else None self.youtube = YouTubeDisplay(self.display_manager, self.config_manager.config_path, self.config_manager.secrets_path) if self.config.get('youtube', {}).get('enabled', False) else None
logger.info(f"Calendar Manager initialized: {'Object' if self.calendar else 'None'}") logger.info(f"Calendar Manager initialized: {'Object' if self.calendar else 'None'}")
logger.info("Display modes initialized in %.3f seconds", time.time() - init_time) logger.info("Display modes initialized in %.3f seconds", time.time() - init_time)
@@ -142,7 +142,7 @@ class DisplayController:
if self.stocks: self.stocks.update_stock_data() if self.stocks: self.stocks.update_stock_data()
if self.news: self.news.update_news_data() if self.news: self.news.update_news_data()
if self.calendar: self.calendar.update(time.time()) if self.calendar: self.calendar.update(time.time())
if self.youtube: self.youtube.run() if self.youtube: self.youtube.update()
# Update NHL managers # Update NHL managers
if self.nhl_live: self.nhl_live.update() if self.nhl_live: self.nhl_live.update()
@@ -385,7 +385,7 @@ class DisplayController:
self.nba_upcoming.display(force_clear=self.force_clear) self.nba_upcoming.display(force_clear=self.force_clear)
elif self.current_display_mode == 'youtube' and self.youtube: elif self.current_display_mode == 'youtube' and self.youtube:
self.youtube.display() self.youtube.display(force_clear=self.force_clear)
except Exception as e: except Exception as e:
logger.error(f"Error updating display for mode {self.current_display_mode}: {e}", exc_info=True) logger.error(f"Error updating display for mode {self.current_display_mode}: {e}", exc_info=True)

View File

@@ -1,19 +1,28 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import json import json
import time import time
import logging
from PIL import Image, ImageDraw, ImageFont from PIL import Image, ImageDraw, ImageFont
import requests import requests
from rgbmatrix import RGBMatrix, RGBMatrixOptions from rgbmatrix import RGBMatrix, RGBMatrixOptions
import os import os
from typing import Dict, Any
# Get logger without configuring
logger = logging.getLogger(__name__)
class YouTubeDisplay: class YouTubeDisplay:
def __init__(self, config_path='config/config.json', secrets_path='config/config_secrets.json'): def __init__(self, display_manager, config_path='config/config.json', secrets_path='config/config_secrets.json'):
self.config = self._load_config(config_path) self.config = self._load_config(config_path)
self.secrets = self._load_config(secrets_path) self.secrets = self._load_config(secrets_path)
self.matrix = self._setup_matrix() self.matrix = self._setup_matrix()
self.canvas = self.matrix.CreateFrameCanvas() self.canvas = self.matrix.CreateFrameCanvas()
self.font = ImageFont.truetype("assets/fonts/PressStart2P-Regular.ttf", 8) self.font = ImageFont.truetype("assets/fonts/PressStart2P-Regular.ttf", 8)
self.youtube_logo = Image.open("assets/youtube_logo.png") self.youtube_logo = Image.open("assets/youtube_logo.png")
self.display_manager = display_manager
self.last_update = 0
self.update_interval = self.config.get('youtube', {}).get('update_interval', 300) # Default 5 minutes
self.channel_stats = None
def _load_config(self, config_path): def _load_config(self, config_path):
with open(config_path, 'r') as f: with open(config_path, 'r') as f:
@@ -53,7 +62,7 @@ class YouTubeDisplay:
'views': int(channel['statistics']['viewCount']) 'views': int(channel['statistics']['viewCount'])
} }
except Exception as e: except Exception as e:
print(f"Error fetching YouTube stats: {e}") logger.error(f"Error fetching YouTube stats: {e}")
return None return None
def _create_display(self, channel_stats): def _create_display(self, channel_stats):
@@ -91,19 +100,30 @@ class YouTubeDisplay:
return image return image
def run(self): def update(self):
"""Update YouTube channel stats if needed."""
current_time = time.time()
if current_time - self.last_update >= self.update_interval:
channel_id = self.secrets['youtube']['channel_id']
self.channel_stats = self._get_channel_stats(channel_id)
self.last_update = current_time
def display(self, force_clear: bool = False):
"""Display YouTube channel stats."""
if not self.config.get('youtube', {}).get('enabled', False): if not self.config.get('youtube', {}).get('enabled', False):
return return
channel_id = self.secrets['youtube']['channel_id'] if not self.channel_stats:
duration = self.config['display']['display_durations']['youtube'] self.update()
channel_stats = self._get_channel_stats(channel_id)
if channel_stats: if self.channel_stats:
display_image = self._create_display(channel_stats) if force_clear:
self.matrix.Clear()
display_image = self._create_display(self.channel_stats)
self.canvas.SetImage(display_image) self.canvas.SetImage(display_image)
self.matrix.SwapOnVSync(self.canvas) self.matrix.SwapOnVSync(self.canvas)
time.sleep(duration) time.sleep(self.update_interval)
def cleanup(self): def cleanup(self):
self.matrix.Clear() self.matrix.Clear()
@@ -111,5 +131,5 @@ class YouTubeDisplay:
if __name__ == "__main__": if __name__ == "__main__":
# Example usage # Example usage
youtube_display = YouTubeDisplay() youtube_display = YouTubeDisplay()
youtube_display.run() youtube_display.display()
youtube_display.cleanup() youtube_display.cleanup()