v1.19.0 — real matchup logos on every channel, MLS importance unblocked, tennis/darts fix
Six changes: a user-reported matching bug, a scoring gap that had read zero all season, a second source of per-matchup logos, and the data to go with it.
Fixed: tennis and golf events matching other sports' channels (#169)
Reported by a user on v1.16.0 — WTA Warsaw T-Mobile Polish Open and ATP Cincinnati Open were both matching a PDC darts channel.
A tournament title's final token was emitted as a keyword strong enough to admit a candidate on its own, but for a field event that token is a generic competition noun shared across every sport. Measured over 22,137 real channel and stream names: Championship matched 383 of them, Open 157, Prix 93, Masters 87.
Replayed against a 6,708-channel snapshot, each reported event had been attaching 14 channels and ~140 streams of darts coverage. Removing the wildcard also recovered correct matches: Cincinnati Open now finds its real broadcast, and New Zealand Darts Masters finds the real PDC feed. 26 event names narrowed, 0 widened, and 0 of 184 real team names changed.
Fixed: MLS importance read ~0 all season (#65)
Not the external data gap the issue assumed. ESPN publishes the full remaining season on the scoreboard endpoint this plugin already uses — 241 future events, 195 intra-conference. The starvation was self-inflicted: the season sweep clamped itself to now + 7 days, and Monte Carlo importance projects each season to its end, so one week of fixtures cannot separate a bubble team's final standing from any other.
Live A/B, same code path, only the window differing: remaining fixtures 13 → 95, games with nonzero importance 9/18 → 18/18, playoff-bubble band 9/18 → 16/18.
Also fixed a latent correctness bug underneath it: target-match identity fell back to comparing kickoff times, so a fixture with no published date could be simulated twice in one season and silently corrupt the importance number.
Bonus: the season fetch went from ~300 HTTP calls to 1. The long-standing belief that ESPN's ranged scoreboard "caps at 25 events" was stale — an explicit limit lifts it, verified to return an identical event set to the per-day sweep.
Added: game-thumbs as a second matchup-logo tier (#174, #175)
TheSportsDB only has a thumbnail if it pre-rendered one for that specific indexed event. Measured on a live instance: 9 hits, 9 misses across 18 fixtures, with every MLS, Brazilian Serie A and NCAA soccer game falling through to a league badge that looks identical for every game in that league.
game-thumbs composites two team crests on request, so it resolves from the team pair alone. It slots between the SportsDB thumb and the badge. 30 leagues mapped, every slug confirmed live.
Measured on the real slate after this release: 6 SportsDB + 17 game-thumbs, 0 league badge, 0 source-channel logo — every curated channel now carries a real per-game image.
Plus 27 team-name aliases (#175) for leagues whose names differ from ESPN's vocabulary (CA Paranaense → Athletico-PR), each derived from the API's own authoritative team list rather than guessed.
New setting: game-thumbs base URL, defaulting to the public instance. Blank disables the tier. Self-host ghcr.io/sethwv/game-thumbs to escape its 30 requests/minute cap — the plugin paces under it and retries once, and never mistakes a rate limit for a missing team.
Added: league badges for field-event sports (#104)
F1, NASCAR, PGA, UFC, ATP, WTA and boxing now have a league badge. These sports have no opponent pair, so they can never earn a matchup composite — the badge is the best logo they will ever get.
Tests
3,654 → 3,769, zero failures, zero skips.