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>
65 lines
1.7 KiB
JavaScript
65 lines
1.7 KiB
JavaScript
"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
|