Hierarchy
Buyer-facing docs with keys + vendor URLs:
Discover filter
listDiscoverableAddonPackages() excludes any addon linked by videoPluginIdForAddon():
Sync implementation:
lib/streamly/video-plugin-addon-sync.ts (called from plugin enable/update API routes). Enabling a video plugin idempotently creates/re-enables the stream_providers row and seeds public config (pull zone / customer subdomain, etc.).
Video ingest & webhooks
- Upload UIs stay on the vendor (Mux / Bunny / CF Stream / VdoCipher).
- Catalog attach is manual (Playback ID / GUID / UID / video id).
- Webhooks acknowledge (and verify secrets when configured); they do not auto-create catalog sources.
Ship catalogs
- Plugins (16): payments (3), R2, video (4) + Live TV, ads (AdSense + Adsterra), analytics (3), email (2).
- Addons (15 registered): 4 plugin-owned + Discover (Demo HLS, Vimeo, OpenAir, 8 TMDB embeds).
video.drm (EZDRM), ads.google_ad_manager.
Theme ad slots
Defined inlib/streamly/ad-slots.ts, resolved via lib/streamly/plugin-ads.ts, mounted by theme AdSlot components. Master enable + provider in Settings → Ads (ads_enabled, ads_provider).