mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-04-12 21:43:00 +00:00
Implement headline rotation system for stock news display, respecting max_headlines_per_symbol and headlines_per_rotation settings
This commit is contained in:
@@ -37,8 +37,13 @@ class StockNewsManager:
|
|||||||
self.scroll_speed = self.stock_news_config.get('scroll_speed', 1)
|
self.scroll_speed = self.stock_news_config.get('scroll_speed', 1)
|
||||||
self.scroll_delay = self.stock_news_config.get('scroll_delay', 0.001) # Default to 1ms instead of 50ms
|
self.scroll_delay = self.stock_news_config.get('scroll_delay', 0.001) # Default to 1ms instead of 50ms
|
||||||
|
|
||||||
|
# Get headline settings from config
|
||||||
|
self.max_headlines_per_symbol = self.stock_news_config.get('max_headlines_per_symbol', 1)
|
||||||
|
self.headlines_per_rotation = self.stock_news_config.get('headlines_per_rotation', 2)
|
||||||
|
|
||||||
# Log the actual values being used
|
# Log the actual values being used
|
||||||
logger.info(f"Scroll settings - Speed: {self.scroll_speed} pixels/frame, Delay: {self.scroll_delay*1000:.2f}ms")
|
logger.info(f"Scroll settings - Speed: {self.scroll_speed} pixels/frame, Delay: {self.scroll_delay*1000:.2f}ms")
|
||||||
|
logger.info(f"Headline settings - Max per symbol: {self.max_headlines_per_symbol}, Per rotation: {self.headlines_per_rotation}")
|
||||||
|
|
||||||
# Initialize frame rate tracking
|
# Initialize frame rate tracking
|
||||||
self.frame_count = 0
|
self.frame_count = 0
|
||||||
@@ -52,6 +57,11 @@ class StockNewsManager:
|
|||||||
self.last_generation_start = 0 # When we started generating
|
self.last_generation_start = 0 # When we started generating
|
||||||
self.generation_timeout = 5 # Max seconds to spend generating
|
self.generation_timeout = 5 # Max seconds to spend generating
|
||||||
|
|
||||||
|
# Rotation tracking
|
||||||
|
self.all_news_items = [] # Store all available news items
|
||||||
|
self.current_rotation_index = 0 # Track which rotation we're on
|
||||||
|
self.rotation_complete = False # Flag to indicate when a full rotation is complete
|
||||||
|
|
||||||
self.headers = {
|
self.headers = {
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
|
||||||
}
|
}
|
||||||
@@ -303,31 +313,59 @@ class StockNewsManager:
|
|||||||
logger.warning("No news data available to display")
|
logger.warning("No news data available to display")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get all news items from all symbols
|
# Get all news items from all symbols, respecting max_headlines_per_symbol
|
||||||
all_news = []
|
if not self.all_news_items:
|
||||||
for symbol, news_items in self.news_data.items():
|
self.all_news_items = []
|
||||||
for item in news_items:
|
for symbol, news_items in self.news_data.items():
|
||||||
all_news.append({
|
# Limit the number of headlines per symbol
|
||||||
"symbol": symbol,
|
limited_items = news_items[:self.max_headlines_per_symbol]
|
||||||
"title": item["title"],
|
for item in limited_items:
|
||||||
"publisher": item["publisher"]
|
self.all_news_items.append({
|
||||||
})
|
"symbol": symbol,
|
||||||
|
"title": item["title"],
|
||||||
|
"publisher": item["publisher"]
|
||||||
|
})
|
||||||
|
|
||||||
if not all_news:
|
# Shuffle the news items for variety
|
||||||
|
random.shuffle(self.all_news_items)
|
||||||
|
logger.info(f"Prepared {len(self.all_news_items)} news items for rotation")
|
||||||
|
|
||||||
|
if not self.all_news_items:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Get the current rotation of headlines
|
||||||
|
start_idx = self.current_rotation_index * self.headlines_per_rotation
|
||||||
|
end_idx = min(start_idx + self.headlines_per_rotation, len(self.all_news_items))
|
||||||
|
|
||||||
|
# If we've reached the end, start over
|
||||||
|
if start_idx >= len(self.all_news_items):
|
||||||
|
self.current_rotation_index = 0
|
||||||
|
start_idx = 0
|
||||||
|
end_idx = min(self.headlines_per_rotation, len(self.all_news_items))
|
||||||
|
self.rotation_complete = True
|
||||||
|
logger.info("Completed a full rotation of news headlines")
|
||||||
|
|
||||||
|
# Get the current batch of headlines
|
||||||
|
current_news = self.all_news_items[start_idx:end_idx]
|
||||||
|
|
||||||
# Define width and height here, so they are always available
|
# Define width and height here, so they are always available
|
||||||
width = self.display_manager.matrix.width
|
width = self.display_manager.matrix.width
|
||||||
height = self.display_manager.matrix.height
|
height = self.display_manager.matrix.height
|
||||||
|
|
||||||
# Check if we need to generate a new image
|
# Check if we need to generate a new image
|
||||||
if self.cached_text_image is None:
|
if self.cached_text_image is None or self.rotation_complete:
|
||||||
|
# Reset rotation complete flag
|
||||||
|
self.rotation_complete = False
|
||||||
|
|
||||||
# Try to generate the image in the background
|
# Try to generate the image in the background
|
||||||
if self._generate_background_image(all_news, width, height):
|
if self._generate_background_image(current_news, width, height):
|
||||||
# If generation completed successfully, use the background image
|
# If generation completed successfully, use the background image
|
||||||
self.cached_text_image = self.background_image
|
self.cached_text_image = self.background_image
|
||||||
self.scroll_position = 0
|
self.scroll_position = 0
|
||||||
self.background_image = None # Clear the background image
|
self.background_image = None # Clear the background image
|
||||||
|
|
||||||
|
# Move to next rotation for next time
|
||||||
|
self.current_rotation_index += 1
|
||||||
else:
|
else:
|
||||||
# If still generating or failed, show a simple message
|
# If still generating or failed, show a simple message
|
||||||
self.display_manager.image.paste(Image.new('RGB', (width, height), (0, 0, 0)), (0, 0))
|
self.display_manager.image.paste(Image.new('RGB', (width, height), (0, 0, 0)), (0, 0))
|
||||||
@@ -356,6 +394,9 @@ class StockNewsManager:
|
|||||||
self.scroll_position += self.scroll_speed
|
self.scroll_position += self.scroll_speed
|
||||||
if self.scroll_position >= total_width:
|
if self.scroll_position >= total_width:
|
||||||
self.scroll_position = 0 # Wrap around
|
self.scroll_position = 0 # Wrap around
|
||||||
|
# When we wrap around, move to next rotation
|
||||||
|
self.cached_text_image = None
|
||||||
|
return True
|
||||||
|
|
||||||
# Calculate the visible portion
|
# Calculate the visible portion
|
||||||
# Handle wrap-around drawing
|
# Handle wrap-around drawing
|
||||||
|
|||||||
Reference in New Issue
Block a user