4bb64a8ca3
- ticker / QR ad overlay / break slide graphics (1920×1080) with all geometry derived from one shared module (src/shared/obs-geometry.mjs) - OBS scene-collection generator (scripts/generate-obs-scenes.mjs) and a read-only in-dashboard setup verifier, both driven by the same module - en/sr dashboard i18n selected via bundle config; configschema.json with neutral first-run defaults seeded from optional branding config - install.sh / systemd user service / update.sh for venue deployment - reference OBS scene collection + profile from a real venue as fixtures
97 lines
3.4 KiB
JSON
97 lines
3.4 KiB
JSON
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"locale": {
|
|
"description": "Dashboard language",
|
|
"type": "string",
|
|
"enum": ["en", "sr"],
|
|
"default": "en"
|
|
},
|
|
"branding": {
|
|
"description": "First-run replicant seeds — only applied when nothing is persisted yet; everything is editable from the dashboard afterwards",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"tickerBlurb": {
|
|
"description": "Recurring ticker blurb shown at every loop seam",
|
|
"type": "string"
|
|
},
|
|
"breakHeading": {
|
|
"description": "Default heading on the break slide",
|
|
"type": "string"
|
|
},
|
|
"sampleQrUrl": {
|
|
"description": "URL encoded in the sample ad's QR code",
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"obs": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"enabled": {
|
|
"description": "Connect to OBS and drive scene switches",
|
|
"type": "boolean",
|
|
"default": false
|
|
},
|
|
"url": {
|
|
"description": "obs-websocket URL",
|
|
"type": "string",
|
|
"default": "ws://127.0.0.1:4455"
|
|
},
|
|
"password": {
|
|
"description": "obs-websocket password (empty when authentication is disabled)",
|
|
"type": "string",
|
|
"default": ""
|
|
},
|
|
"scenes": {
|
|
"description": "Names of the six scenes NodeCG switches between",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"main": { "type": "string", "default": "MAIN" },
|
|
"mainAdTr": { "type": "string", "default": "MAIN_AD_TR" },
|
|
"mainAdBl": { "type": "string", "default": "MAIN_AD_BL" },
|
|
"break": { "type": "string", "default": "BREAK" },
|
|
"breakAdTr": { "type": "string", "default": "BREAK_AD_TR" },
|
|
"breakAdBl": { "type": "string", "default": "BREAK_AD_BL" }
|
|
}
|
|
},
|
|
"transitions": {
|
|
"description": "Names of the transitions in the OBS transition dock",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"default": {
|
|
"description": "Selected before ad shrink/hop switches (the Move transition)",
|
|
"type": "string",
|
|
"default": "Move"
|
|
},
|
|
"break": {
|
|
"description": "Selected before MAIN↔BREAK toggles (the stinger)",
|
|
"type": "string",
|
|
"default": "Stinger"
|
|
}
|
|
}
|
|
},
|
|
"sources": {
|
|
"description": "Names of the shared sources/nested scenes, used by the OBS setup verifier and the scene-collection generator",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"adOverlay": { "type": "string", "default": "AdOverlay" },
|
|
"ticker": { "type": "string", "default": "TickerOverlay" },
|
|
"breakSlide": { "type": "string", "default": "BreakSlide" },
|
|
"programScene": { "type": "string", "default": "PROGRAM" },
|
|
"breakScene": { "type": "string", "default": "BREAK_SLIDE" },
|
|
"programPlaceholder": { "type": "string", "default": "Program Placeholder" }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|