🎉 v2.4.0 — 2026-03-22
✨ New Features
- Feed Separation — detect HOME/AWAY tokens and team name patterns in stream names, automatically create separate channels per broadcast feed with configurable label styles: team name ("Orioles Feed"), abbreviation ("BAL Feed"), or home/away ("Home Feed"). Includes two-phase detection, channel discrimination via feed_team_id, settings UI, feed_hint audit logging, and comprehensive tests (
b113b07,d534fad,da6c0c7,22669a3,930f8dd,ba97529,12ba795,970f3e4) - Emby Integration — new Emby Live TV guide auto-refresh after EPG generation with API key auth (preferred) or username/password fallback, connection test UI, and progress reporting during generation (
0b306e4,17b4f7f,c58cad7) - League Alias Search — search leagues by alias in the LeaguePicker — thanks @lpukatch (#171) (
439ef81)
🐛 Bug Fixes
- Fix startup crash on upgrade for pre-v69 databases missing feed_team_id column (
f5e8f59,9cd230b) - Fix exception keyword labels being incorrectly title-cased (
17d5431) - Fix feed separation labels not matching UI dropdown examples — now correctly shows "Orioles Feed" / "BAL Feed" / "Home Feed" (
970f3e4)
⚡ Enhancements
- External polling timeouts extended to 5 minutes for M3U, EPG, and Emby refresh steps (
eaf9f73) - Feed resolution logging promoted from DEBUG to INFO for production auditability (
970f3e4) - Feed hint stored in
epg_matched_streamstable for post-run analysis (970f3e4) - Month/day date extraction and EventMatcher refactor for cleaner matching pipeline (
0b306e4)
🔧 Under the Hood
- Schema v70: feed_separation settings, feed_team_id column + unique index, emby_api_key
- Emby client migrated from
requeststohttpx(consistent with rest of codebase, available in Docker image) - Feed separation: Phase 1 (literal HOME/AWAY word-boundary tokens) + Phase 2 (team name pattern detection in parentheses, feed keywords, pipe/dash context)
Full Changelog: v2.3.3...v2.4.0