From 6a4644007dd1896e3104056923f615e9283b931e Mon Sep 17 00:00:00 2001 From: sarjent <35471573+sarjent@users.noreply.github.com> Date: Thu, 14 May 2026 17:09:16 -0500 Subject: [PATCH] fix(display): Vegas excluded plugins always showing as checked (#332) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(cache): check odds keys before generic live check in get_data_type_from_key Cache keys like odds_espn_basketball_nba__live contain both 'odds' and 'live'. The previous ordering matched the generic 'live' check first, returning 'sports_live' (30 s TTL) instead of the correct 'odds_live' (120 s TTL). This caused the ESPN odds API to be hit every 30 s per live game, frequently triggering the 3-second per-request timeout and returning no odds data. Moving the 'odds' check above the generic 'live' block restores the correct 120-second cache TTL for in-progress game odds. Co-Authored-By: Claude Sonnet 4.6 * fix(display): use single-quoted HTML attributes for JSON hidden inputs Placing |tojson output (which contains double quotes) inside a double-quoted HTML attribute broke the attribute — browsers closed the attribute at the first inner quote, leaving JS with an empty or truncated value. JSON.parse then failed silently, leaving excluded=[] so all Vegas scroll plugins appeared checked (included) regardless of the actual excluded_plugins config. Switch to single-quoted HTML attributes so the JSON double quotes are valid inside the attribute value. Co-Authored-By: Claude Sonnet 4.6 --------- Co-authored-by: Claude Sonnet 4.6 --- src/cache/cache_strategy.py | 24 ++++++++++--------- .../templates/v3/partials/display.html | 4 ++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/cache/cache_strategy.py b/src/cache/cache_strategy.py index 32266835..7c6bfd56 100644 --- a/src/cache/cache_strategy.py +++ b/src/cache/cache_strategy.py @@ -193,19 +193,21 @@ class CacheStrategy: Data type string for strategy lookup """ key_lower = key.lower() - - # Odds data — checked FIRST because odds keys may also contain 'live'/'current' - # (e.g. odds_espn_nba_game_123_live). The odds TTL (120s for live, 1800s for - # upcoming) must win over the generic sports_live TTL (30s) to avoid hitting - # the ESPN odds API every 30 seconds per game. - if 'odds' in key_lower: - # For live games, use shorter cache; for upcoming games, use longer cache - if any(x in key_lower for x in ['live', 'current']): - return 'odds_live' # Live odds change more frequently (120s TTL) - return 'odds' # Regular odds for upcoming games (1800s TTL) - # Live sports data (only reached if key does NOT contain 'odds') + # Odds data — checked before the generic 'live' block below because + # live-odds cache keys (e.g. odds_espn_basketball_nba__live) contain + # both 'odds' AND 'live'. Without this ordering the 'live' check below + # would match first and return 'sports_live' (30 s TTL) instead of the + # correct 'odds_live' (120 s TTL). + if 'odds' in key_lower: + if any(x in key_lower for x in ['live', 'current']): + return 'odds_live' # Live odds change more frequently + return 'odds' # Regular odds for upcoming games + + # Live sports data if any(x in key_lower for x in ['live', 'current', 'scoreboard']): + if 'soccer' in key_lower: + return 'sports_live' # Soccer live data is very time-sensitive return 'sports_live' # Weather data diff --git a/web_interface/templates/v3/partials/display.html b/web_interface/templates/v3/partials/display.html index ba47228d..dba6f219 100644 --- a/web_interface/templates/v3/partials/display.html +++ b/web_interface/templates/v3/partials/display.html @@ -380,8 +380,8 @@

Loading plugins...

- - + +