Allow Importing ZoneMinder Zones with Monitor Configurations

merge-requests/367/merge
Moe 2022-08-12 09:54:59 -07:00
parent ceda85e5db
commit a02313ba77
3 changed files with 57 additions and 34 deletions

View File

@ -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);

View File

@ -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+'<div style="margin-top:15px"><div class="form-group"><textarea placeholder="'+lang['Paste JSON here.']+'" class="form-control"></textarea></div><label class="upload_file btn btn-primary btn-block"> Upload File <input class="upload" type=file name="files[]"></label></div>',
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){

View File

@ -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{