Skip to content

feat(media): plugin tour videos with burned-in captions (#188)#210

Closed
srsholmes wants to merge 2 commits into
mainfrom
feat/plugin-tour-videos
Closed

feat(media): plugin tour videos with burned-in captions (#188)#210
srsholmes wants to merge 2 commits into
mainfrom
feat/plugin-tour-videos

Conversation

@srsholmes

@srsholmes srsholmes commented Jul 10, 2026

Copy link
Copy Markdown
Owner

Closes #188 (video capture tooling) and adds captioned demo tours for the whole plugin lineup.

Tooling — scripts/capture-videos.ts

Drives the running overlay over CDP (Page.startScreencast → ffmpeg → animated WebP):

  • Per-plugin tours (default): each plugin ships plugins/<id>/tour.json — a scripted tour with captions burned in as a lower-third (ffmpeg drawtext, timed to real frame durations). Opt-in: no tour.json → no tour. Per-tour fps/width so art-heavy library grids stay small.
  • Review → promote: capture:videos --tours records to a gitignored review folder; --promote=<id> copies the clip into plugins/<id>/assets/demo.webp and inserts a ## Demo section.
  • --target=steam: records Steam's Big Picture CEF (theme-loader recolor, Store Bridge Epic collection) — run from Gaming Mode.

Shared CDP/nav machinery extracted to scripts/lib/overlay-cdp.ts; scaffold-plugin-readmes.ts renders a ## Demo section from assets/demo.webp.

Privacy / exclusions (TOUR_SKIP)

Never toured (no tour.json + hard skip): network-info, playtime, bluetooth, storage-cleaner, display-settings, recomp.

Demos in this PR (19 plugins)

tdp-control (hero, in root README) + apex, wifi, storage, input-plumber, disable-controller-input, rgb-control, battery-tracker, lsfg-vk, protondb-badges, quick-links, hltb, steamgriddb, theme-loader, sound-loader, flatpak-manager, store-bridge, launch-options, fan-control — each embedded in its plugin README via ## Demo.

Notes for review

  • Footprint: demo clips total ~59 MB committed (WebP, no LFS per discussion). Every clip is tuned to ~2–4 MB; art-heavy library grids (hltb/protondb) run at a lower width to fit.
  • wifi and storage are included — they're the "stop WiFi power-saving dropouts" and "mount a lost game drive" fixes, not the privacy-sensitive network-info/storage-cleaner you excluded. Say if you'd rather drop them.
  • A few tours flip real device state to demo it (fan-control → Manual/Custom curve, rgb-control → Static, sound-loader → Default pack) — reversible in-app.

Reproduce

bun run capture:videos --tours                    # all plugin tours → videos/review/
bun run capture:videos --promote=<id,…>           # → assets/demo.webp + README

🤖 Generated with Claude Code

srsholmes and others added 2 commits July 10, 2026 23:47
Add scripts/capture-videos.ts — drives the running overlay over CDP
(Page.startScreencast → ffmpeg → animated WebP) to record captioned,
per-plugin tours defined by plugins/<id>/tour.json. Any step (or the
tour title) may carry a caption, burned in as a lower-third via ffmpeg
drawtext, timed to the real frame durations. Tours are opt-in (a plugin
without a tour.json is skipped) and network-info / playtime are hard
blacklisted (TOUR_SKIP) so personal data is never recorded.

Flow: `capture:videos --tours` records to a gitignored review folder;
`--promote=<id>` copies the approved clip into plugins/<id>/assets/demo.webp
and inserts a `## Demo` section. A `--target=steam` mode records Steam's
Big Picture CEF for theme-loader / Store Bridge features.

Shared CDP + navigation + recipe machinery is extracted to
scripts/lib/overlay-cdp.ts; capture-screenshots.ts is refactored onto it,
and scaffold-plugin-readmes.ts renders a Demo section from assets/demo.webp.

Ships the TDP Control tour (plugins/tdp-control/tour.json) as the first
demo, embedded in the root README and the plugin README as a tester.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Add a plugins/<id>/tour.json for every remaining plugin and capture each as
a captioned WebP demo, promoted into plugins/<id>/assets/demo.webp with a
`## Demo` section in the plugin README:

  apex, wifi, storage, input-plumber, disable-controller-input, rgb-control,
  battery-tracker, lsfg-vk, protondb-badges, quick-links, hltb, steamgriddb,
  theme-loader, sound-loader, flatpak-manager, store-bridge, launch-options,
  fan-control

Blacklisted from tours via TOUR_SKIP (no tour.json + hard skip): network-info,
playtime, bluetooth, storage-cleaner, display-settings, recomp.

capture-videos.ts gains a per-tour `width` so art-heavy library grids (hltb,
protondb-badges, store-bridge, …) drop to a smaller width — every clip lands
in the ~2-4 MB range while the burned-in captions stay legible.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
@srsholmes

Copy link
Copy Markdown
Owner Author

Parking this as an experiment — the captured tour videos don't look good enough in this format to ship. The tooling works end-to-end (CDP screencast → ffmpeg → captioned WebP, per-plugin tour.json, --tours/--promote, --target=steam), and all the work is preserved on the branch feat/plugin-tour-videos if we want to revisit later (e.g. different format, better framing, or a hosted-video approach). Not deleting the branch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add in video capture script to capture loadout features

1 participant