mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-04-12 13:42:59 +00:00
MLB gambling display improvements
This commit is contained in:
@@ -266,35 +266,107 @@ class BaseMLBManager:
|
|||||||
self.display_manager.draw = draw
|
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)
|
self.display_manager._draw_bdf_text(status_text, status_x, status_y, color=(255, 255, 255), font=self.display_manager.calendar_font)
|
||||||
|
|
||||||
# DEBUG: Draw spread in the center. If not available, show score.
|
# DEBUG: Draw spread in the center to check if data is loading
|
||||||
display_text = None
|
|
||||||
font = ImageFont.truetype("assets/fonts/PressStart2P-Regular.ttf", 12)
|
|
||||||
text_color = (255, 255, 255)
|
|
||||||
|
|
||||||
if 'odds' in game_data and game_data['odds']:
|
if 'odds' in game_data and game_data['odds']:
|
||||||
odds = game_data['odds']
|
odds = game_data['odds']
|
||||||
home_team_odds = odds.get('home_team_odds', {})
|
home_team_odds = odds.get('home_team_odds', {})
|
||||||
|
away_team_odds = odds.get('away_team_odds', {})
|
||||||
home_spread = home_team_odds.get('spread_odds')
|
home_spread = home_team_odds.get('spread_odds')
|
||||||
|
away_spread = away_team_odds.get('spread_odds')
|
||||||
|
|
||||||
if home_spread is None:
|
if home_spread is None:
|
||||||
# Fallback for different API structures
|
# Fallback for different API structures
|
||||||
home_spread = odds.get('spread')
|
home_spread = odds.get('spread')
|
||||||
|
|
||||||
if home_spread is not None:
|
# Show away team spread on left side
|
||||||
display_text = str(home_spread)
|
if away_spread is not None:
|
||||||
text_color = (0, 255, 0) # Green for debug
|
away_spread_text = str(away_spread)
|
||||||
|
font = self.display_manager.small_font
|
||||||
|
away_spread_width = draw.textlength(away_spread_text, font=font)
|
||||||
|
away_spread_x = 2 # Top left for away team
|
||||||
|
away_spread_y = 2
|
||||||
|
self._draw_text_with_outline(draw, away_spread_text, (away_spread_x, away_spread_y), font, fill=(0, 255, 0))
|
||||||
|
|
||||||
# If spread was not found, fallback to score
|
# Show home team spread on right side
|
||||||
if display_text is None:
|
if home_spread is not None:
|
||||||
|
home_spread_text = str(home_spread)
|
||||||
|
font = self.display_manager.small_font
|
||||||
|
home_spread_width = draw.textlength(home_spread_text, font=font)
|
||||||
|
home_spread_x = width - home_spread_width - 2 # Top right for home team
|
||||||
|
home_spread_y = 2
|
||||||
|
self._draw_text_with_outline(draw, home_spread_text, (home_spread_x, home_spread_y), font, fill=(0, 255, 0))
|
||||||
|
|
||||||
|
# Also show over/under at bottom center
|
||||||
|
over_under = odds.get('over_under')
|
||||||
|
if over_under is not None:
|
||||||
|
ou_text = f"O/U: {over_under}"
|
||||||
|
ou_width = draw.textlength(ou_text, font=font)
|
||||||
|
ou_x = (width - ou_width) // 2
|
||||||
|
ou_y = height - font.size - 2
|
||||||
|
self._draw_text_with_outline(draw, ou_text, (ou_x, ou_y), font, fill=(0, 255, 0))
|
||||||
|
|
||||||
|
# For recent/final games, show scores and status
|
||||||
|
elif game_data['status'] in ['status_final', 'final', 'completed']:
|
||||||
|
# Show "Final" at the top using NHL-style font
|
||||||
|
status_text = "Final"
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
# Show spreads and over/under if available
|
||||||
|
if 'odds' in game_data and game_data['odds']:
|
||||||
|
odds = game_data['odds']
|
||||||
|
home_team_odds = odds.get('home_team_odds', {})
|
||||||
|
away_team_odds = odds.get('away_team_odds', {})
|
||||||
|
home_spread = home_team_odds.get('spread_odds')
|
||||||
|
away_spread = away_team_odds.get('spread_odds')
|
||||||
|
|
||||||
|
if home_spread is None:
|
||||||
|
# Fallback for different API structures
|
||||||
|
home_spread = odds.get('spread')
|
||||||
|
|
||||||
|
# Show away team spread on left side
|
||||||
|
if away_spread is not None:
|
||||||
|
away_spread_text = str(away_spread)
|
||||||
|
font = self.display_manager.small_font
|
||||||
|
away_spread_width = draw.textlength(away_spread_text, font=font)
|
||||||
|
away_spread_x = 2 # Top left for away team
|
||||||
|
away_spread_y = 2
|
||||||
|
self._draw_text_with_outline(draw, away_spread_text, (away_spread_x, away_spread_y), font, fill=(0, 255, 0))
|
||||||
|
|
||||||
|
# Show home team spread on right side
|
||||||
|
if home_spread is not None:
|
||||||
|
home_spread_text = str(home_spread)
|
||||||
|
font = self.display_manager.small_font
|
||||||
|
home_spread_width = draw.textlength(home_spread_text, font=font)
|
||||||
|
home_spread_x = width - home_spread_width - 2 # Top right for home team
|
||||||
|
home_spread_y = 2
|
||||||
|
self._draw_text_with_outline(draw, home_spread_text, (home_spread_x, home_spread_y), font, fill=(0, 255, 0))
|
||||||
|
|
||||||
|
# Also show over/under at bottom center
|
||||||
|
over_under = odds.get('over_under')
|
||||||
|
if over_under is not None:
|
||||||
|
ou_text = f"O/U: {over_under}"
|
||||||
|
ou_width = draw.textlength(ou_text, font=font)
|
||||||
|
ou_x = (width - ou_width) // 2
|
||||||
|
ou_y = height - font.size - 2
|
||||||
|
self._draw_text_with_outline(draw, ou_text, (ou_x, ou_y), font, fill=(0, 255, 0))
|
||||||
|
|
||||||
|
# Show score in center if no odds available
|
||||||
|
if 'odds' not in game_data or not game_data['odds']:
|
||||||
away_score = str(game_data['away_score'])
|
away_score = str(game_data['away_score'])
|
||||||
home_score = str(game_data['home_score'])
|
home_score = str(game_data['home_score'])
|
||||||
display_text = f"{away_score}-{home_score}"
|
display_text = f"{away_score}-{home_score}"
|
||||||
|
font = ImageFont.truetype("assets/fonts/PressStart2P-Regular.ttf", 12)
|
||||||
# Draw the determined text
|
display_width = draw.textlength(display_text, font=font)
|
||||||
display_width = draw.textlength(display_text, font=font)
|
display_x = (width - display_width) // 2
|
||||||
display_x = (width - display_width) // 2
|
display_y = (height - font.size) // 2
|
||||||
display_y = (height - font.size) // 2
|
self._draw_text_with_outline(draw, display_text, (display_x, display_y), font, fill=(255, 255, 255))
|
||||||
self._draw_text_with_outline(draw, display_text, (display_x, display_y), font, fill=text_color)
|
|
||||||
|
|
||||||
# For live games, show detailed game state
|
# For live games, show detailed game state
|
||||||
elif game_data['status'] == 'status_in_progress' or game_data.get('live', False):
|
elif game_data['status'] == 'status_in_progress' or game_data.get('live', False):
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class OddsManager:
|
|||||||
response = requests.get(url)
|
response = requests.get(url)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
raw_data = response.json()
|
raw_data = response.json()
|
||||||
self.logger.info(f"Received raw odds data from ESPN: {json.dumps(raw_data, indent=2)}")
|
self.logger.debug(f"Received raw odds data from ESPN: {json.dumps(raw_data, indent=2)}")
|
||||||
|
|
||||||
odds_data = self._extract_espn_data(raw_data)
|
odds_data = self._extract_espn_data(raw_data)
|
||||||
self.logger.info(f"Extracted odds data: {odds_data}")
|
self.logger.info(f"Extracted odds data: {odds_data}")
|
||||||
@@ -50,35 +50,29 @@ class OddsManager:
|
|||||||
return self.cache_manager.load_cache(cache_key)
|
return self.cache_manager.load_cache(cache_key)
|
||||||
|
|
||||||
def _extract_espn_data(self, data: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
def _extract_espn_data(self, data: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
||||||
self.logger.info(f"Extracting ESPN odds data. Data keys: {list(data.keys())}")
|
self.logger.debug(f"Extracting ESPN odds data. Data keys: {list(data.keys())}")
|
||||||
|
|
||||||
if "items" in data and data["items"]:
|
if "items" in data and data["items"]:
|
||||||
self.logger.info(f"Found {len(data['items'])} items in odds data")
|
self.logger.debug(f"Found {len(data['items'])} items in odds data")
|
||||||
item = data["items"][0]
|
item = data["items"][0]
|
||||||
self.logger.info(f"First item keys: {list(item.keys())}")
|
self.logger.debug(f"First item keys: {list(item.keys())}")
|
||||||
|
|
||||||
providers = item.get('providers', [])
|
|
||||||
self.logger.info(f"Found {len(providers)} providers: {[p.get('name', 'N/A') for p in providers]}")
|
|
||||||
|
|
||||||
# Find the desired bookmaker, e.g., 'fanduel'
|
|
||||||
provider = next((p for p in item.get('providers', []) if p.get('name', '').lower() == 'fanduel'), item['providers'][0] if item.get('providers') else {})
|
|
||||||
self.logger.info(f"Selected provider: {provider.get('name', 'N/A')}")
|
|
||||||
self.logger.info(f"Provider details: {json.dumps(provider, indent=2)}")
|
|
||||||
|
|
||||||
|
# The ESPN API returns odds data directly in the item, not in a providers array
|
||||||
|
# Extract the odds data directly from the item
|
||||||
extracted_data = {
|
extracted_data = {
|
||||||
"details": provider.get("details"),
|
"details": item.get("details"),
|
||||||
"over_under": provider.get("overUnder"),
|
"over_under": item.get("overUnder"),
|
||||||
"spread": provider.get("spread"),
|
"spread": item.get("spread"),
|
||||||
"home_team_odds": {
|
"home_team_odds": {
|
||||||
"money_line": provider.get("homeTeamOdds", {}).get("moneyLine"),
|
"money_line": item.get("homeTeamOdds", {}).get("moneyLine"),
|
||||||
"spread_odds": provider.get("homeTeamOdds", {}).get("spreadOdds")
|
"spread_odds": item.get("homeTeamOdds", {}).get("current", {}).get("pointSpread", {}).get("value")
|
||||||
},
|
},
|
||||||
"away_team_odds": {
|
"away_team_odds": {
|
||||||
"money_line": provider.get("awayTeamOdds", {}).get("moneyLine"),
|
"money_line": item.get("awayTeamOdds", {}).get("moneyLine"),
|
||||||
"spread_odds": provider.get("awayTeamOdds", {}).get("spreadOdds")
|
"spread_odds": item.get("awayTeamOdds", {}).get("current", {}).get("pointSpread", {}).get("value")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.logger.info(f"Returning extracted odds data: {json.dumps(extracted_data, indent=2)}")
|
self.logger.debug(f"Returning extracted odds data: {json.dumps(extracted_data, indent=2)}")
|
||||||
return extracted_data
|
return extracted_data
|
||||||
|
|
||||||
self.logger.warning("No 'items' found in ESPN odds data.")
|
self.logger.warning("No 'items' found in ESPN odds data.")
|
||||||
|
|||||||
Reference in New Issue
Block a user