Timers 1.6.0: the ProPresenter video countdown, with looping videos hidden #33

Merged
michael merged 1 commits from claude/timers-video-countdown into main 2026-09-27 11:35:55 -04:00
Owner

What

The one number a booth needs during a bumper or sermon video — time left on what ProPresenter is playing — as a Video card in the Timers module. It was missed originally because the module only read the configured timers (/v1/timers); the video countdown lives in the transport family.

Verified live on ProPresenter 21.4 (mid-service, with a looping background up — the exact case this is for):

  • GET /v1/transport/presentation/current → { is_playing, uuid, name, artist, audio_only, duration }
  • GET /v1/transport/presentation/time → bare seconds as a sub-second float — better than /v1/timer/video_countdown's whole-second string, so the card needs no quantization phase-lock, just an anchor hold (frames broadcast only when the anchor drifts, not per poll; tiles extrapolate locally as usual).

The card rides the existing ProPresenter source: transport current on the slow lane, position on the hot path (skipped while nothing is loaded), running/paused/idle from is_playing + position, the media name (file extension stripped) as the detail line. It persists as an idle "—" between videos — a wall tile must not appear and vanish with the media — and is absent only on a ProPresenter whose transport routes 404.

Looping videos

No looping flag exists anywhere in the API (checked spec + live), so it's inferred: the same media's position jumping backwards is a wrap; the flag sticks until the media changes. (A manually re-triggered video is mislabeled for that one pass — loops re-wrap, replays don't; noted in code.)

Per-tile gear switch "Looping videos" (Show group, default off): off, a looping background's meaningless time is hidden — the card sits out of a multi-card tile, and a solo Video tile shows a quiet "Looping · " card instead of sitting empty. Shown loops never take warn/overrun tones — a 15 s background flashing red every wrap would cry wolf all service.

The + picker offers Video as its own tile; its solo gear carries the loop switch.

Verified

pp-timers-mock gained the transport routes with a 4-minute cycle (3:00 bumper playing → paused → resumed → nothing loaded → 15 s looping background). Watched the whole cycle in the browser: countdown counts on both tile kinds; the loop phase hides the card by default and the solo tile shows the quiet Looping card; flipping the toggle on one tile shows the loop counting there while the other tile keeps its own setting; the idle card holds between videos. Both selftests pass. Module 1.5.1 → 1.6.0, no shell changes.

⚠️ Deploy note: on AB, update the shell to 1.9.2 before this module update, or the update will delete the scp'd ltc-capture again (1.9.1 doesn't carry executables over, and AB can't rebuild).

🤖 Generated with Claude Code

## What The one number a booth needs during a bumper or sermon video — **time left on what ProPresenter is playing** — as a Video card in the Timers module. It was missed originally because the module only read the *configured* timers (`/v1/timers`); the video countdown lives in the transport family. Verified live on ProPresenter 21.4 (mid-service, with a looping background up — the exact case this is for): - `GET /v1/transport/presentation/current` → `{ is_playing, uuid, name, artist, audio_only, duration }` - `GET /v1/transport/presentation/time` → bare seconds as a **sub-second float** — better than `/v1/timer/video_countdown`'s whole-second string, so the card needs no quantization phase-lock, just an anchor hold (frames broadcast only when the anchor drifts, not per poll; tiles extrapolate locally as usual). The card rides the existing ProPresenter source: transport `current` on the slow lane, position on the hot path (skipped while nothing is loaded), running/paused/idle from `is_playing` + position, the media name (file extension stripped) as the detail line. It **persists as an idle "—" between videos** — a wall tile must not appear and vanish with the media — and is absent only on a ProPresenter whose transport routes 404. ## Looping videos No looping flag exists anywhere in the API (checked spec + live), so it's **inferred**: the same media's position jumping backwards is a wrap; the flag sticks until the media changes. (A manually re-triggered video is mislabeled for that one pass — loops re-wrap, replays don't; noted in code.) Per-tile gear switch **"Looping videos"** (Show group, default **off**): off, a looping background's meaningless time is hidden — the card sits out of a multi-card tile, and a solo Video tile shows a quiet "Looping · <name>" card instead of sitting empty. Shown loops never take warn/overrun tones — a 15 s background flashing red every wrap would cry wolf all service. The + picker offers **Video** as its own tile; its solo gear carries the loop switch. ## Verified `pp-timers-mock` gained the transport routes with a 4-minute cycle (3:00 bumper playing → paused → resumed → nothing loaded → 15 s looping background). Watched the whole cycle in the browser: countdown counts on both tile kinds; the loop phase hides the card by default and the solo tile shows the quiet Looping card; flipping the toggle on one tile shows the loop counting there while the other tile keeps its own setting; the idle card holds between videos. Both selftests pass. Module 1.5.1 → 1.6.0, no shell changes. ⚠️ Deploy note: on AB, update the **shell to 1.9.2 before** this module update, or the update will delete the scp'd `ltc-capture` again (1.9.1 doesn't carry executables over, and AB can't rebuild). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
michael added 1 commit 2026-09-27 11:33:05 -04:00
Time left on the video ProPresenter is playing — the one number a booth
needs during a bumper or sermon video — was missing: the module only read
the configured timers, and the video countdown lives in the transport
routes. Verified live on ProPresenter 21.4:
  GET /v1/transport/presentation/current → { is_playing, uuid, name,
    artist, audio_only, duration }
  GET /v1/transport/presentation/time    → bare seconds as a sub-second
    float — better than /v1/timer/video_countdown's whole-second string,
    so no quantization phase lock is needed, only an anchor hold (a frame
    is broadcast only when the anchor drifts, not per poll).

The Video card rides the ProPresenter source: transport current on the
slow lane, position on the hot path (skipped while no media is loaded),
running/paused/idle from is_playing and position, the media name (minus
its file extension) as the detail line. It persists as an idle '—'
between videos — a wall tile must not appear and vanish with the media —
and is absent only on a ProPresenter whose transport routes 404.

No looping flag exists anywhere in the API, so looping is inferred: the
same media's position jumping backwards is a wrap, and the flag sticks
until the media changes. Each tile gets a 'Looping videos' switch
(default off): off, a looping background's meaningless time is hidden —
the card sits out of a multi-card tile, and a solo Video tile shows a
quiet 'Looping' card instead of sitting empty. Shown loops never take
the warn/overrun tones: a 15 s background flashing red every wrap would
cry wolf all service.

The picker offers 'Video' as its own tile (solo gear carries the loop
switch); pp-timers-mock gains the transport routes with a 4-minute cycle
(bumper playing → paused → resumed → nothing → looping background).
Verified in the browser across the whole cycle, both tile kinds, and the
per-tile toggle. Selftests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
michael merged commit 7cc19ef696 into main 2026-09-27 11:35:55 -04:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: michael/ProdDash#33