UNPKG

camera.ui

Version:

NVR like user interface for RTSP capable cameras.

207 lines (175 loc) 5.54 kB
/* eslint-disable unicorn/prefer-number-properties */ 'use-strict'; import ffmpegPath from 'ffmpeg-for-homebridge'; export const uiDefaults = { port: 8081, }; export const httpDefaults = { port: 7272, localhttp: false, }; export const smtpDefaults = { port: 2727, speace_replace: '+', }; export const ftpDefaults = { port: 5050, useFile: false, }; export const mqttDefault = { tls: false, port: 1883, }; export const permissionLevels = [ 'admin', //API 'backup:download', 'backup:restore', 'cameras:access', 'cameras:edit', 'config:access', 'config:edit', 'notifications:access', 'notifications:edit', 'recordings:access', 'recordings:edit', 'settings:access', 'settings:edit', 'users:access', 'users:edit', //CLIENT 'camview:access', 'dashboard:access', 'settings:cameras:access', 'settings:cameras:edit', 'settings:camview:access', 'settings:camview:edit', 'settings:config:access', 'settings:config:edit', 'settings:dashboard:access', 'settings:dashboard:edit', 'settings:general:access', 'settings:general:edit', 'settings:notifications:access', 'settings:notifications:edit', 'settings:profile:access', 'settings:profile:edit', 'settings:recordings:access', 'settings:recordings:edit', ]; export const defaultVideoProcess = ffmpegPath || 'ffmpeg'; export const minNodeVersion = '16.12.0'; export class ConfigSetup { constructor(config = {}) { return { ...ConfigSetup.setupUi(config), options: ConfigSetup.setupOptions(config?.options), ssl: ConfigSetup.setupSsl(config?.ssl), http: ConfigSetup.setupHttp(config?.http), smtp: ConfigSetup.setupSmtp(config?.smtp), ftp: ConfigSetup.setupFtp(config?.ftp), mqtt: ConfigSetup.setupMqtt(config?.mqtt), cameras: ConfigSetup.setupCameras(config?.cameras), }; } static setupUi(config = {}) { return { logLevel: config?.logLevel || 'info', port: config?.port || uiDefaults.port, atHomeSwitch: config?.atHomeSwitch || false, }; } static setupOptions(options = {}) { return { videoProcessor: options?.videoProcessor || defaultVideoProcess, }; } static setupSsl(ssl = {}) { return { active: Boolean(ssl?.active && ssl?.key && ssl?.cert), key: ssl?.key, cert: ssl?.cert, }; } static setupMqtt(mqtt = {}) { return { active: Boolean(mqtt?.active && mqtt?.host), tls: mqtt?.tls || mqttDefault.tls, host: mqtt?.host, port: !isNaN(mqtt?.port) ? mqtt.port : mqttDefault.port, username: mqtt?.username, password: mqtt?.password, }; } static setupHttp(http = {}) { return { active: http?.active || false, port: !isNaN(http?.port) ? http.port : httpDefaults.port, localhttp: http?.localhttp || httpDefaults.localhttp, }; } static setupSmtp(smtp = {}) { return { active: smtp?.active || false, port: !isNaN(smtp?.port) ? smtp.port : smtpDefaults.port, space_replace: smtp?.space_replace || smtpDefaults.speace_replace, }; } static setupFtp(ftp = {}) { return { active: ftp?.active || false, useFile: ftp?.useFile || ftpDefaults.useFile, port: !isNaN(ftp?.port) ? ftp.port : ftpDefaults.port, }; } static setupCameras(cameras = []) { return ( cameras // include only cameras with given name, videoConfig and source .filter((camera) => camera.name && camera.videoConfig?.source) .map((camera) => { const sourceArguments = camera.videoConfig.source.split(/\s+/); if (!sourceArguments.includes('-i')) { camera.videoConfig.source = false; } if (camera.videoConfig.subSource) { const stillArguments = camera.videoConfig.subSource.split(/\s+/); if (!stillArguments.includes('-i')) { camera.videoConfig.subSource = camera.videoConfig.source; } } else { camera.videoConfig.subSource = camera.videoConfig.source; } if (camera.videoConfig.stillImageSource) { const stillArguments = camera.videoConfig.stillImageSource.split(/\s+/); if (!stillArguments.includes('-i')) { camera.videoConfig.stillImageSource = camera.videoConfig.source; } } else { camera.videoConfig.stillImageSource = camera.videoConfig.source; } // homebridge camera.recordOnMovement = camera.recordOnMovement !== undefined ? camera.recordOnMovement : !camera.hsv; camera.motionTimeout = camera.motionTimeout === undefined || !(camera.motionTimeout >= 0) ? 15 : camera.motionTimeout; camera.motionDelay = camera.motionDelay && camera.motionDelay <= 10 ? camera.motionDelay : undefined; // validate prebufferLength camera.prebufferLength = camera.prebufferLength >= 4 && camera.prebufferLength <= 8 ? camera.prebufferLength : 4; // setup video analysis camera.videoanalysis = { active: camera.videoanalysis?.active || false, }; // setup mqtt camera.smtp = camera.smtp || { email: camera.name, }; // setup mqtt camera.mqtt = camera.mqtt || {}; return camera; }) // exclude cameras with invalid videoConfig, source .filter((camera) => camera.videoConfig?.source) ); } }