Three matching and channel fixes, a Getting Started card for new installs, and UEFA knockout badges.
🐛 Bug Fixes
- Streams are no longer purged as "phantoms" the moment their EPG window opens. When a time-windowed EPG channel-source stream came into its window, the first generation afterwards saw it missing from the channel in Dispatcharr and deleted it, only to add it back the next hour. Every stream that is missing from a channel is now checked against Dispatcharr's stream catalog: windowed streams are left for the window sync, streams the catalog still knows are re-pushed, and only streams Dispatcharr no longer has are removed, each with a history entry. (#1097)
- Test cricket days 2 to 5 now match on the EPG path. A programme for a later day of a Test was compared with the match's day-1 start, sat 24 hours away, and was rejected as a different occurrence. The anchor gate now measures to the nearest day of a multi-day event, the same way the stream-name path already did. (#1098)
- Matches decided on penalties are now final. ESPN's status for a penalty shootout was not in the status map, so every shootout, including last season's Champions League final, was treated as not yet started: the channel did not wind down and the recap never appeared. The real status is mapped, and any status name Teamarr does not recognise now follows ESPN's own finished flag instead of defaulting to "scheduled". (#916)
- The match cache no longer re-scores every never-matching stream every third run. A remembered failure never refreshed its generation stamp, so it was purged two runs after it was written and re-matched from scratch on a fixed cycle. A replayed failure now counts as a sighting. (#1101)
✨ New Features
- Getting Started card on the Dashboard. A new install now sees six steps that match the numbered navigation: connect Dispatcharr, add a source, subscribe to leagues, check matching, generate the EPG, see your channels. Each step reads its state from the install itself, the next step carries a Start button that opens the right page, and the card disappears on its own once a generation has created a channel. Dismiss closes it per install. (#818)
- UEFA knockout round, leg and aggregate for titles and artwork. Three soccer variables read ESPN's structured cup-tie data:
{knockout_round}(Round of 16, Final),{match_leg}(1st Leg / 2nd Leg, empty on finals and league-phase games) and{aggregate_score}(once the tie is decided; a level aggregate decided on penalties stays level). Two conditions,has_knockout_roundandmatch_leg, switch titles, descriptions or Game Thumbs badges on those games.{series_game}is unchanged, so a soccer leg never gets a "Game N" badge. The Game Thumbs guide shows the row for a 1ST LEG / 2ND LEG badge. (#916)
🔧 Under the Hood
- Ruff format sweep over the backend and tests (235 files, no behaviour change). (#1087)
- Pruned five dead code paths that earlier work had flagged, 169 lines. (#1106)
Full Changelog: v2.24.2...v2.24.3