Resi cue countdowns on ProPresenter and in Companion
The Resi -> ProPresenter bridge, its installer and site kit, and the Companion module resi-studio-cues, as running at North Attleboro. Bridge (resi_to_propresenter.py) - Follows a Resi decoder's playhead and keeps ProPresenter's NextCue timer counting down to the next cue; optional cue name as a stage message, sent once per cue (ProPresenter flashes it on every send) and off by default. - Playhead estimate no longer learns a cadence from the partial first gap after a start, so a 30s Resi doesn't read as paused half the time. - Backs off on 429, holds 2 min before retrying a failed startup login, and logs Resi's actual reason (wrong password, USER_LOCKED, rate limit). - --setup asks for the login, decoder, ProPresenter and timer. install_bridge.sh installs it as a login service (outside ~/Documents, which launchd may not read); make_kit.sh builds the kit for another site. Companion module resi-studio-cues 0.1.4 (source/, package committed) - Same playhead fix; login and request hold-off (15s doubling to 5 min); a 401/403 on a fresh session is a permission, not a reason to sign in again; init never fails on a Resi problem, so Companion can't restart it into a login loop. Tests: test_playhead.py, test_stage_message.py, test_rate_limit.py and source/backoff_test.js run offline; test_end_to_end.py drives a real ProPresenter and refuses to run without an explicit flag. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Vendored
+65
@@ -0,0 +1,65 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.GetConfigFields = GetConfigFields;
|
||||
function GetConfigFields() {
|
||||
return [
|
||||
{
|
||||
type: 'textinput',
|
||||
id: 'username',
|
||||
label: 'Username / Email',
|
||||
width: 12,
|
||||
},
|
||||
{
|
||||
type: 'dropdown',
|
||||
id: 'defaultPlayerHardwareId',
|
||||
label: 'Default decoder/player on startup',
|
||||
width: 12,
|
||||
default: '',
|
||||
choices: [{ id: '', label: '(none)' }],
|
||||
},
|
||||
// NEW: polling intervals
|
||||
{
|
||||
type: 'number',
|
||||
id: 'playerPollMs',
|
||||
label: 'Player position poll (ms)',
|
||||
width: 6,
|
||||
min: 250,
|
||||
max: 30000,
|
||||
default: 1000,
|
||||
},
|
||||
{
|
||||
type: 'number',
|
||||
id: 'positionTrimMs',
|
||||
label: 'Position trim (ms) - only if it still reads behind',
|
||||
width: 6,
|
||||
min: -30000,
|
||||
max: 30000,
|
||||
default: 0,
|
||||
},
|
||||
{
|
||||
type: 'number',
|
||||
id: 'cuePollMs',
|
||||
label: 'Cue list refresh (ms)',
|
||||
width: 6,
|
||||
min: 1000,
|
||||
max: 60000,
|
||||
default: 5000,
|
||||
},
|
||||
{
|
||||
type: 'number',
|
||||
id: 'listPollMs',
|
||||
label: 'User & decoder inf0 poll (ms)',
|
||||
width: 6,
|
||||
min: 10000,
|
||||
max: 3600000,
|
||||
default: 120000,
|
||||
},
|
||||
{
|
||||
type: 'secret-text',
|
||||
id: 'password',
|
||||
label: 'Password',
|
||||
width: 12,
|
||||
}
|
||||
];
|
||||
}
|
||||
//# sourceMappingURL=config.js.map
|
||||
Reference in New Issue
Block a user