diff --git a/docs/channels.md b/docs/channels.md index de4ab94d0..c06a9fe16 100644 --- a/docs/channels.md +++ b/docs/channels.md @@ -164,10 +164,20 @@ the system channel templates it creates, so the library-to-lineup builder (which are left alone, so builder-created and auto-tuned channels there inherit whatever the template already specifies. -**Limitation:** a logo set via **External logo URL** cannot drive the bug. `WatermarkSelector` -resolves it to the URL and then `File.Exists`-checks it, which is never true, so the watermark is -silently dropped — the URL wins for the guide listing but disables the on-screen bug. Tracked as -**#502**; the editor does not offer a bug preview in that case. +**External logo URLs drive the bug too, since #502.** `WatermarkSelector` used to resolve the URL +and then `File.Exists`-check it — never true for an `http(s)` path — so the watermark was silently +dropped and the URL won only the guide listing. It now passes through to the graphics engine, which +fetches and composites it. (The editor still offers no bug preview in that case.) + +**A remote logo is fetched under bounds, and exceeding any of them disables the bug rather than the +stream** (#511). The fetch gets a **10s** deadline covering headers *and* body, a **10 MiB** wire +cap, and at most **3 redirects**; the decode is capped at **50 MP total** (`width x height x +frames`) and **600 frames**, and the scaled frames retained for compositing at **200 MP** +(`frames x scaledWidth x scaledHeight`). A logo that busts a limit — or a host that is slow, dead or +serves a non-image — logs a warning and renders the channel with no bug; it never kills the stream. +Practical effects: an animated overlay scaled to full 1080p is limited to ~96 frames (~3.2s at +30fps), and an 8K still (~33 MP) is fine. The image is re-fetched per playout item, not cached; the +rationale for each limit is in `docs/decisions.md`. Note: `ChannelLogoGenerator.GenerateChannelLogoUrl()` hardcodes `localhost` for watermark logo fetching — see issue #1 for details. diff --git a/web/src/screens/ChannelEditScreen.tsx b/web/src/screens/ChannelEditScreen.tsx index f4e9831c9..5b743b721 100644 --- a/web/src/screens/ChannelEditScreen.tsx +++ b/web/src/screens/ChannelEditScreen.tsx @@ -798,7 +798,7 @@ function BrandingPane({ logoBugTarget == null ? 'No logo-driven watermark preset exists yet.' : externalUrlLogo - ? 'An external logo URL cannot be used as the on-screen bug — upload an image instead.' + ? 'Overlays this channel’s own logo on the stream. An external URL is fetched at render time, so no preview is shown here.' : 'Overlays this channel’s own logo on the stream, using the shared preset’s position and size.' } label="Use logo as on-screen bug"