Resolving fixes
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user