diff --git a/Assets/chat-backdrop.jpg b/Assets/chat-backdrop.jpg new file mode 100644 index 0000000..6297efe Binary files /dev/null and b/Assets/chat-backdrop.jpg differ diff --git a/Assets/ending-backdrop.jpg b/Assets/ending-backdrop.jpg new file mode 100644 index 0000000..6b87037 Binary files /dev/null and b/Assets/ending-backdrop.jpg differ diff --git a/Assets/live-backdrop.jpg b/Assets/live-backdrop.jpg new file mode 100644 index 0000000..8f580c3 Binary files /dev/null and b/Assets/live-backdrop.jpg differ diff --git a/HANDOFF.md b/HANDOFF.md index 55799f8..6f3832d 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,20 +1,56 @@ # HANDOFF — Session State ## Branch -`main` — dirty (BRB backdrop + Polar org ID + doc updates, uncommitted) +`main` — dirty (all changes uncommitted, builds clean) ## What shipped this session -- **BRB backdrop seeded on every load** — `Assets/brb-backdrop.jpg` (user-provided image, Gemini-generated), - added as `` in csproj; `SeedBrbBackdrop()` in MainViewModel mirrors the Starting pattern - (idempotent, skips if Background already exists). Runs on every startup outside the - `Scenes.Count == 0` guard. -- **UI rename: Screens → Layers → Properties** — 16 UI text changes across MainWindow.xaml + MainViewModel.cs - (section headers, tooltips, context menus, empty hints, onboarding text, fallback display name). - Code identifiers unchanged. -- **Polar org ID obtained** — `c05fb364-b967-4f6c-adf2-8a144e46d085` (Llama Chile Shop, slug: llamacasty). - Organization Access Token (OAT) stored in `Downloads/llamacasty-polar-code.txt`. - OATs are org-scoped — `organization_id` can be omitted from API calls. -- **CREDENTIALS.md updated** — Polar org ID + validate endpoint + key prefix (`LCYT-`) recorded. + +1. **Show Desktop toggle on Live backdrop** — `Source.ShowDesktop` bool persisted in DB (schema migration + read/write in LayoutStore). When checked, the primary monitor captures regardless of fullscreen game state. Toggling off falls back to the running game or releases to the static placeholder. `ClearBackdropCaptureAsync` clears `CaptureKey` + `VideoImageSource` so the static fallback actually renders. + +2. **Top bar — status light + avatar + Log In button** — red/green/pulsing ellipse (disconnected/connected/live). Avatar border visible only when connected, loads via `BitmapImage` in code-behind (not XAML binding). "Log In" button visible when disconnected, calls `StartStreamCommand` which opens GoLiveWindow with the sign-in flow. `ShowStartStream` now requires `IsConnected` too. + +3. **Chat preview — one-at-a-time mock messages** — `RunMockChatPreviewAsync`: simple async loop, displays `MockChatMessages[n]` via `UpdateChatBoxPreview(chatBox, Take(n+1))`, 1000ms between messages, wraps at end. `ChatPreviewEnabled` property on Source (default true). Stops when real messages arrive, restarts on fade timer clear. + +4. **Default backdrop seeds for all scenes** — `SeedEndingBackdrop` replaces existing (not skip-if-exists). `SeedChatBackdrop` added. `EnsureDefaultBackdrop` called on every scene switch — if a scene has no background, seeds the default from `Assets/`. Removed Chat skip from EnsureDefaultBackdrop. + +5. **New backdrop assets** — `ending-backdrop.jpg` and `chat-backdrop.jpg` added to Assets + csproj as ``. + +6. **SceneCatalog fix** — Chat scene display name corrected to "Chat" (was "YouTube Chat" — that name belongs to the layer/SourceType.ChatBox, not the scene). + +7. **Left panel spacing + context menu reorder** — HR margins matched, Row 4 changed from `*` to `Auto`, context menu items reordered (Border Thickness first). + +8. **Border animation rendering** — code-behind Storyboard approach via `_activeBorderAnimations` dictionary, `FindBorderShape`, `CreateBorderAnimation` for all 9 types. + +## Files changed +- `ViewModels/MainViewModel.cs` — `ShowDesktop`, `ClearBackdropCaptureAsync`, `BackdropShowDesktop`, top bar avatar/login/status light, `RunMockChatPreviewAsync`, `StartMockChatPreview`/`StopMockChatPreview`, `SeedEndingBackdrop`/`SeedChatBackdrop`/`EnsureDefaultBackdrop`, `ShowStartStream` requires `IsConnected` +- `Models/Source.cs` — `ShowDesktop`, `ChatPreviewEnabled` +- `Models/SceneCatalog.cs` — removed Chat → "YouTube Chat" display name override +- `Services/LayoutStore.cs` — ShowDesktop column migration + read/write +- `MainWindow.xaml` — top bar status light + avatar + Log In button, Show Desktop context menu toggle +- `MainWindow.xaml.cs` — `LoadAvatarImage`, `OnViewModelPropertyChanged` handles avatar +- `Assets/ending-backdrop.jpg` — new Ending scene default backdrop +- `Assets/chat-backdrop.jpg` — new Chat scene default backdrop +- `ytLive.csproj` — new asset resources +- `Themes/Controls.xaml` — slider fix (Background="{x:Null}") + +## Build +```bash +taskkill.exe /F /IM ytLive.exe # if running +"/mnt/c/Program Files/dotnet/dotnet.exe" build "C:\Users\gramp\Documents\Code\projects\ytLive\ytLive.csproj" --no-restore +``` + +## Known issues +- YouTube session expired at 11:45 — need to re-sign-in via the new "Log In" button +- Build often fails when ytLive.exe is running — `taskkill.exe /F /IM ytLive.exe` first +- `Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback` integration test is flaky in headless CI + +## Next steps +1. **TASK 10 + Velopack** — license validation + auto-updates (1 full session) +2. **TASK 20** — hotkeys (global keyboard shortcuts) +3. **TASK 19** — scene transitions (Cut/Fade/Move/Custom) +4. **TASK 21** — media source (video file playback) +5. **TASK 22** — audio sync offset +6. **TASK 23** — studio mode ## Polar.sh resources | Resource | ID | @@ -30,39 +66,6 @@ | Customer-portal validate | `POST https://api.polar.sh/v1/customer-portal/license-keys/validate` | | Key prefix | `LCYT-` | -## Build -```bash -taskkill.exe /F /IM ytLive.exe # if running -"/mnt/c/Program Files/dotnet/dotnet.exe" build "C:\Users\gramp\Documents\Code\projects\ytLive\ytLive.csproj" -"/mnt/c/Program Files/dotnet/dotnet.exe" vstest "C:\Users\gramp\Documents\Code\projects\ytLive\ytLive.Tests\bin\Debug\net8.0-windows10.0.19041.0\ytLive.Tests.dll" -``` - -## Known issues -- `Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback` integration test is flaky — hangs when - run via `vstest` (likely tries to acquire WASAPI devices in headless CI). Exclude with - `--TestCaseFilter:"FullyQualifiedName!~Mix_HonorsProviderGains"` if needed. -- Build often fails when ytLive.exe is running — `taskkill.exe /F /IM ytLive.exe` first. - -## Next steps -1. **TASK 10 + Velopack** — license validation + auto-updates (1 full session). Polar org ID + OAT - now available; all infra ready. Phases: LicenseService, license key UI, brand flash gating, - Velopack integration, tests. -2. **TASK 20** — hotkeys (global keyboard shortcuts) — small scope, huge UX impact -3. **TASK 19** — scene transitions (Cut/Fade/Move/Custom) — already scoped -4. **TASK 17** — web source WebView2 (enables alert ecosystem) -5. **TASK 18** — local recording (independent) -6. **TASK 21** — media source (video file playback) — pairs with TRAX for non-Live scenes -7. **TASK 22** — audio sync offset — small, quality-of-life -8. **TASK 23** — studio mode (lightweight preview) -9. **TASK 15** — stock bg images — Starting and BRB seeded; Live, Chat, Ending still waiting on user images -10. **TASK 16** — kill infinity display (depends on TASK 15 for Live/Chat/Ending images) - ## v1 vision > A streaming tool that's intuitive and ready to go out-the-gate with nothing held back. > Minimal configuration — they're ready to go live or record. Eliminate the OBS pain-point completely. - -## Open items -- Polar checkout page ~80% configured — needs logo upload via dashboard -- Logo upload API was broken (Polar server 500 on `/v1/files/{id}/uploaded`) — upload via dashboard instead -- Full codebase rename (ytLlive → LlamaCasty) still pending -- BRB backdrop image is user-provided (Gemini-generated) — may need replacement with branded image diff --git a/MainWindow.xaml b/MainWindow.xaml index 82898c8..97ae0d7 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -125,17 +125,40 @@ Visibility="{Binding IsLive, Converter={StaticResource BoolToVis}}"/> - + + + + + + + + - + + +