Source access enforcement (the catalog): 10-source catalog + per-scene access matrix enforced by SceneAccessPolicy; Add-Source menu is one ItemsSource rebuilt per scene (Screen = Live-only, BG/Image/Text every scene), webcam row always present + greys out; Chatbox/Alerts/Socials are inert SourceType rows ready for their features; Text queued as a ship step (countdown + credits modes); Monetization notes socialBar free = YouTube + 1, unlimited with the paid key (79 tests passing)
This commit is contained in:
@@ -109,29 +109,55 @@ Lifecycle: `created → ready → [testing] → live → complete` (transitional
|
||||
12. ✅ The connected YouTube account's avatar/name shows in the top bar next to Start Stream (`SyncConnectedAccount`); the scenes list is content-height now (no dead space before SOURCES)
|
||||
13. ☐ **Window capture** — absorbed into the Screen picker (no separate source type); dedicated window-as-source work is pending
|
||||
14. ☐ **Scene compositing** — the D3DImage/MediaElement preview compositor (this task's requirement 5; the output compositor ships as TASK 4 ship step 1)
|
||||
15. ☐ **Text source** — live text ("Starting soon", "Back in 5", handle, callout)
|
||||
15. ☐ **Text source** — live text ("Starting soon", "Back in 5", handle, callout); a queued ship step carries its **countdown** + **credits** (scroll) modes (see below)
|
||||
16. ☐ **Chat box** — YouTube live chat rendered *on* the stream so viewers read along in-video
|
||||
17. ❌ **Background removal (milestone 2)** — ONNX Runtime + DirectML, MediaPipe Selfie Segmentation — deliberately NOT in this build
|
||||
18. ☐ **Alerts** — Super Chat / membership / subscribe pop-ins; build after the six; **the one paid feature** (see Monetization in `ai.md`)
|
||||
18. ☐ **Alerts** — Super Chat / membership / subscribe pop-ins; build after the six; unlocked by the one-time paid key (see Monetization in `ai.md`)
|
||||
19. ✅ **The source catalog + access enforcement** — the 10-source catalog and per-scene matrix (the section below) live as `SceneAccessPolicy.Allows(sceneName, sourceType)`; the Add-Source menu is one `ItemsSource` (`AddSourceMenuItems`) rebuilt per scene from the policy (Screen is Live-only; BG/Image/Text every scene; the webcam row is always present and greys out once the active scene has one); Chatbox/Alerts/Socials are inert `SourceType` rows ready for their features — 79 tests passing
|
||||
|
||||
### The Minimal Source Set (design decision — do not expand casually)
|
||||
### The Source Catalog & scene access (design decision — do not expand casually)
|
||||
|
||||
ytLlive is YouTube-only and 90% of users are casual. OBS's long source list is off-putting; we ship
|
||||
the hot few and nothing esoteric. If a user needs more, they've graduated to OBS.
|
||||
|
||||
1. **Webcam** — the face cam. Non-negotiable.
|
||||
2. **Screen** — the main event (game, slides, browser). One source; a picker chooses a monitor *or* a
|
||||
window. (Window capture is absorbed here — no separate source type.)
|
||||
3. **Background** — a full-canvas backdrop image. Fills the whole scene automatically, zero fiddling.
|
||||
Kept separate from Image on purpose: same pixels, but this one needs no positioning.
|
||||
4. **Image** — a floating graphic/logo overlay (watermark, badge, corner branding). Free-positioned.
|
||||
5. **Text** — live text ("Starting soon", "Back in 5", handle, callout). Casual streamers live on this.
|
||||
1. **Screen capture** — the main event (game, slides, browser) as the Live scene's permanent backdrop
|
||||
(`IsBackdrop`, schema v5/v6); the picker chooses a monitor *or* a window. **Live only** (policy).
|
||||
2. **BG (Background)** — a full-canvas backdrop image. Fills the whole scene automatically, zero
|
||||
fiddling. Kept separate from Image on purpose: same pixels, but this one needs no positioning.
|
||||
3. **Image** — a floating graphic/logo overlay (watermark, badge, corner branding). Free-positioned.
|
||||
4. **Text** — live text ("Starting soon", "Back in 5", handle, callout). Casual streamers live on this.
|
||||
Ships with two **modes**: **Countdown** (Starting/BRB) and **Credits** (Ending) — see the queued
|
||||
Text ship step below. No new source types (KISS).
|
||||
5. **Webcam** — the face cam. Non-negotiable. A singleton resource (`WebcamSceneConfig`, not a `Source`
|
||||
type) usable in any scene.
|
||||
6. **Chat box** — YouTube live chat rendered *on* the stream so viewers read along in-video. YT-native.
|
||||
7. **Alerts** — Super Chat / membership / subscribe pop-ins. The dopamine source. **The one big lift**
|
||||
(Super Chat event streaming + on-stream rendering/animation); build after the six. **Also the one
|
||||
paid feature** — see Monetization in `ai.md`.
|
||||
**Live / BRB / Chat scenes.**
|
||||
7. **Alerts** — Super Chat / membership / subscribe pop-ins. The dopamine source. **All scenes** —
|
||||
alerts fire regardless of which scene is showing. Build after the six.
|
||||
8. **socialBar** — the creator's social links as one bar (branded anchor icon + in-app drop-down).
|
||||
**All scenes.** Free tier = the creator's YouTube channel + **one** more platform of their choice;
|
||||
unlimited platforms come with the one-time paid key (see Monetization in `ai.md`).
|
||||
|
||||
Deliberately NOT supported: game capture, browser source, media playlist, VLC, color-key voodoo, MIDI.
|
||||
**Per-scene access matrix** — enforced by `SceneAccessPolicy.Allows(sceneName, sourceType)`:
|
||||
|
||||
| Source | Starting | Live | BRB | Chat | Ending |
|
||||
|--------|:---:|:---:|:---:|:---:|:---:|
|
||||
| Screen capture (backdrop) | ❌ | ✅ | ❌ | ❌ | ❌ |
|
||||
| BG / Image / Text | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| Webcam | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| Countdown (Text mode) | ✅ | — | ✅ | — | — |
|
||||
| Chat box | — | ✅ | ✅ | ✅ | — |
|
||||
| Alerts | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| Credits (Text mode) | — | — | — | — | ✅ |
|
||||
| socialBar | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
|
||||
Countdown and Credits are **Text modes** (no new source types): the scene restrictions gate the
|
||||
*mode*, applied when the Text ship step lands. Chatbox / Alerts / socialBar are inert `SourceType`
|
||||
values until their features ship — the policy rows are live from today, the menu items arrive with
|
||||
the features.
|
||||
|
||||
Deliberately NOT supported: game capture (absorbed into Screen), browser source, media playlist, VLC,
|
||||
color-key voodoo, MIDI.
|
||||
|
||||
### Source memory model (design decision)
|
||||
|
||||
@@ -187,6 +213,20 @@ Preview shows the transition too (WYSIWYG). No wipes/slides/LUTs beyond the four
|
||||
2. **Scenes list:** drag rows to reorder scenes
|
||||
3. **Sources list:** drag rows to reorder sources (this *is* the z-order) — implemented
|
||||
|
||||
#### Queued ship step — Text source (countdown + credits modes)
|
||||
|
||||
**Goal:** make Text real — content + font/size/color/alignment rendered in the preview AND the output
|
||||
compositor — then its two modes on top. Status item 15 above.
|
||||
|
||||
1. ☐ **Text core** — `SourceType.TextOverlay` gains content + styling; the XAML preview renders it and
|
||||
the output compositor rasterizes it (preview via `FormattedText`, output via a `frameFor` frame,
|
||||
the `StaticPixelCache` pattern)
|
||||
2. ☐ **Countdown mode** — a Text bound to a countdown timer ("Live in 2:30"); the mode is gated to
|
||||
Starting/BRB per the access matrix
|
||||
3. ☐ **Credits mode** — a Text that scrolls up on the Ending scene
|
||||
|
||||
Ships only when queued (the Good Dog Rule: one integration test per PR, no multi-test branches).
|
||||
|
||||
---
|
||||
|
||||
## TASK 4 — RTMP Ingest to YouTube
|
||||
|
||||
Reference in New Issue
Block a user