init: initial commit
- 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
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
{
|
||||
"$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" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user