🐛 Bug Fixes
- Channels no longer get deleted and recreated when a provider re-issues a stream. If the only stream on a channel came back under a new id in the same run, the channel was removed and rebuilt a second later with a new Dispatcharr id. It now keeps the channel and swaps the stream. (#955)
- A stream that states its own start time can't match a game a day away. When the stream's timezone is known, an event more than 14 hours from the stated time is refused — this was picking up the previous night's game of a series, or the same schools in another sport. (#956)
- Event channels honour a template's custom duration, and the stored end estimate now stays current on every run. — thanks @lpukatch (#947, #946)
- Ties between similarly named teams go to the one the stream actually names ("Indiana" no longer ties with Indiana State). (#799)
✨ New Features
- Season-aware pinned blocks. A pinned block can be limited to preseason, regular season or postseason and can carry its own channel group, so playoff games can sit in a priority range and group while the regular season stays where it was. The NBA play-in counts as postseason. (#950)
- Record a team's games. A team with a managed team channel has a Record games switch; Teamarr schedules a Dispatcharr recording for each game on that channel and keeps it in step if the game moves. Event channels are not recorded. (#729)
- Dispatcharr channel sources appear on the Sources page, one row per selected Dispatcharr channel group, each with its own league scope. (#542)
- Postponed events setting. Choose whether postponed games get event channels (Channels → Lifecycle). (#948)
- Feed separation: streams with no home/away label. Keep them on their own channel (as before) or leave them off. (#828)
- Channel order by start time (opt-in). Channels → Numbering → Number Stability → Channel order. Blocks list games in the order they begin; numbers move more often as a result. (#934)
⚡ Enhancements
- The Sport & League order now names any subscribed league missing from the list. (#678)
🔧 Under the Hood
- The template "Use Global Default" duration mode is removed; existing templates read as per-sport durations. Custom duration accepts up to 48 hours. (#946)
- Retired
group_templatestable dropped (schema v99). Support bundles are now schema v3:template_assignmentsreplacessource_template_mappings. (#822) - Regression tests for
Series Session: Race nameracing streams. (#770)
Upgrade notes: schema moves to v99 automatically on start. Nothing changes behaviour until you switch a new setting on.
Full changelog: v2.20.0...v2.21.0