From 606515b2dc11b8ec411edeea552dff2c5bd57ca9 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Wed, 30 Nov 2022 14:30:00 -0800 Subject: [PATCH] core: add system settings support --- plugins/core/package-lock.json | 4 +- plugins/core/package.json | 3 +- .../src/components/builtin/system-settings.ts | 49 +++++++++---------- plugins/prebuffer-mixin/package-lock.json | 4 +- plugins/prebuffer-mixin/package.json | 2 +- .../prebuffer-mixin/src/file-rtsp-server.ts | 2 +- plugins/prebuffer-mixin/src/main.ts | 1 + 7 files changed, 33 insertions(+), 32 deletions(-) diff --git a/plugins/core/package-lock.json b/plugins/core/package-lock.json index a402ffea7..af66045fd 100644 --- a/plugins/core/package-lock.json +++ b/plugins/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/core", - "version": "0.1.60", + "version": "0.1.61", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/core", - "version": "0.1.60", + "version": "0.1.61", "license": "Apache-2.0", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/core/package.json b/plugins/core/package.json index 4a1cfc30b..90e377f5f 100644 --- a/plugins/core/package.json +++ b/plugins/core/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/core", - "version": "0.1.60", + "version": "0.1.61", "description": "Scrypted Core plugin. Provides the UI, websocket, and engine.io APIs.", "author": "Scrypted", "license": "Apache-2.0", @@ -30,6 +30,7 @@ "HttpRequestHandler", "EngineIOHandler", "DeviceProvider", + "SystemSettings", "Settings" ], "pluginDependencies": [ diff --git a/plugins/core/ui/src/components/builtin/system-settings.ts b/plugins/core/ui/src/components/builtin/system-settings.ts index 47b1f1c37..08cf3234f 100644 --- a/plugins/core/ui/src/components/builtin/system-settings.ts +++ b/plugins/core/ui/src/components/builtin/system-settings.ts @@ -2,8 +2,9 @@ import { ScryptedDevice, ScryptedDeviceType, ScryptedInterface, Settings, System import { findPluginDevice } from "../helpers"; export function createSystemSettingsDevice(systemManager: SystemManager): ScryptedDevice & Settings { - const core = systemManager.getDeviceByName('@scrypted/core'); - const transcode = findPluginDevice(systemManager, '@scrypted/prebuffer-mixin', 'transcode'); + const systemSettings = Object.keys(systemManager.getSystemState()) + .map(id => systemManager.getDeviceById(id)) + .filter(d => d.interfaces?.includes("SystemSettings")); return { name: 'Settings', @@ -24,36 +25,34 @@ export function createSystemSettingsDevice(systemManager: SystemManager): Scrypt return true; }, listen(event, callback) { - const cl = core.listen(event, callback); - const tl = transcode?.listen(event, callback); + let listeners = systemSettings.map(d => d.listen(event, callback)); return { removeListener() { - cl.removeListener(); - tl?.removeListener(); + for (const l of listeners) { + l.removeListener(); + } + listeners = []; }, } }, async getSettings() { - return [ - ...(await core.getSettings()).map(s => ({ - ...s, - key: 'core:' + s.key, - group: 'Network Settings', - })), - ...(await transcode?.getSettings() || []).map(s => ({ - ...s, - key: 'transcode:' + s.key, - group: 'Transcoding', - })), - ]; + const results = systemSettings.map(async d => { + const settings = await d.getSettings(); + for (const setting of settings) { + if (d.pluginId === '@scrypted/core') + setting.group = 'General'; + else + setting.group = d.name; + setting.key = d.id + ':' + setting.key; + } + return settings; + }); + return (await Promise.all(results)).flat(); }, async putSetting(key, value) { - if (key.startsWith('core:')) { - await core.putSetting(key.substring(5), value); - } - else if (key.startsWith('transcode:')) { - await transcode.putSetting(key.substring(10), value); - } + const [id, realKey] = key.split(':'); + const device = systemSettings.find(d => d.id === id); + return device?.putSetting(realKey, value); }, } -} \ No newline at end of file +} diff --git a/plugins/prebuffer-mixin/package-lock.json b/plugins/prebuffer-mixin/package-lock.json index 6ac73d93e..7ca4598c4 100644 --- a/plugins/prebuffer-mixin/package-lock.json +++ b/plugins/prebuffer-mixin/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/prebuffer-mixin", - "version": "0.9.52", + "version": "0.9.53", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/prebuffer-mixin", - "version": "0.9.52", + "version": "0.9.53", "license": "Apache-2.0", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/prebuffer-mixin/package.json b/plugins/prebuffer-mixin/package.json index 2e54e6c49..5c9fd157b 100644 --- a/plugins/prebuffer-mixin/package.json +++ b/plugins/prebuffer-mixin/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/prebuffer-mixin", - "version": "0.9.52", + "version": "0.9.53", "description": "Video Stream Rebroadcast, Prebuffer, and Management Plugin for Scrypted.", "author": "Scrypted", "license": "Apache-2.0", diff --git a/plugins/prebuffer-mixin/src/file-rtsp-server.ts b/plugins/prebuffer-mixin/src/file-rtsp-server.ts index 534fcb2c9..74ac38edf 100644 --- a/plugins/prebuffer-mixin/src/file-rtsp-server.ts +++ b/plugins/prebuffer-mixin/src/file-rtsp-server.ts @@ -37,7 +37,7 @@ export class FileRtspServer extends RtspServer { if (!file) return this.respond(400, 'Bad Request', requestHeaders, {}); - this.writeConsole?.log('RTSP WRITE file', file); + // this.writeConsole?.log('RTSP WRITE file', file); this.writeStream = fs.createWriteStream(file); this.writeStream.on('error', e => { this.writeConsole?.error('RTSP WRITE error', e); diff --git a/plugins/prebuffer-mixin/src/main.ts b/plugins/prebuffer-mixin/src/main.ts index 2fa9c8e36..acebdc3ef 100644 --- a/plugins/prebuffer-mixin/src/main.ts +++ b/plugins/prebuffer-mixin/src/main.ts @@ -1685,6 +1685,7 @@ export class RebroadcastPlugin extends AutoenableMixinProvider implements MixinP nativeId: TRANSCODE_MIXIN_PROVIDER_NATIVE_ID, name: 'Transcoding', interfaces: [ + "SystemSettings", ScryptedInterface.Settings, ScryptedInterface.MixinProvider, ],