🎉 v2.5.0 — 2026-05-07
✨ New Features
- Jellyfin integration — auto-refresh Live TV guide after EPG generation, parallel to Emby (#200)
- Channels DVR integration — auto-refresh an M3U source after EPG generation; URL + discovered-list source picker
- Two new template variables:
{broadcast_feed}and{broadcast_feed_team}— thanks @lpukatch (#195) - Separate event and filler XMLTV categories on templates (#199)
🐛 Bug Fixes
- M3U-sourced channel groups no longer disappear from the Default/per-league pickers after page reload (
teamarrv2-t6d) - Fix duplicate MiLB leagues in selector (v73 migration)
- Event refresh is now additive — preserves teams and short_names instead of overwriting (#201)
- Self-heal
team_cache,provider_cache, andstream_match_cacherows missingshort_name(#201)
⚡ Enhancements
- ChannelsDVR M3U source picker discovers sources from the server instead of free-text typing — typo-proof
- Event status refresh refactored to overlay only mutable fields, backfilling teams from
team_cache(#201)
🎨 UI/UX
- Channels DVR settings card sits alongside Emby and Jellyfin under Media Servers
- "Show M3U-sourced channel groups" toggle now filters on the frontend; saved selection is always visible regardless of toggle state
🔧 Under the Hood
- Code health audit (Apr 2026) — pruned 761 lines: dead orchestrator layer,
services/epg_service.py, 5 dead routes, 4 dead frontend exports, 2 legacy constants - Deprecated V1→V2 migration path entirely; removed migration UI and route
- Migration audit phases 1–3: extracted
_run_migrationsinto named helpers, enforced architecture conventions, added per-migration behavior + idempotency tests - Refactored
update_groupto use a_UpdateBuilderhelper - Split 248-line
_normalize_data_v43god function into 7 named helpers - Added
tests/README.mdmapping the 561-test suite - Docs sweep: stop conflating per-team XMLTV channels with Dispatcharr channels (
teamarrv2-x1g); removed the fabricated "Team Channels in Dispatcharr" section (teamarrv2-liq)
Full Changelog: v2.4.5...v2.5.0