diff --git a/config/application.yml b/config/application.yml index 852e2fc..93d6049 100644 --- a/config/application.yml +++ b/config/application.yml @@ -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 diff --git a/src/beaky/resolvers/resolver.py b/src/beaky/resolvers/resolver.py index 24d1082..7a3fac5 100644 --- a/src/beaky/resolvers/resolver.py +++ b/src/beaky/resolvers/resolver.py @@ -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