🐛 Bug Fixes
- Jellyfin 12 API-key authentication works again — Teamarr now sends the standard
Authorization: MediaBrowser Token=…header instead of the legacyX-Emby-Tokenthat Jellyfin 12 removed (#749) - Dispatcharr stream order converges every generation run instead of drifting until a priority changed (#712) — thanks @lpukatch (#713)
- Rank template variables resolve —
TeamStats.ranknow comes from ESPN's poll/rankings endpoints, which the team endpoint never carried (#710) — thanks @lpukatch (#711) - Dynamic channel-group and profile names with trailing whitespace resolve instead of being re-created and rejected every run (#745) — thanks @lpukatch (#746)
- Fuzzy matchup false positives rejected: a low-confidence side that shares no meaningful word with the event team no longer binds (Barrie Colts ≠ Erie Otters) (#730) — thanks @sethwv (#731)
- Single-team abbreviation matching no longer treats stop words like
THEas team codes (#705) — thanks @lpukatch (#706) - Gracenote category overrides and Pinned-Block league pins work for discovered (league_cache-only) leagues (#709, #720) — thanks @lpukatch (#719, #721)
- Interactive regex builder keeps digits in team names (#708) — thanks @lpukatch (#723)
- EPG matching splits ASCII-dash inline titles such as
Sport - Team vs Team(#727) — thanks @sethwv (#728) - Tennis doubles art URLs keep the pair separator so game thumbnails resolve both players (#699) — thanks @lpukatch (#700)
✨ New Features
{division}channel-group wildcard for NCAA football (FBS/FCS) (#717) — thanks @lpukatch (#718)- Dispatcharr channel-source stream-profile overrides — the top active stream's override applies, else the global default (#722) — thanks @sethwv (#725)
- Feed separation (home/away RSN splitting) is scoped per sport (#732) — thanks @lpukatch (#733)
- Preview modal shows the metadata extracted from each stream name and the real failure reason for misses — thanks @lpukatch (#714)
⚡ Enhancements
- Generation-run performance pass: EPG resolution inputs fetched once per run (#734), Dispatcharr stream-order pushes and paginated reads run concurrently (#735), the stream-matching candidate loop skips provable non-work (#742), and an optional inverted token index (
TEAMARR_TOKEN_INDEX=1) narrows candidates by ~98% with identical results (#747) — thanks @lpukatch (#738, #739, #743, #748) - The UI no longer blocks on live Dispatcharr catalog calls: account/group lists and the connection status poll are cached briefly (#736) — thanks @lpukatch (#740)
- Frontend routes are code-split with a pinned vendor chunk, so the first load ships far less JavaScript and a release invalidates app code only (#737) — thanks @lpukatch (#741)
🔧 Under the Hood
- Bead issue-id prefix renamed
teamarrv2-→teamarr-across the tracker and code comments - Dependency bumps: npm minor/patch group, Python minor/patch group, CodeQL action
Full changelog: v2.15.0...v2.16.0