noobs 0.0.32 → 0.0.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/utils.cpp CHANGED
@@ -4,6 +4,7 @@
4
4
  #include <chrono>
5
5
  #include <iomanip>
6
6
  #include <sstream>
7
+ #include "utils.h"
7
8
 
8
9
  void log_handler(int lvl, const char *msg, va_list args, void *p) {
9
10
  // Use the passed log path parameter
@@ -77,4 +78,319 @@ void log_handler(int lvl, const char *msg, va_list args, void *p) {
77
78
  logFile << formatted_output << std::endl;
78
79
  logFile.close();
79
80
  }
80
- }
81
+ }
82
+
83
+ Napi::Object data_to_napi(Napi::Env env, obs_data_t* data) {
84
+ Napi::Object obj = Napi::Object::New(env);
85
+
86
+ if (!data) {
87
+ return obj;
88
+ }
89
+
90
+ obs_data_item_t *item = obs_data_first(data);
91
+
92
+ for (; item != NULL; obs_data_item_next(&item)) {
93
+ const char* name = obs_data_item_get_name(item);
94
+ enum obs_data_type type = obs_data_item_gettype(item);
95
+
96
+ switch (type) {
97
+ case OBS_DATA_STRING: {
98
+ const char* str_val = obs_data_item_get_string(item);
99
+ obj.Set(name, Napi::String::New(env, str_val ? str_val : ""));
100
+ break;
101
+ }
102
+
103
+ case OBS_DATA_NUMBER: {
104
+ double num_val = obs_data_item_get_double(item);
105
+ obj.Set(name, Napi::Number::New(env, num_val));
106
+ break;
107
+ }
108
+
109
+ case OBS_DATA_BOOLEAN: {
110
+ bool bool_val = obs_data_item_get_bool(item);
111
+ obj.Set(name, Napi::Boolean::New(env, bool_val));
112
+ break;
113
+ }
114
+
115
+ case OBS_DATA_OBJECT: {
116
+ obs_data_t *child_data = obs_data_item_get_obj(item);
117
+ Napi::Object child_obj = data_to_napi(env, child_data);
118
+ obj.Set(name, child_obj);
119
+ obs_data_release(child_data);
120
+ break;
121
+ }
122
+
123
+ case OBS_DATA_ARRAY: {
124
+ obs_data_array_t *array = obs_data_item_get_array(item);
125
+ size_t count = obs_data_array_count(array);
126
+ Napi::Array js_array = Napi::Array::New(env, count);
127
+
128
+ for (size_t i = 0; i < count; i++) {
129
+ obs_data_t *array_item = obs_data_array_item(array, i);
130
+ Napi::Object array_obj = data_to_napi(env, array_item);
131
+ js_array.Set(i, array_obj);
132
+ obs_data_release(array_item);
133
+ }
134
+
135
+ obj.Set(name, js_array);
136
+ obs_data_array_release(array);
137
+ break;
138
+ }
139
+
140
+ default:
141
+ // For unknown types or NULL, set as null
142
+ obj.Set(name, env.Null());
143
+ break;
144
+ }
145
+ }
146
+
147
+ return obj;
148
+ }
149
+
150
+ obs_data_t* napi_to_data(Napi::Object obj) {
151
+ obs_data_t* data = obs_data_create();
152
+
153
+ if (!data) {
154
+ return nullptr;
155
+ }
156
+
157
+ Napi::Array prop_names = obj.GetPropertyNames();
158
+
159
+ for (uint32_t i = 0; i < prop_names.Length(); i++) {
160
+ Napi::Value key = prop_names.Get(i);
161
+ std::string name = key.As<Napi::String>().Utf8Value();
162
+ Napi::Value value = obj.Get(key);
163
+
164
+ if (value.IsNull() || value.IsUndefined()) {
165
+ // OBS doesn't have a specific "set null" function, just skip
166
+ continue;
167
+ }
168
+ else if (value.IsString()) {
169
+ std::string str_val = value.As<Napi::String>().Utf8Value();
170
+ obs_data_set_string(data, name.c_str(), str_val.c_str());
171
+ }
172
+ else if (value.IsNumber()) {
173
+ double num_val = value.As<Napi::Number>().DoubleValue();
174
+ obs_data_set_double(data, name.c_str(), num_val);
175
+ }
176
+ else if (value.IsBoolean()) {
177
+ bool bool_val = value.As<Napi::Boolean>().Value();
178
+ obs_data_set_bool(data, name.c_str(), bool_val);
179
+ }
180
+ else if (value.IsObject() && !value.IsArray()) {
181
+ Napi::Object child_obj = value.As<Napi::Object>();
182
+ obs_data_t* child_data = napi_to_data(child_obj);
183
+ obs_data_set_obj(data, name.c_str(), child_data);
184
+ obs_data_release(child_data);
185
+ }
186
+ else if (value.IsArray()) {
187
+ Napi::Array js_array = value.As<Napi::Array>();
188
+ obs_data_array_t* array = obs_data_array_create();
189
+
190
+ for (uint32_t j = 0; j < js_array.Length(); j++) {
191
+ Napi::Value array_item = js_array.Get(j);
192
+ if (array_item.IsObject()) {
193
+ Napi::Object array_obj = array_item.As<Napi::Object>();
194
+ obs_data_t* array_data = napi_to_data(array_obj);
195
+ obs_data_array_push_back(array, array_data);
196
+ obs_data_release(array_data);
197
+ }
198
+ }
199
+
200
+ obs_data_set_array(data, name.c_str(), array);
201
+ obs_data_array_release(array);
202
+ }
203
+ }
204
+
205
+ return data;
206
+ }
207
+
208
+ Napi::Array properties_to_napi(Napi::Env env, obs_properties_t* properties) {
209
+ Napi::Array propsArray = Napi::Array::New(env);
210
+
211
+ if (!properties) {
212
+ blog(LOG_WARNING, "properties_to_napi called with null properties");
213
+ return propsArray;
214
+ }
215
+
216
+ obs_property_t* property = obs_properties_first(properties);
217
+ uint32_t index = 0;
218
+
219
+ while (property) {
220
+ Napi::Object propObj = property_to_napi(env, property);
221
+ propsArray.Set(index++, propObj);
222
+ obs_property_next(&property);
223
+ }
224
+
225
+ blog(LOG_INFO, "Converted %d properties to napi", index);
226
+ return propsArray;
227
+ }
228
+
229
+ Napi::Object property_to_napi(Napi::Env env, obs_property_t* property) {
230
+ Napi::Object obj = Napi::Object::New(env);
231
+
232
+ if (!property) {
233
+ return obj;
234
+ }
235
+
236
+ // Basic property information
237
+ const char* name = obs_property_name(property);
238
+ const char* description = obs_property_description(property);
239
+ enum obs_property_type type = obs_property_get_type(property);
240
+ bool enabled = obs_property_enabled(property);
241
+ bool visible = obs_property_visible(property);
242
+
243
+ obj.Set("name", Napi::String::New(env, name ? name : ""));
244
+ obj.Set("description", Napi::String::New(env, description ? description : ""));
245
+ obj.Set("enabled", Napi::Boolean::New(env, enabled));
246
+ obj.Set("visible", Napi::Boolean::New(env, visible));
247
+
248
+ // Property type
249
+ std::string type_str;
250
+ switch (type) {
251
+ case OBS_PROPERTY_INVALID: type_str = "invalid"; break;
252
+ case OBS_PROPERTY_BOOL: type_str = "bool"; break;
253
+ case OBS_PROPERTY_INT: type_str = "int"; break;
254
+ case OBS_PROPERTY_FLOAT: type_str = "float"; break;
255
+ case OBS_PROPERTY_TEXT: type_str = "text"; break;
256
+ case OBS_PROPERTY_PATH: type_str = "path"; break;
257
+ case OBS_PROPERTY_LIST: type_str = "list"; break;
258
+ case OBS_PROPERTY_COLOR: type_str = "color"; break;
259
+ case OBS_PROPERTY_BUTTON: type_str = "button"; break;
260
+ case OBS_PROPERTY_FONT: type_str = "font"; break;
261
+ case OBS_PROPERTY_EDITABLE_LIST: type_str = "editable_list"; break;
262
+ case OBS_PROPERTY_FRAME_RATE: type_str = "frame_rate"; break;
263
+ case OBS_PROPERTY_GROUP: type_str = "group"; break;
264
+ case OBS_PROPERTY_COLOR_ALPHA: type_str = "color_alpha"; break;
265
+ default: type_str = "unknown"; break;
266
+ }
267
+ obj.Set("type", Napi::String::New(env, type_str));
268
+
269
+ // Type-specific properties
270
+ switch (type) {
271
+ case OBS_PROPERTY_INT: {
272
+ int min_val = obs_property_int_min(property);
273
+ int max_val = obs_property_int_max(property);
274
+ int step_val = obs_property_int_step(property);
275
+ enum obs_number_type num_type = obs_property_int_type(property);
276
+
277
+ obj.Set("min", Napi::Number::New(env, min_val));
278
+ obj.Set("max", Napi::Number::New(env, max_val));
279
+ obj.Set("step", Napi::Number::New(env, step_val));
280
+
281
+ std::string num_type_str = (num_type == OBS_NUMBER_SCROLLER) ? "scroller" : "slider";
282
+ obj.Set("number_type", Napi::String::New(env, num_type_str));
283
+ break;
284
+ }
285
+
286
+ case OBS_PROPERTY_FLOAT: {
287
+ double min_val = obs_property_float_min(property);
288
+ double max_val = obs_property_float_max(property);
289
+ double step_val = obs_property_float_step(property);
290
+ enum obs_number_type num_type = obs_property_float_type(property);
291
+
292
+ obj.Set("min", Napi::Number::New(env, min_val));
293
+ obj.Set("max", Napi::Number::New(env, max_val));
294
+ obj.Set("step", Napi::Number::New(env, step_val));
295
+
296
+ std::string num_type_str = (num_type == OBS_NUMBER_SCROLLER) ? "scroller" : "slider";
297
+ obj.Set("number_type", Napi::String::New(env, num_type_str));
298
+ break;
299
+ }
300
+
301
+ case OBS_PROPERTY_TEXT: {
302
+ enum obs_text_type text_type = obs_property_text_type(property);
303
+ std::string text_type_str;
304
+
305
+ switch (text_type) {
306
+ case OBS_TEXT_DEFAULT: text_type_str = "default"; break;
307
+ case OBS_TEXT_PASSWORD: text_type_str = "password"; break;
308
+ case OBS_TEXT_MULTILINE: text_type_str = "multiline"; break;
309
+ case OBS_TEXT_INFO: text_type_str = "info"; break;
310
+ default: text_type_str = "default"; break;
311
+ }
312
+
313
+ obj.Set("text_type", Napi::String::New(env, text_type_str));
314
+ break;
315
+ }
316
+
317
+ case OBS_PROPERTY_PATH: {
318
+ enum obs_path_type path_type = obs_property_path_type(property);
319
+ const char* filter = obs_property_path_filter(property);
320
+ const char* default_path = obs_property_path_default_path(property);
321
+
322
+ std::string path_type_str;
323
+ switch (path_type) {
324
+ case OBS_PATH_FILE: path_type_str = "file"; break;
325
+ case OBS_PATH_FILE_SAVE: path_type_str = "file_save"; break;
326
+ case OBS_PATH_DIRECTORY: path_type_str = "directory"; break;
327
+ default: path_type_str = "file"; break;
328
+ }
329
+
330
+ obj.Set("path_type", Napi::String::New(env, path_type_str));
331
+ obj.Set("filter", Napi::String::New(env, filter ? filter : ""));
332
+ obj.Set("default_path", Napi::String::New(env, default_path ? default_path : ""));
333
+ break;
334
+ }
335
+
336
+ case OBS_PROPERTY_LIST: {
337
+ enum obs_combo_type combo_type = obs_property_list_type(property);
338
+ enum obs_combo_format combo_format = obs_property_list_format(property);
339
+ size_t count = obs_property_list_item_count(property);
340
+
341
+ std::string combo_type_str;
342
+ switch (combo_type) {
343
+ case OBS_COMBO_TYPE_INVALID: combo_type_str = "invalid"; break;
344
+ case OBS_COMBO_TYPE_EDITABLE: combo_type_str = "editable"; break;
345
+ case OBS_COMBO_TYPE_LIST: combo_type_str = "list"; break;
346
+ case OBS_COMBO_TYPE_RADIO: combo_type_str = "radio"; break;
347
+ default: combo_type_str = "list"; break;
348
+ }
349
+
350
+ std::string combo_format_str;
351
+ switch (combo_format) {
352
+ case OBS_COMBO_FORMAT_INVALID: combo_format_str = "invalid"; break;
353
+ case OBS_COMBO_FORMAT_INT: combo_format_str = "int"; break;
354
+ case OBS_COMBO_FORMAT_FLOAT: combo_format_str = "float"; break;
355
+ case OBS_COMBO_FORMAT_STRING: combo_format_str = "string"; break;
356
+ default: combo_format_str = "string"; break;
357
+ }
358
+
359
+ obj.Set("combo_type", Napi::String::New(env, combo_type_str));
360
+ obj.Set("combo_format", Napi::String::New(env, combo_format_str));
361
+
362
+ // Add list items
363
+ Napi::Array items = Napi::Array::New(env, count);
364
+ for (size_t i = 0; i < count; i++) {
365
+ Napi::Object item = Napi::Object::New(env);
366
+ const char* item_name = obs_property_list_item_name(property, i);
367
+
368
+ item.Set("name", Napi::String::New(env, item_name ? item_name : ""));
369
+
370
+ if (combo_format == OBS_COMBO_FORMAT_INT) {
371
+ long long item_int = obs_property_list_item_int(property, i);
372
+ item.Set("value", Napi::Number::New(env, static_cast<double>(item_int)));
373
+ } else if (combo_format == OBS_COMBO_FORMAT_FLOAT) {
374
+ double item_float = obs_property_list_item_float(property, i);
375
+ item.Set("value", Napi::Number::New(env, item_float));
376
+ } else {
377
+ const char* item_string = obs_property_list_item_string(property, i);
378
+ item.Set("value", Napi::String::New(env, item_string ? item_string : ""));
379
+ }
380
+
381
+ bool disabled = obs_property_list_item_disabled(property, i);
382
+ item.Set("disabled", Napi::Boolean::New(env, disabled));
383
+
384
+ items.Set(i, item);
385
+ }
386
+ obj.Set("items", items);
387
+ break;
388
+ }
389
+
390
+ default:
391
+ // For other types, we've already added the basic information
392
+ break;
393
+ }
394
+
395
+ return obj;
396
+ }
package/src/utils.h CHANGED
@@ -1,3 +1,12 @@
1
1
  #pragma once
2
2
 
3
- void log_handler(int lvl, const char *msg, va_list args, void *p);
3
+ #include <napi.h>
4
+ #include <obs.h>
5
+
6
+ void log_handler(int lvl, const char *msg, va_list args, void *p);
7
+
8
+ Napi::Object data_to_napi(Napi::Env env,obs_data_t* data);
9
+ obs_data_t* napi_to_data(Napi::Object obj);
10
+
11
+ Napi::Object property_to_napi(Napi::Env env, obs_property_t* property);
12
+ Napi::Array properties_to_napi(Napi::Env env, obs_properties_t* properties);