From a02313ba771c677a0e7db809d313a99d180748fa Mon Sep 17 00:00:00 2001 From: Moe Date: Fri, 12 Aug 2022 09:54:59 -0700 Subject: [PATCH] Allow Importing ZoneMinder Zones with Monitor Configurations --- web/assets/js/bs5.dashboard-base.js | 3 ++ web/assets/js/bs5.monitorSettings.js | 33 +---------------- web/assets/js/bs5.monitorsUtils.js | 55 ++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 34 deletions(-) diff --git a/web/assets/js/bs5.dashboard-base.js b/web/assets/js/bs5.dashboard-base.js index e2e405c3..218b8b98 100644 --- a/web/assets/js/bs5.dashboard-base.js +++ b/web/assets/js/bs5.dashboard-base.js @@ -106,6 +106,9 @@ function addCredentialsToUrl(streamUrl,username,password){ const urlParts = streamUrl.split('://') return [urlParts[0],'://',`${username}:${password}@`,urlParts[1]].join('') } +function mergeConcattedJsonString(textData){ + return textData.replace(/[\r\n]/gm, '').replace('}{',',') +} function getFullOrigin(withoutTrailingSlash){ var url = location.origin + getLocationPathName() if(withoutTrailingSlash)url = url.slice(0, -1); diff --git a/web/assets/js/bs5.monitorSettings.js b/web/assets/js/bs5.monitorSettings.js index 089280a7..4afc4ffe 100644 --- a/web/assets/js/bs5.monitorSettings.js +++ b/web/assets/js/bs5.monitorSettings.js @@ -977,37 +977,6 @@ monitorEditorWindow.on('change','[channel-detail]',function(){ monitorEditorWindow.find('.probe-monitor-settings').click(function(){ $.pB.submit(buildMonitorURL(),true) }) -monitorEditorWindow.find('.import_config').click(function(e){ - var el = $(this); - var monitorId = el.parents('[mid]').attr('mid'); - $.confirm.create({ - title: lang['Import Monitor Configuration'], - body: lang.ImportMonitorConfigurationText+'
', - clickOptions: { - title: 'Import', - class: 'btn-primary' - }, - clickCallback: function(){ - try{ - var monitorConfig = safeJsonParse($.confirm.e.find('textarea').val()); - importIntoMonitorEditor(monitorConfig) - monitorEditorWindow.modal('show') - }catch(err){ - debugLog(err) - new PNotify({title:lang['Invalid JSON'],text:lang.InvalidJSONText,type:'error'}) - } - } - }) - $.confirm.e.find('.upload').change(function(e){ - var files = e.target.files; // FileList object - f = files[0]; - var reader = new FileReader(); - reader.onload = function(ee) { - $.confirm.e.find('textarea').val(ee.target.result); - } - reader.readAsText(f); - }); -}); monitorEditorWindow.find('.save_config').click(function(e){ //export monior config in view var el = $(this); @@ -1438,10 +1407,12 @@ editorForm.find('[name="type"]').change(function(e){ launchImportMonitorWindow(function(monitor){ var monitorConfig = null if(monitor.monitor){ + mergeZoneMinderZonesIntoMonitors(monitor) monitorConfig = importZoneMinderMonitor(monitor.monitor.Monitor) }else //zoneminder multiple monitors if(monitor.monitors){ + mergeZoneMinderZonesIntoMonitors(monitor) monitorConfig = importZoneMinderMonitor(monitor.monitors[0].Monitor) }else{ if(monitor[0] && monitor.mid){ diff --git a/web/assets/js/bs5.monitorsUtils.js b/web/assets/js/bs5.monitorsUtils.js index 8bae53e6..de54c6a3 100644 --- a/web/assets/js/bs5.monitorsUtils.js +++ b/web/assets/js/bs5.monitorsUtils.js @@ -332,7 +332,50 @@ function importM3u8Playlist(textData){ postMonitor(newMon) }) } - +function convertZoneMinderZonesToCords(rows,width,height){ + var coordinates = {} + const defaultDetectionWidth = 640 + const defaultDetectionHeight = 480 + rows.forEach((row) => { + const zone = row.Zone || row + let widthRatio = width > defaultDetectionWidth ? defaultDetectionWidth / width : 1 + let heightRatio = height > defaultDetectionHeight ? defaultDetectionHeight / height : 1 + const points = zone.Coords.split(' ').map((item) => { + let points = item.split(',').map((num) => parseInt(num)); + points[0] = parseInt(points[0] * widthRatio); + points[1] = parseInt(points[1] * heightRatio); + return points + }) + const monitorId = zone.MonitorId + coordinates[generateId(5)] = { + "name": `${zone.Id}-${monitorId}`, + "sensitivity": "5", + "max_sensitivity": "", + "threshold": 1, + "color_threshold": 9, + "points": points + } + }) + return coordinates +} +function mergeZoneMinderZonesIntoMonitors(data){ + const monitors = data.monitors + const singleMonitor = data.monitor && data.monitor.Monitor ? data.monitor.Monitor : null + const zones = data.zones + const targetMonitors = singleMonitor ? [singleMonitor] : monitors + targetMonitors.forEach((row) => { + const monitor = row.Monitor + const width = parseInt(monitor.Width) + const height = parseInt(monitor.Height) + const monitorZones = zones.filter(zone => { + return zone.Zone.MonitorId === monitor.Id + }) + monitor.Zones = convertZoneMinderZonesToCords(monitorZones,width,height) || {} + }) + if(singleMonitor){ + data.monitor.Monitor = targetMonitors[0] + } +} function importZoneMinderMonitor(Monitor){ var newMon = generateDefaultMonitorSettings() newMon.details = safeJsonParse(newMon.details) @@ -356,7 +399,11 @@ function importZoneMinderMonitor(Monitor){ newMon.details.mpass = password newMon.details.stream_type = 'hls' newMon.details.detector_buffer_acodec = 'auto' + // newMon.details.detector_scale_x = '640' newMon.type = 'h264' + if(Monitor.Zones){ + newMon.details.cords = JSON.stringify(Monitor.Zones) + } switch(Monitor.Function){ case'None': // The monitor is currently disabled. @@ -428,7 +475,7 @@ function importZoneMinderMonitor(Monitor){ function importMonitor(textData){ try{ - var parsedData = textData instanceof Object ? textData : safeJsonParse(textData) + var parsedData = textData instanceof Object ? textData : safeJsonParse(mergeConcattedJsonString(textData)) function postMonitor(v){ var monitorId = v.mid $.post(`${getApiPrefix('configureMonitor')}/${monitorId}`,{ @@ -439,10 +486,12 @@ function importMonitor(textData){ } //zoneminder one monitor if(parsedData.monitor){ + mergeZoneMinderZonesIntoMonitors(parsedData) postMonitor(importZoneMinderMonitor(parsedData.monitor.Monitor)) }else //zoneminder multiple monitors if(parsedData.monitors){ + mergeZoneMinderZonesIntoMonitors(parsedData) $.each(parsedData.monitors,function(n,v){ postMonitor(importZoneMinderMonitor(v.Monitor)) }) @@ -525,7 +574,7 @@ function launchImportMonitorWindow(callback){ title: lang['Import'], class: 'btn-primary', callback: function(){ - var textData = safeJsonParse($.confirm.e.find('textarea').val()) + var textData = safeJsonParse(mergeConcattedJsonString($.confirm.e.find('textarea').val())) if(callback){ callback(textData) }else{