small-packages/luci-app-nvr/luasrc/model/cbi/nvr.lua
2026-05-10 09:48:30 +08:00

210 lines
8.8 KiB
Lua

m = Map("nvr", translate("The luci-app for instead of network video recorder hardware."))
m:section(SimpleSection).template = "nvr_status"
s = m:section(TypedSection, "nvr", "", translate("Network Video Recorder"))
s.anonymous = true
s.addremove = false
s:tab("nvr", translate("Basic setting"))
enabled = s:taboption("nvr", Flag, "enabled", translate("Record daemon"))
enabled.rmempty = false
nvr_sourcelist = s:taboption("nvr", ListValue, "nvr_sourcelist", translate("camera source"))
nvr_sourcelist.placeholder = "none"
nvr_sourcelist:value("none")
nvr_sourcelist:value("hikvision",translate("hikvision"))
nvr_sourcelist:value("tplink",translate("tplink"))
nvr_sourcelist:value("rtmp-url",translate("rtmp url"))
nvr_sourcelist:value("multiple-types",translate("multiple types"))
nvr_sourcelist.default = "none"
nvr_sourcelist.rmempty = true
hik_list = s:taboption("nvr", ListValue, "hik_list", translate("camera list"))
hik_list:depends( "nvr_sourcelist", "hikvision" )
hik_list.placeholder = "none"
hik_list:value("none")
hik_list:value("one-by-one",translate("one by one"))
hik_list:value("batch-add",translate("batch add"))
hik_list.default = "none"
hik_list.rmempty = true
hik_addonebyone = s:taboption("nvr", DynamicList, "hikpush")
hik_addonebyone:depends( "hik_list", "one-by-one" )
hik_addonebyone.title = translate("camera ip address")
hik_addonebyone.datatype = "ipaddr"
hik_addonebyone.placeholder = "192.168.1.64"
hik_addonebyone.description = translate("click + to continue")
hik_batch_start=s:taboption("nvr", Value, "hik_batch_start", translate("start of the ip address"))
hik_batch_start:depends( "hik_list", "batch-add" )
hik_batch_start.datatype = "ipaddr"
hik_batch_start.placeholder = "192.168.1.64"
hik_batch_start.rmempty = true
hik_batch_end=s:taboption("nvr", Value, "hik_batch_end", translate("end of the ip address"))
hik_batch_end:depends( "hik_list", "batch-add" )
hik_batch_end.datatype = "ipaddr"
hik_batch_end.placeholder = "192.168.1.200"
hik_batch_end.rmempty = true
hik_user=s:taboption("nvr", Value, "hik_user", translate("camera username"))
hik_user:depends( "nvr_sourcelist", "hikvision" )
hik_user.datatype = "string"
hik_user.placeholder = "username"
hik_user.rmempty = true
hik_pass=s:taboption("nvr", Value, "hik_pass", translate("camera password"))
hik_pass:depends( "nvr_sourcelist", "hikvision" )
hik_pass.datatype = "string"
hik_pass.placeholder = "password"
hik_pass.rmempty = true
tplink_list = s:taboption("nvr", ListValue, "tplink_list", translate("camera list"))
tplink_list:depends( "nvr_sourcelist", "tplink" )
tplink_list.placeholder = "none"
tplink_list:value("none")
tplink_list:value("one-by-one",translate("one by one"))
tplink_list:value("batch-add",translate("batch add"))
tplink_list.default = "none"
tplink_list.rmempty = true
tplink_addonebyone = s:taboption("nvr", DynamicList, "tplinkpush")
tplink_addonebyone:depends( "tplink_list", "one-by-one" )
tplink_addonebyone.title = translate("camera ip address")
tplink_addonebyone.datatype = "ipaddr"
tplink_addonebyone.placeholder = "192.168.1.60"
tplink_addonebyone.description = translate("click + to continue")
tplink_batch_start=s:taboption("nvr", Value, "tplink_batch_start", translate("start of the ip address"))
tplink_batch_start:depends( "tplink_list", "batch-add" )
tplink_batch_start.datatype = "ipaddr"
tplink_batch_start.placeholder = "192.168.1.60"
tplink_batch_start.rmempty = true
tplink_batch_end=s:taboption("nvr", Value, "tplink_batch_end", translate("end of the ip address"))
tplink_batch_end:depends( "tplink_list", "batch-add" )
tplink_batch_end.datatype = "ipaddr"
tplink_batch_end.placeholder = "192.168.1.200"
tplink_batch_end.rmempty = true
tplink_user=s:taboption("nvr", Value, "tplink_user", translate("camera username"))
tplink_user:depends( "nvr_sourcelist", "tplink" )
tplink_user.datatype = "string"
tplink_user.placeholder = "username"
tplink_user.rmempty = true
tplink_pass=s:taboption("nvr", Value, "tplink_pass", translate("camera password"))
tplink_pass:depends( "nvr_sourcelist", "tplink" )
tplink_pass.datatype = "string"
tplink_pass.placeholder = "password"
tplink_pass.rmempty = true
rtmpurl_add = s:taboption("nvr", DynamicList, "rtmppush")
rtmpurl_add:depends( "nvr_sourcelist", "rtmp-url" )
rtmpurl_add.title = translate("rtmp url address")
rtmpurl_add.datatype = "string"
rtmpurl_add.placeholder = "rtmp://ip:1935/live/camera001"
rtmpurl_add.description = translate("adding one by one")
multi_info1 = s:taboption("nvr", DummyValue, "multi_info1", translate("information"))
multi_info1:depends( "nvr_sourcelist", "multiple-types" )
multi_info1.description = translate("hikvision: rtsp://username:password@ip:554/h264/ch1/main/av_stream")
multi_info2 = s:taboption("nvr", DummyValue, "multi_info2", translate("information"))
multi_info2:depends( "nvr_sourcelist", "multiple-types" )
multi_info2.description = translate("tplink: rtsp://username:password@ip:554/stream1")
multi_add = s:taboption("nvr", DynamicList, "multipush")
multi_add:depends( "nvr_sourcelist", "multiple-types" )
multi_add.title = translate("rtsp/rtmp/http url address")
multi_add.datatype = "string"
multi_add.placeholder = "rtmp://ip:1935/live/camera001"
multi_add.description = translate("adding one by one")
storage_directory=s:taboption("nvr", Value, "storage_directory", translate("data storage directory"))
storage_directory.rmempty = false
storage_directory.datatype = "string"
storage_directory.placeholder = "/mnt/sda1/camera"
storage_directory.default = "/mnt/sda1/camera"
disk_name=s:taboption("nvr", Value, "disk_name", translate("storage disk name"))
disk_name.rmempty = false
disk_name.datatype = "string"
disk_name.placeholder = "sda1"
disk_usage=s:taboption("nvr", Value, "disk_usage", translate("set maximum disk space usage"))
disk_usage.rmempty = false
disk_usage.datatype = "string"
disk_usage.placeholder = "85%"
rec_time=s:taboption("nvr", Value, "rec_time", translate("single file duration"))
rec_time.rmempty = false
rec_time.datatype = "uinteger"
rec_time.placeholder = "300"
rec_time.default = "300"
rec_time.description = translate("in seconds")
storage_size=s:taboption("nvr", Value, "storage_size", translate("allocate total storage space"))
storage_size.rmempty = false
storage_size.datatype = "uinteger"
storage_size.placeholder = "1000"
storage_size.default = "1000"
storage_size.description = translate("in megabytes")
total_days=s:taboption("nvr", Value, "total_days", translate("total days of videos"))
total_days.rmempty = false
total_days.datatype = "uinteger"
total_days.placeholder = "30"
total_days.default = "30"
loop_write=s:taboption("nvr", Flag, "loop_write", translate("looping writting to disk"))
loop_write.rmempty = false
fulldisk=s:taboption("nvr", Flag, "fulldisk", translate("only detect disk space"))
fulldisk.rmempty = false
enable_audio=s:taboption("nvr", Flag, "enable_audio", translate("enable audio"))
enable_audio.rmempty = false
do_push=s:taboption("nvr", Flag, "do_push", translate("whether to push stream"))
rtmp_server_app=s:taboption("nvr", Value, "rtmp_server_app", translate("rtmp server application url"))
rtmp_server_app:depends( "do_push", "1" )
rtmp_server_app.rmempty = true
rtmp_server_app.datatype = "string"
rtmp_server_app.placeholder = "rtmp://ip:1935/application_name"
s:tab("action", translate("Action"))
recordaction=s:taboption("action", Button, "recoredaction", translate("One-click Record"))
recordaction.rmempty = true
recordaction.inputstyle = "apply"
function recordaction.write(self, section)
luci.util.exec("/usr/nvr/nvrstart 2>&1 &")
end
recordstop=s:taboption("action", Button, "recordstop", translate("One-click STOP Record"))
recordstop.rmempty = true
recordstop.inputstyle = "apply"
function recordstop.write(self, section)
luci.util.exec("/usr/nvr/nvrstop 2>&1 & ")
end
pushaction=s:taboption("action", Button, "pushaction", translate("One-click Push stream"))
pushaction:depends( "do_push", "1" )
pushaction.rmempty = true
pushaction.inputstyle = "apply"
function pushaction.write(self, section)
luci.util.exec("/usr/nvr/nvrpush >/dev/null 2>&1 &")
end
pushstop = s:taboption("action", Button, "pushstop", translate("One-click STOP Push"))
pushstop:depends( "do_push", "1" )
pushstop.rmempty = true
pushstop.inputstyle = "apply"
function pushstop.write(self, section)
luci.util.exec("kill -9 $(ps -w | grep 'f flv rtmp' | grep -v grep | awk '{print$1}' 2>&1 &)")
end
return m