Resolving fixes

This commit is contained in:
2026-03-22 14:36:13 +01:00
parent e50ca19b94
commit b2bc16dfab
2 changed files with 22 additions and 17 deletions

View File

@@ -20,7 +20,7 @@ resolver:
1. dánsko: 119
1. francie: 61
1. itálie: 135
1. itálie - ženy: 794
1. itálie - ženy: 139
1. německo: 78
1. nizozemsko: 88
1. polsko: 106
@@ -30,7 +30,7 @@ resolver:
1. skotsko: 179
1. slovensko: 332
1. španělsko: 140
1. wales: 771
1. wales: 110
# Second divisions
2. anglie: 40
2. česko: 346
@@ -39,7 +39,7 @@ resolver:
2. německo: 79
2. nizozemsko: 89
2. rakousko: 219
2. slovensko: 333
2. slovensko: 506
2. španělsko: 141
# Third divisions
3. francie: 63

View File

@@ -167,8 +167,11 @@ class TicketResolver:
league_id, league_conf = self._resolve_league(bet.league)
cache_key = (date_str, league_id)
window_end = center + timedelta(days=_DATE_WINDOW)
cache_may_be_stale = window_end >= date.today()
if cache_key not in self._fixture_cache:
if cache_key in self._disk_cache:
if cache_key in self._disk_cache and not cache_may_be_stale:
self._fixture_cache[cache_key] = self._disk_cache[cache_key]
print(_ansi.gray(f" │ /fixtures served from disk cache ({len(self._fixture_cache[cache_key])} fixtures)"))
else:
@@ -183,10 +186,10 @@ class TicketResolver:
resp.raise_for_status()
self._fixture_cache[cache_key] = resp.json().get("response", [])
print(_ansi.gray(f"{len(self._fixture_cache[cache_key])} fixtures returned"))
finished = [f for f in self._fixture_cache[cache_key] if _is_finished(f) == 1.0]
if finished:
self._disk_cache[cache_key] = finished
print(_ansi.gray(f"{len(finished)} finished fixture(s) written to disk cache"))
cacheable = [f for f in self._fixture_cache[cache_key] if f.get("fixture", {}).get("status", {}).get("short") != "NS"]
if cacheable:
self._disk_cache[cache_key] = cacheable
print(_ansi.gray(f"{len(cacheable)} non-NS fixture(s) written to disk cache"))
else:
print(_ansi.gray(f" │ /fixtures (±{_DATE_WINDOW}d of {date_str}, league={league_id}) served from memory"))
@@ -200,11 +203,16 @@ class TicketResolver:
if key in self._league_cache:
return self._league_cache[key]
for pattern, league_id in self._league_map.items():
if pattern in key:
print(_ansi.gray(f" │ league {league_name!r} -> id={league_id} (static map)"))
self._league_cache[key] = (league_id, 1.0)
return league_id, 1.0
# Use longest-match so "1. itálie - ženy" beats "1. itálie"
best_pattern, best_id = max(
((p, lid) for p, lid in self._league_map.items() if p in key),
key=lambda t: len(t[0]),
default=(None, None),
)
if best_id is not None:
print(_ansi.gray(f" │ league {league_name!r} -> id={best_id} (static map, pattern={best_pattern!r})"))
self._league_cache[key] = (best_id, 1.0)
return best_id, 1.0
# Fall back to API search — lower confidence since first result is taken unverified
print(_ansi.gray(f" │ GET /leagues search={league_name!r}"))
@@ -278,10 +286,7 @@ def _best_fixture_match(fixtures: list[dict[str, Any]], team1: str, team2: str,
for f in fixtures:
home = f["teams"]["home"]["name"]
away = f["teams"]["away"]["name"]
name_score = max(
_similarity(team1, home) + _similarity(team2, away),
_similarity(team1, away) + _similarity(team2, home),
) / 2
name_score = (_similarity(team1, home) + _similarity(team2, away)) / 2
date_prox = _date_proximity(f, center)
# Name similarity is the primary signal; date proximity is a tiebreaker
combined = name_score * 0.8 + date_prox * 0.2