6 | **
7 | --]]
8 |
9 | -- global OBS API
10 | local obs = obslua
11 |
12 | -- global context information
13 | local ctx = {
14 | -- properties
15 | propsDef = nil,
16 | propsDefBase = nil,
17 | propsDefOrg = nil,
18 | propsDefRoom = nil,
19 | propsVal = {},
20 | propsValBase = "https://caller.studio/",
21 | propsValOrg = "example",
22 | propsValRoom = "example",
23 | }
24 |
25 | -- update a single target browser source
26 | local function updateBrowserSource (name, url)
27 | local source = obs.obs_get_source_by_name(name)
28 | if source ~= nil then
29 | local settings = obs.obs_source_get_settings(source)
30 | obs.obs_data_set_string(settings, "url", url)
31 | obs.obs_source_update(source, settings)
32 | obs.obs_data_release(settings)
33 | obs.obs_source_release(source)
34 | end
35 | end
36 |
37 | -- update entire configuration
38 | local function updateConfiguration ()
39 | local baseURL = ctx.propsVal.textBase
40 | local orgName = ctx.propsVal.textOrg
41 | local roomName = ctx.propsVal.textRoom
42 | local url = string.format("%s#/%s/%s", baseURL, orgName, roomName)
43 | updateBrowserSource("Caller-1-Camera-VDON", url .. "/C1?stream=camera")
44 | updateBrowserSource("Caller-1-Content-VDON", url .. "/C1?stream=content")
45 | updateBrowserSource("Caller-2-Camera-VDON", url .. "/C2?stream=camera")
46 | updateBrowserSource("Caller-2-Content-VDON", url .. "/C2?stream=content")
47 | updateBrowserSource("Caller-3-Camera-VDON", url .. "/C3?stream=camera")
48 | updateBrowserSource("Caller-3-Content-VDON", url .. "/C3?stream=content")
49 | updateBrowserSource("Caller-4-Camera-VDON", url .. "/C4?stream=camera")
50 | updateBrowserSource("Caller-4-Content-VDON", url .. "/C4?stream=content")
51 | updateBrowserSource("Caller-5-Camera-VDON", url .. "/C5?stream=camera")
52 | updateBrowserSource("Caller-5-Content-VDON", url .. "/C5?stream=content")
53 | updateBrowserSource("Caller-6-Camera-VDON", url .. "/C6?stream=camera")
54 | updateBrowserSource("Caller-6-Content-VDON", url .. "/C6?stream=content")
55 | updateBrowserSource("Caller-7-Camera-VDON", url .. "/C7?stream=camera")
56 | updateBrowserSource("Caller-7-Content-VDON", url .. "/C7?stream=content")
57 | updateBrowserSource("Caller-8-Camera-VDON", url .. "/C8?stream=camera")
58 | updateBrowserSource("Caller-8-Content-VDON", url .. "/C8?stream=content")
59 | end
60 |
61 | -- script hook: description displayed on script window
62 | function script_description ()
63 | return [[
64 | VDON Call Configuration
65 |
66 | Copyright © 2022 Dr. Ralf S. Engelschall
68 | Distributed under MIT license
70 |
71 |
72 | This script updates the VDON Call organisation and room configuration
73 | in all OBS Studio browser sources with the provided ones below.
74 | ]]
75 | end
76 |
77 | -- script hook: define UI properties
78 | function script_properties ()
79 | -- create new properties
80 | local props = obs.obs_properties_create()
81 |
82 | -- create text fields
83 | ctx.propsDefBase = obs.obs_properties_add_text(props,
84 | "textBase", "Base URL", obs.OBS_TEXT_DEFAULT)
85 | ctx.propsDefOrg = obs.obs_properties_add_text(props,
86 | "textOrg", "Organisation Name", obs.OBS_TEXT_DEFAULT)
87 | ctx.propsDefRoom = obs.obs_properties_add_text(props,
88 | "textRoom", "Room Name", obs.OBS_TEXT_DEFAULT)
89 |
90 | -- create update button
91 | obs.obs_properties_add_button(props, "buttonUpdate", "Update Configuration", function ()
92 | updateConfiguration()
93 | return true
94 | end)
95 |
96 | return props
97 | end
98 |
99 | -- script hook: define property defaults
100 | function script_defaults (settings)
101 | -- provide default values
102 | obs.obs_data_set_default_string(settings, "textBase", ctx.propsValBase)
103 | obs.obs_data_set_default_string(settings, "textOrg", ctx.propsValOrg)
104 | obs.obs_data_set_default_string(settings, "textRoom", ctx.propsValRoom)
105 | end
106 |
107 | -- script hook: update state from UI properties
108 | function script_update (settings)
109 | -- fetch property values
110 | ctx.propsVal.textBase = obs.obs_data_get_string(settings, "textBase")
111 | ctx.propsVal.textOrg = obs.obs_data_get_string(settings, "textOrg")
112 | ctx.propsVal.textRoom = obs.obs_data_get_string(settings, "textRoom")
113 | end
114 |
115 |
--------------------------------------------------------------------------------
/obs-studio/basic.ini:
--------------------------------------------------------------------------------
1 | [General]
2 | Name=vdon-call
3 |
4 | [Video]
5 | BaseCX=1920
6 | BaseCY=1080
7 | OutputCX=1920
8 | OutputCY=1080
9 | FPSCommon=24 NTSC
10 |
11 | [Panels]
12 | CookieId=2689FB296E9CEC3D
13 |
14 | [Output]
15 | Mode=Advanced
16 |
17 | [AdvOut]
18 | TrackIndex=1
19 | RecType=Standard
20 | RecTracks=1
21 | FLVTrack=1
22 | FFOutputToFile=true
23 | FFFormat=
24 | FFFormatMimeType=
25 | FFVEncoderId=0
26 | FFVEncoder=
27 | FFAEncoderId=0
28 | FFAEncoder=
29 | FFAudioMixes=1
30 | VodTrackIndex=2
31 |
--------------------------------------------------------------------------------
/shot-1-trampoline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rse/vdon-call/ac9ed5269235e2872159c4e0d1b59d887571e215/shot-1-trampoline.png
--------------------------------------------------------------------------------
/shot-2-caller-sender.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rse/vdon-call/ac9ed5269235e2872159c4e0d1b59d887571e215/shot-2-caller-sender.png
--------------------------------------------------------------------------------
/shot-3-caller-receiver.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rse/vdon-call/ac9ed5269235e2872159c4e0d1b59d887571e215/shot-3-caller-receiver.png
--------------------------------------------------------------------------------
/shot-4-production.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rse/vdon-call/ac9ed5269235e2872159c4e0d1b59d887571e215/shot-4-production.png
--------------------------------------------------------------------------------
/shot-5-director.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rse/vdon-call/ac9ed5269235e2872159c4e0d1b59d887571e215/shot-5-director.png
--------------------------------------------------------------------------------
/vdon-call-logo.ai:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rse/vdon-call/ac9ed5269235e2872159c4e0d1b59d887571e215/vdon-call-logo.ai
--------------------------------------------------------------------------------
/vdon-call-logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
50 |
--------------------------------------------------------------------------------
/vdon.css:
--------------------------------------------------------------------------------
1 | /*
2 | ** VDON Call ~ VDO.Ninja Remote Caller Ingest
3 | ** Copyright (c) 2022-2023 Dr. Ralf S. Engelschall
4 | ** Licensed under MIT license
5 | */
6 |
7 | body.darktheme #add_camera {
8 | display: none;
9 | }
10 | body.darktheme .card {
11 | background-color: #02050c;
12 | }
13 | body.darktheme .container-inner {
14 | background-color: #02050c;
15 | }
16 |
17 | body.darktheme .gowebcam {
18 | border: 1px solid #cc3333;
19 | background: #990000 !important;
20 | border-radius: 4px;
21 | color: #ffffff;
22 | }
23 | body.darktheme .gowebcam:enabled {
24 | border: 1px solid #6699cc;
25 | background: #336699 !important;
26 | color: #f0f0ff;
27 | }
28 | body.darktheme .gowebcam {
29 | filter: none;
30 | }
31 |
32 | body.darktheme .videoMenu {
33 | background-color: #222222 !important;
34 | border: 1px solid #333333 !important;
35 | border-radius: 4px !important;
36 | }
37 | body.darktheme .videoMenu .las {
38 | color: #ffffff;
39 | }
40 | body.darktheme #videoSourceSelect {
41 | background-color: #444444;
42 | color: #ffffff;
43 | border-radius: 4px;
44 | padding: 4px 8px 4px 8px;
45 | }
46 | body.darktheme #videoSourceSelect:focus {
47 | outline: none;
48 | }
49 |
50 | body.darktheme #audioMenu {
51 | background-color: #222222;
52 | border: 1px solid #333333;
53 | border-radius: 4px;
54 | }
55 | body.darktheme #audioMenu .las,
56 | body.darktheme .audioMenu .las {
57 | color: #ffffff;
58 | }
59 | body.darktheme .audioTitle {
60 | color: #ffffff;
61 | }
62 | body.darktheme .audioTitle:hover {
63 | color: #ffffff;
64 | }
65 | body.darktheme #audioSource {
66 | background-color: #444444;
67 | color: #ffffff;
68 | border-radius: 4px;
69 | padding: 4px 8px 4px 8px;
70 | }
71 | body.darktheme #audioSource label {
72 | color: #ffffff;
73 | background-color: #444444;
74 | }
75 | body.darktheme #audioSource:focus {
76 | outline: none;
77 | }
78 |
79 | body.darktheme #headphonesDiv {
80 | background-color: #222222;
81 | border: 1px solid #333333;
82 | border-radius: 4px;
83 | }
84 | body.darktheme #headphonesDiv button {
85 | background-color: #555555;
86 | border: 1px solid #666666;
87 | color: #ffffff;
88 | }
89 | body.darktheme #outputSource {
90 | background-color: #444444;
91 | color: #ffffff;
92 | border-radius: 4px;
93 | padding: 4px 8px 4px 8px;
94 | }
95 | body.darktheme #outputSource:focus {
96 | outline: none;
97 | }
98 |
99 | body.darktheme #effectsDiv {
100 | background-color: #222222;
101 | border: 1px solid #333333;
102 | border-radius: 4px;
103 | }
104 | body.darktheme #effectSelector {
105 | background-color: #444444;
106 | color: #ffffff;
107 | border-radius: 4px;
108 | padding: 4px 8px 4px 8px;
109 | }
110 | body.darktheme #effectSelector:focus {
111 | outline: none;
112 | }
113 | body.darktheme #effectsDiv label {
114 | color: #ffffff;
115 | }
116 |
117 | /* ==== */
118 |
119 | body.darktheme #popupSelector {
120 | background: #111111e0;
121 | border-bottom-left-radius: 12px;
122 | }
123 |
124 | body.darktheme #videoMenu3 {
125 | background-color: #222222;
126 | border: 1px solid #333333;
127 | border-radius: 4px;
128 | }
129 | body.darktheme #videoSource3 {
130 | background-color: #444444;
131 | color: #ffffff;
132 | border-radius: 4px;
133 | padding: 4px 8px 4px 8px;
134 | }
135 | body.darktheme #videoSource3:focus {
136 | outline: none;
137 | }
138 |
139 | body.darktheme #audioMenu2 {
140 | background-color: #222222;
141 | border: 1px solid #333333;
142 | border-radius: 4px;
143 | }
144 |
145 | body.darktheme #popupSelector_user_settings {
146 | background-color: #222222;
147 | border: 1px solid #333333;
148 | border-radius: 4px;
149 | }
150 |
151 | body.darktheme .form-group.multiselect {
152 | background-color: #222222;
153 | border: 1px solid #333333;
154 | border-radius: 4px;
155 | }
156 | body.darktheme #audioSource3 {
157 | background-color: #444444;
158 | color: #ffffff;
159 | border-radius: 4px;
160 | padding: 4px 8px 4px 8px;
161 | }
162 | body.darktheme #audioSource3 label {
163 | color: #ffffff;
164 | }
165 | body.darktheme #audioSource3:focus {
166 | outline: none;
167 | }
168 |
169 | body.darktheme #headphonesDiv3 {
170 | background-color: #222222;
171 | border: 1px solid #333333;
172 | border-radius: 4px;
173 | }
174 | body.darktheme #headphonesDiv3 button {
175 | background-color: #555555;
176 | border: 1px solid #666666;
177 | color: #ffffff;
178 | }
179 | body.darktheme #outputSource3 {
180 | background-color: #444444;
181 | color: #ffffff;
182 | border-radius: 4px;
183 | padding: 4px 8px 4px 8px;
184 | }
185 | body.darktheme #outputSource3:focus {
186 | outline: none;
187 | }
188 |
189 | body.darktheme #effectsDiv3 {
190 | background-color: #222222;
191 | border: 1px solid #333333;
192 | border-radius: 4px;
193 | }
194 | body.darktheme #effectSelector3 {
195 | background-color: #444444;
196 | color: #ffffff;
197 | border-radius: 4px;
198 | padding: 4px 8px 4px 8px;
199 | }
200 | body.darktheme #effectSelector3:focus {
201 | outline: none;
202 | }
203 | body.darktheme #effectsDiv3 label {
204 | color: #ffffff;
205 | }
206 |
207 | body.darktheme #popupSelector button {
208 | background-color: #555555 !important;
209 | border: 1px solid #666666;
210 | color: #ffffff;
211 | }
212 |
213 | /* ==== */
214 |
215 | body.darktheme #chatModule {
216 | background: #111111e0;
217 | border-radius: 12px;
218 | padding: 12px;
219 | width: 600px;
220 | }
221 | body.darktheme #chatInput {
222 | border: 1px solid #6699cc;
223 | background-color: #336699;
224 | color: #ffffff;
225 | padding: 6px 12px 6px 12px;
226 | outline: none;
227 | }
228 | body.darktheme #chatInput::placeholder {
229 | color: #77aadd !important;
230 | }
231 | body.darktheme #welcomeMsg {
232 | background-color: #222222;
233 | color: #999999;
234 | }
235 | body.darktheme .outMessage {
236 | background-color: #336699;
237 | color: #ffffff;
238 | padding: 6px 12px 6px 12px;
239 | }
240 | body.darktheme .inMessage {
241 | background-color: #333333;
242 | color: #ffffff;
243 | padding: 6px 12px 6px 12px;
244 | }
245 | body.darktheme #chatModule button {
246 | border: 1px solid #6699cc !important;
247 | background-color: #336699 !important;
248 | color: #ffffff !important;
249 | padding: 6px 12px 6px 12px !important;
250 | outline: none;
251 | filter: none;
252 | font-size: 100%;
253 | }
254 |
255 | /* ==== */
256 |
257 | body.darktheme input[type=range] {
258 | padding: 0;
259 | }
260 |
261 | /* ==== */
262 |
263 | body.darktheme .popup-message {
264 | background-color: #111111e0 !important;
265 | border: 1px solid #333333e0 !important;
266 | border-radius: 12px;
267 | box-shadow: none !important;
268 | padding: 12px !important;
269 | }
270 | body.darktheme .las.la-question-circle {
271 | display: none;
272 | }
273 | body.darktheme [data-translate="add-more-here"] {
274 | display: none;
275 | }
276 |
277 | /* ==== */
278 |
279 | body.darktheme #connectedUsers {
280 | box-shadow: 2px 2px 8px #313131 !important;
281 | }
282 |
283 | /* ==== */
284 |
285 | body.darktheme .context-menu {
286 | background-color: #111111e0 !important;
287 | border: 1px solid #333333e0 !important;
288 | border-radius: 6px;
289 | color: #ffffff !important;
290 | box-shadow: 2px 2px 8px #313131 !important;
291 | }
292 | body.darktheme .context-menu .context-menu__link {
293 | color: #ffffff !important;
294 | }
295 |
296 | /* ==== */
297 |
298 | body.darktheme #overlayClock {
299 | border-radius: 12px;
300 | }
301 |
302 | /* ==== */
303 |
304 | body.darktheme .directorsgrid .vidcon {
305 | background-color: #222222 !important;
306 | }
307 | body.darktheme .directorsgrid .vidcon button {
308 | background-color: #2c2c2c !important;
309 | }
310 | body.darktheme .directorsgrid .containerGreen {
311 | background-color: #002200 !important;
312 | }
313 | body.darktheme .directorsgrid .containerGreen button {
314 | background-color: #003300 !important;
315 | }
316 |
317 |
--------------------------------------------------------------------------------