Fix ncaafb ranking display (#45)

* Fix NCAAFB ranking display issue

- Remove duplicate ranking system that was drawing rankings behind team logos
- Old system (_get_rank) was drawing rankings at top of logos
- New system (_fetch_team_rankings) correctly draws rankings in bottom corners
- Remove old ranking calls from live, recent, and upcoming game drawing functions
- Remove unnecessary _fetch_rankings() calls from update methods
- Rankings now only appear in designated corner positions, not overlapping logos

Fixes issue where team rankings/betting lines were being drawn behind
team logos instead of replacing team records in the corners.

* Add missing show_ranking and show_records options to NCAAFB web UI

- Add show_ranking option to NCAAFB scoreboard config template
- Add show_records and show_ranking toggle switches to NCAAFB web UI
- Update JavaScript form collection to include new fields
- Users can now control whether to show team records or rankings via web interface

This completes the fix for NCAAFB ranking display - users can now enable
show_ranking in the web UI to see AP Top 25 rankings instead of team records.
This commit is contained in:
Chuck
2025-09-17 14:46:57 -04:00
committed by GitHub
parent 379e2c3714
commit 6fcc93cab8
3 changed files with 27 additions and 62 deletions

View File

@@ -305,6 +305,7 @@
], ],
"logo_dir": "assets/sports/ncaa_logos", "logo_dir": "assets/sports/ncaa_logos",
"show_records": true, "show_records": true,
"show_ranking": true,
"display_modes": { "display_modes": {
"ncaa_fb_live": true, "ncaa_fb_live": true,
"ncaa_fb_recent": true, "ncaa_fb_recent": true,

View File

@@ -870,9 +870,6 @@ class NCAAFBLiveManager(BaseNCAAFBManager): # Renamed class
self.logger.warning("[NCAAFB] Test mode: Could not parse clock") # Changed log prefix self.logger.warning("[NCAAFB] Test mode: Could not parse clock") # Changed log prefix
# No actual display call here, let main loop handle it # No actual display call here, let main loop handle it
else: else:
# Fetch rankings
self._fetch_rankings()
# Fetch live game data # Fetch live game data
data = self._fetch_data() data = self._fetch_data()
new_live_games = [] new_live_games = []
@@ -1000,23 +997,7 @@ class NCAAFBLiveManager(BaseNCAAFBManager): # Renamed class
main_img.paste(away_logo, (away_x, away_y), away_logo) main_img.paste(away_logo, (away_x, away_y), away_logo)
# --- Draw Text Elements on Overlay --- # --- Draw Text Elements on Overlay ---
# Ranking (if ranked) # Note: Rankings are now handled in the records/rankings section below
home_rank = self._get_rank(game["home_abbr"])
away_rank = self._get_rank(game["away_abbr"])
if home_rank > 0:
rank_text = str(home_rank)
rank_width = draw_overlay.textlength(rank_text, font=self.fonts['rank'])
rank_x = home_x - 8
rank_y = 2
self._draw_text_with_outline(draw_overlay, rank_text, (rank_x, rank_y), self.fonts['rank'])
if away_rank > 0:
rank_text = str(away_rank)
rank_width = draw_overlay.textlength(rank_text, font=self.fonts['rank'])
rank_x = away_x + away_logo.width + 8
rank_y = 2
self._draw_text_with_outline(draw_overlay, rank_text, (rank_x, rank_y), self.fonts['rank'])
# Scores (centered, slightly above bottom) # Scores (centered, slightly above bottom)
home_score = str(game.get("home_score", "0")) home_score = str(game.get("home_score", "0"))
@@ -1161,9 +1142,6 @@ class NCAAFBRecentManager(BaseNCAAFBManager): # Renamed class
self.last_update = current_time # Update time even if fetch fails self.last_update = current_time # Update time even if fetch fails
try: try:
# Fetch rankings
self._fetch_rankings()
data = self._fetch_data() # Uses shared cache data = self._fetch_data() # Uses shared cache
if not data or 'events' not in data: if not data or 'events' not in data:
self.logger.warning("[NCAAFB Recent] No events found in shared data.") # Changed log prefix self.logger.warning("[NCAAFB Recent] No events found in shared data.") # Changed log prefix
@@ -1297,23 +1275,7 @@ class NCAAFBRecentManager(BaseNCAAFBManager): # Renamed class
main_img.paste(away_logo, (away_x, away_y), away_logo) main_img.paste(away_logo, (away_x, away_y), away_logo)
# Draw Text Elements on Overlay # Draw Text Elements on Overlay
# Ranking (if ranked) # Note: Rankings are now handled in the records/rankings section below
home_rank = self._get_rank(game["home_abbr"])
away_rank = self._get_rank(game["away_abbr"])
if home_rank > 0:
rank_text = str(home_rank)
rank_width = draw_overlay.textlength(rank_text, font=self.fonts['rank'])
rank_x = home_x - 8
rank_y = 2
self._draw_text_with_outline(draw_overlay, rank_text, (rank_x, rank_y), self.fonts['rank'])
if away_rank > 0:
rank_text = str(away_rank)
rank_width = draw_overlay.textlength(rank_text, font=self.fonts['rank'])
rank_x = away_x + away_logo.width - 8
rank_y = 2
self._draw_text_with_outline(draw_overlay, rank_text, (rank_x, rank_y), self.fonts['rank'])
# Final Scores (Centered, same position as live) # Final Scores (Centered, same position as live)
home_score = str(game.get("home_score", "0")) home_score = str(game.get("home_score", "0"))
@@ -1479,9 +1441,6 @@ class NCAAFBUpcomingManager(BaseNCAAFBManager): # Renamed class
self.last_update = current_time self.last_update = current_time
try: try:
# Fetch rankings
self._fetch_rankings()
data = self._fetch_data() # Uses shared cache data = self._fetch_data() # Uses shared cache
if not data or 'events' not in data: if not data or 'events' not in data:
self.logger.warning("[NCAAFB Upcoming] No events found in shared data.") # Changed log prefix self.logger.warning("[NCAAFB Upcoming] No events found in shared data.") # Changed log prefix
@@ -1669,24 +1628,7 @@ class NCAAFBUpcomingManager(BaseNCAAFBManager): # Renamed class
game_date = game.get("game_date", "") game_date = game.get("game_date", "")
game_time = game.get("game_time", "") game_time = game.get("game_time", "")
# Ranking (if ranked) # Note: Rankings are now handled in the records/rankings section below
home_rank = self._get_rank(game["home_abbr"])
away_rank = self._get_rank(game["away_abbr"])
if home_rank > 0:
rank_text = str(home_rank)
rank_width = draw_overlay.textlength(rank_text, font=self.fonts['rank'])
rank_x = home_x - 8
rank_y = 2
self._draw_text_with_outline(draw_overlay, rank_text, (rank_x, rank_y), self.fonts['rank'])
if away_rank > 0:
rank_text = str(away_rank)
rank_width = draw_overlay.textlength(rank_text, font=self.fonts['rank'])
rank_x = away_x + away_logo.width - 8
rank_y = 2
self._draw_text_with_outline(draw_overlay, rank_text, (rank_x, rank_y), self.fonts['rank'])
# "Next Game" at the top (use smaller status font) # "Next Game" at the top (use smaller status font)
status_text = "Next Game" status_text = "Next Game"

View File

@@ -1277,6 +1277,26 @@
</div> </div>
<div class="description">Only display games involving your favorite teams</div> <div class="description">Only display games involving your favorite teams</div>
</div> </div>
<div class="form-group">
<label for="ncaa_fb_show_records">Show Team Records:</label>
<div class="toggle-container">
<label class="toggle-switch">
<input type="checkbox" id="ncaa_fb_show_records" name="ncaa_fb_show_records" {% if main_config.ncaa_fb_scoreboard.show_records %}checked{% endif %}>
<span class="slider"></span>
</label>
</div>
<div class="description">Display team win-loss records in bottom corners</div>
</div>
<div class="form-group">
<label for="ncaa_fb_show_ranking">Show Team Rankings:</label>
<div class="toggle-container">
<label class="toggle-switch">
<input type="checkbox" id="ncaa_fb_show_ranking" name="ncaa_fb_show_ranking" {% if main_config.ncaa_fb_scoreboard.show_ranking %}checked{% endif %}>
<span class="slider"></span>
</label>
</div>
<div class="description">Display AP Top 25 rankings instead of records for ranked teams</div>
</div>
</div> </div>
<div class="config-section"> <div class="config-section">
@@ -2894,7 +2914,9 @@
live_priority: document.getElementById('ncaa_fb_live_priority').checked, live_priority: document.getElementById('ncaa_fb_live_priority').checked,
live_game_duration: parseInt(document.getElementById('ncaa_fb_live_game_duration').value), live_game_duration: parseInt(document.getElementById('ncaa_fb_live_game_duration').value),
show_odds: document.getElementById('ncaa_fb_show_odds').checked, show_odds: document.getElementById('ncaa_fb_show_odds').checked,
show_favorite_teams_only: document.getElementById('ncaa_fb_show_favorite_teams_only').checked show_favorite_teams_only: document.getElementById('ncaa_fb_show_favorite_teams_only').checked,
show_records: document.getElementById('ncaa_fb_show_records').checked,
show_ranking: document.getElementById('ncaa_fb_show_ranking').checked
}, },
ncaa_baseball_scoreboard: { ncaa_baseball_scoreboard: {
enabled: document.getElementById('ncaa_baseball_enabled').checked, enabled: document.getElementById('ncaa_baseball_enabled').checked,