From dd51f7842a9bd6bdfc156e9045301ace88277471 Mon Sep 17 00:00:00 2001 From: gramps Date: Thu, 5 Nov 2026 14:59:00 -0800 Subject: [PATCH] =?UTF-8?q?feat(stream):=20one-click=20Back=20on=20air=20?= =?UTF-8?q?=E2=80=94=20a=20new=20broadcast,=20honestly=20labelled=20(TASK?= =?UTF-8?q?=2032=C2=B73)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The last resilience slice. When a drop ends the broadcast, YouTube cannot resume it, so the only way back is a new one — and that is what the app now offers, in one click. - `Services/BroadcastTitle.cs` — the resume marker is applied to the title the show was using, and any existing marker is REPLACED rather than stacked ("Show (resumed)" → "Show (resumed 2)"), with the base truncated so the whole title fits YouTube's 100-character limit. Otherwise a channel grows two identically named videos and the creator has to explain it. - `MainViewModel.BackOnAirCommand` — reuses the ordinary go-live path with the saved details and the cached stream: new broadcast, new VOD, no dialog. It appears only after a drop ended the session and the ordinary start button steps aside, so there is exactly one way forward. - The running line goes red OFF AIR (not amber) in that state; the button reads "● Back on air". Tests: `BackOnAirTests` — first re-air marks the title, a second drop counts instead of stacking, the 100-character limit holds, an empty title still works, and the post-drop state exposes exactly one start affordance. FAST gate: 552 passed, 0 failed, 0 warnings. TASK 32 is now complete: fragmented MP4, blip retry, poll-driven RECONNECTING, ingest pre-flight, Back on air. --- Controls/TopBar.xaml | 9 ++++ Services/BroadcastTitle.cs | 33 ++++++++++++++ TASKS/task-32-stream-resilience.md | 7 ++- ViewModels/MainViewModel.Recovery.cs | 62 +++++++++++++++++++++++++ ViewModels/MainViewModel.Streaming.cs | 2 +- ytLive.Tests/BackOnAirTests.cs | 65 +++++++++++++++++++++++++++ 6 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 Services/BroadcastTitle.cs create mode 100644 ytLive.Tests/BackOnAirTests.cs diff --git a/Controls/TopBar.xaml b/Controls/TopBar.xaml index 0f267a8..cb3c008 100644 --- a/Controls/TopBar.xaml +++ b/Controls/TopBar.xaml @@ -107,6 +107,15 @@