mirror of https://github.com/openwrt/luci.git
luci-app-mjpg-streamer: Add new module for mjpg-streamer management
Signed-off-by: Ted Hess <thess@kitschensync.net>pull/264/head
parent
91532de617
commit
624e37ceae
|
@ -0,0 +1,4 @@
|
||||||
|
PO = mjpg-streamer
|
||||||
|
|
||||||
|
include ../../build/config.mk
|
||||||
|
include ../../build/module.mk
|
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/sh
|
||||||
|
[ -n "${IPKG_INSTROOT}" ] || {
|
||||||
|
( . /etc/uci-defaults/luci-mjpg-streamer ) && rm -f /etc/uci-defaults/luci-mjpg-streamer
|
||||||
|
/etc/init.d/mjpg-streamer enabled || /etc/init.d/mjpg-streamer enable
|
||||||
|
exit 0
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
--[[
|
||||||
|
LuCI MJPEG Streamer
|
||||||
|
|
||||||
|
(c) 2014 Roger D <rogerdammit@gmail.com>
|
||||||
|
Based on work by: vargabab and OpenWrt Dreambox
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
]]--
|
||||||
|
|
||||||
|
module("luci.controller.mjpg-streamer", package.seeall)
|
||||||
|
|
||||||
|
function index()
|
||||||
|
require("luci.i18n")
|
||||||
|
luci.i18n.loadc("mjpg-streamer")
|
||||||
|
if not nixio.fs.access("/etc/config/mjpg-streamer") then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local page = entry({"admin", "services", "mjpg-streamer"}, cbi("mjpg-streamer"), _("MJPG-streamer"))
|
||||||
|
page.i18n = "mjpg-streamer"
|
||||||
|
page.dependent = true
|
||||||
|
|
||||||
|
end
|
|
@ -0,0 +1,235 @@
|
||||||
|
--[[
|
||||||
|
|
||||||
|
LuCI MJPEG Streamer
|
||||||
|
|
||||||
|
(c) 2014 Roger D <rogerdammit@gmail.com>
|
||||||
|
Based on work by: vargabab and OpenWrt Dreambox
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
]]--
|
||||||
|
|
||||||
|
m = Map("mjpg-streamer", "MJPG-streamer", translate("mjpg streamer is a streaming application for Linux-UVC compatible webcams"))
|
||||||
|
|
||||||
|
--- General settings ---
|
||||||
|
|
||||||
|
section_gen = m:section(TypedSection, "mjpg-streamer", "General")
|
||||||
|
section_gen.addremove=false
|
||||||
|
section_gen.anonymous=true
|
||||||
|
|
||||||
|
enabled = section_gen:option(Flag, "enabled", "Enabled", "Enable MJPG-streamer")
|
||||||
|
|
||||||
|
input = section_gen:option(ListValue, "input", "Input plugin")
|
||||||
|
input:depends("enabled", "1")
|
||||||
|
input:value("uvc", "UVC")
|
||||||
|
---input:value("file", "File")
|
||||||
|
input.optional = false
|
||||||
|
|
||||||
|
output = section_gen:option(ListValue, "output", "Output plugin")
|
||||||
|
output:depends("enabled", "1")
|
||||||
|
output:value("http", "HTTP")
|
||||||
|
output:value("file", "File")
|
||||||
|
output.optional = false
|
||||||
|
|
||||||
|
|
||||||
|
--- Plugin settings ---
|
||||||
|
|
||||||
|
s = m:section(TypedSection, "mjpg-streamer", "Plugin settings")
|
||||||
|
s.addremove=false
|
||||||
|
s.anonymous=true
|
||||||
|
|
||||||
|
s:tab("output_http", translate("HTTP output"))
|
||||||
|
s:tab("output_file", translate("File output"))
|
||||||
|
s:tab("input_uvc", translate("UVC input"))
|
||||||
|
---s:tab("input_file", translate("File input"))
|
||||||
|
|
||||||
|
|
||||||
|
--- Input UVC settings ---
|
||||||
|
|
||||||
|
this_tab = "input_uvc"
|
||||||
|
|
||||||
|
device = s:taboption(this_tab, Value, "device", translate("Device"))
|
||||||
|
device.default="/dev/video0"
|
||||||
|
--device.datatype = "device"
|
||||||
|
device:value("/dev/video0", "/dev/video0")
|
||||||
|
device:value("/dev/video1", "/dev/video1")
|
||||||
|
device:value("/dev/video2", "/dev/video2")
|
||||||
|
device.optional = false
|
||||||
|
|
||||||
|
resolution = s:taboption(this_tab, Value, "resolution", translate("Resolution"))
|
||||||
|
resolution.default = "640x480"
|
||||||
|
resolution:value("320x240", "320x240")
|
||||||
|
resolution:value("640x480", "640x480")
|
||||||
|
resolution:value("800x600", "800x600")
|
||||||
|
resolution:value("864x480", "864x480")
|
||||||
|
resolution:value("960x544", "960x544")
|
||||||
|
resolution:value("960x720", "960x720")
|
||||||
|
resolution:value("1280x720", "1280x720")
|
||||||
|
resolution:value("1280x960", "1280x960")
|
||||||
|
resolution:value("1920x1080", "1920x1080")
|
||||||
|
resolution.optional = true
|
||||||
|
|
||||||
|
fps = s:taboption(this_tab, Value, "fps", translate("Frames per second"))
|
||||||
|
fps.datatype = "and(uinteger, min(1))"
|
||||||
|
fps.placeholder = "5"
|
||||||
|
fps.optional = true
|
||||||
|
|
||||||
|
yuv = s:taboption(this_tab, Flag, "yuv", translate("Enable YUYV format"), translate("Automatic disabling of MJPEG mode"))
|
||||||
|
|
||||||
|
quality = s:taboption(this_tab, Value, "quality", translate("JPEG compression quality"), translate("Set the quality in percent. This setting activates YUYV format, disables MJPEG"))
|
||||||
|
quality.datatype = "range(0, 100)"
|
||||||
|
|
||||||
|
minimum_size = s:taboption(this_tab, Value, "minimum_size", translate("Drop frames smaller then this limit"),translate("Set the minimum size if the webcam produces small-sized garbage frames. May happen under low light conditions"))
|
||||||
|
minimum_size.datatype = "uinteger"
|
||||||
|
|
||||||
|
no_dynctrl = s:taboption(this_tab, Flag, "no_dynctrl", translate("Don't initalize dynctrls"), translate("Do not initalize dynctrls of Linux-UVC driver"))
|
||||||
|
|
||||||
|
led = s:taboption(this_tab, ListValue, "led", translate("Led control"))
|
||||||
|
led:value("on", translate("On"))
|
||||||
|
led:value("off", translate("Off"))
|
||||||
|
led:value("blink", translate("Blink"))
|
||||||
|
led:value("auto", translate("Auto"))
|
||||||
|
led.optional = true
|
||||||
|
|
||||||
|
|
||||||
|
--- Output HTTP settings ---
|
||||||
|
|
||||||
|
this_tab = "output_http"
|
||||||
|
|
||||||
|
port=s:taboption(this_tab, Value, "port", translate("Port"), translate("TCP port for this HTTP server"))
|
||||||
|
port.datatype = "port"
|
||||||
|
port.placeholder = "8080"
|
||||||
|
|
||||||
|
enable_auth = s:taboption(this_tab, Flag, "enable_auth", translate("Authentication required"), translate("Ask for username and password on connect"))
|
||||||
|
enable_auth.default = false
|
||||||
|
|
||||||
|
username = s:taboption(this_tab, Value, "username", translate("Username"))
|
||||||
|
username:depends("enable_auth", "1")
|
||||||
|
username.optional = false
|
||||||
|
|
||||||
|
password = s:taboption(this_tab, Value, "password", translate("Password"))
|
||||||
|
password:depends("enable_auth", "1")
|
||||||
|
password.password = true
|
||||||
|
password.optional = false
|
||||||
|
password.default = false
|
||||||
|
|
||||||
|
www = s:taboption(this_tab, Value, "www", translate("WWW folder"), translate("Folder that contains webpages"))
|
||||||
|
www.datatype = "directory"
|
||||||
|
www.default = "/www/webcam/"
|
||||||
|
www.optional = false
|
||||||
|
|
||||||
|
|
||||||
|
--- HTTP preview ---
|
||||||
|
|
||||||
|
html = [[
|
||||||
|
<style media="screen" type="text/css">
|
||||||
|
.img-preview {
|
||||||
|
display: inline-block;
|
||||||
|
height: auto;
|
||||||
|
width: 640px;
|
||||||
|
padding: 4px;
|
||||||
|
line-height: 1.428571429;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 4px;
|
||||||
|
-webkit-transition: all .2s ease-in-out;
|
||||||
|
transition: all .2s ease-in-out;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div id="videodiv">
|
||||||
|
<img id="video_preview" class="img-preview" onerror="on_error()" onload="on_load()"/>
|
||||||
|
<p id="stream_status" style="text-align: center; color: orange; font-weight:bold;">Stream unavailable</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
function init_stream() {
|
||||||
|
console.log('init_stream');
|
||||||
|
start_stream()
|
||||||
|
}
|
||||||
|
|
||||||
|
function _start_stream() {
|
||||||
|
console.log('_start_stream');
|
||||||
|
|
||||||
|
port = document.getElementById('cbid.mjpg-streamer.core.port').value
|
||||||
|
|
||||||
|
if (document.getElementById('cbid.mjpg-streamer.core.enable_auth').checked) {
|
||||||
|
user = document.getElementById('cbid.mjpg-streamer.core.username').value
|
||||||
|
pass = document.getElementById('cbid.mjpg-streamer.core.password').value
|
||||||
|
login = user + ":" + pass + "@"
|
||||||
|
} else {
|
||||||
|
login = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
img = document.getElementById('video_preview');
|
||||||
|
img.src = 'http://' + login + location.hostname + ':' + port + '/?action=snapshot';
|
||||||
|
}
|
||||||
|
|
||||||
|
function start_stream() {
|
||||||
|
console.log('start_stream');
|
||||||
|
|
||||||
|
setTimeout(function() { _start_stream(); }, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
function on_error() {
|
||||||
|
console.log('on_error');
|
||||||
|
|
||||||
|
img = document.getElementById('video_preview');
|
||||||
|
img.style.display = 'none';
|
||||||
|
|
||||||
|
stream_stat = document.getElementById('stream_status');
|
||||||
|
stream_stat.style.display = 'block';
|
||||||
|
|
||||||
|
start_stream();
|
||||||
|
}
|
||||||
|
|
||||||
|
function on_load() {
|
||||||
|
console.log('on_load');
|
||||||
|
|
||||||
|
img = document.getElementById('video_preview');
|
||||||
|
img.style.display = 'block';
|
||||||
|
|
||||||
|
stream_stat = document.getElementById('stream_status');
|
||||||
|
stream_stat.style.display = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
init_stream()
|
||||||
|
|
||||||
|
</script>
|
||||||
|
]]
|
||||||
|
|
||||||
|
preview = s:taboption(this_tab, DummyValue, "_dummy", html)
|
||||||
|
preview:depends("output", "http")
|
||||||
|
|
||||||
|
--- Output file settings ---
|
||||||
|
|
||||||
|
this_tab = "output_file"
|
||||||
|
|
||||||
|
folder=s:taboption(this_tab, Value, "folder", translate("Folder"), translate("Set folder to save pictures"))
|
||||||
|
folder.placeholder="/tmp/images"
|
||||||
|
folder.datatype = "directory"
|
||||||
|
|
||||||
|
--mjpeg=s:taboption(this_tab, Value, "mjpeg", translate("Mjpeg output"), translate("Check to save the stream to an mjpeg file"))
|
||||||
|
|
||||||
|
delay=s:taboption(this_tab, Value, "delay", translate("Interval between saving pictures"), translate("Set the inteval in millisecond"))
|
||||||
|
delay.placeholder="5000"
|
||||||
|
delay.datatype = "uinteger"
|
||||||
|
|
||||||
|
ringbuffer=s:taboption(this_tab, Value, "ringbuffer", translate("Ring buffer size"), translate("Max. number of pictures to hold"))
|
||||||
|
ringbuffer.placeholder="10"
|
||||||
|
ringbuffer.datatype = "uinteger"
|
||||||
|
|
||||||
|
exceed=s:taboption(this_tab, Value, "exceed", translate("Exceed"), translate("Allow ringbuffer to exceed limit by this amount"))
|
||||||
|
exceed.datatype = "uinteger"
|
||||||
|
|
||||||
|
command=s:taboption(this_tab, Value, "command", translate("Command to run"), translate("Execute command after saving picture. Mjpg-streamer parse the filename as first parameter to your script."))
|
||||||
|
|
||||||
|
|
||||||
|
return m
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
uci -q batch <<-EOF >/dev/null
|
||||||
|
delete ucitrack.@mjpg-streamer[-1]
|
||||||
|
add ucitrack mjpg-streamer
|
||||||
|
set ucitrack.@mjpg-streamer[-1].init=mjpg-streamer
|
||||||
|
commit ucitrack
|
||||||
|
EOF
|
||||||
|
|
||||||
|
rm -f /tmp/luci-indexcache
|
||||||
|
exit 0
|
|
@ -217,7 +217,7 @@ $(eval $(call application,shairplay,LuCI Support for Shairplay,shairplay))
|
||||||
$(eval $(call application,shairport,LuCI Support for Shairport,shairport))
|
$(eval $(call application,shairport,LuCI Support for Shairport,shairport))
|
||||||
$(eval $(call application,transmission,LuCI Support for Transmission,transmission-daemon))
|
$(eval $(call application,transmission,LuCI Support for Transmission,transmission-daemon))
|
||||||
$(eval $(call application,watchcat,LuCI Support for Watchcat,watchcat))
|
$(eval $(call application,watchcat,LuCI Support for Watchcat,watchcat))
|
||||||
|
$(eval $(call application,mjpg-streamer,MJPG-Streamer service configuration module,mjpg-streamer))
|
||||||
|
|
||||||
### Themes ###
|
### Themes ###
|
||||||
define theme
|
define theme
|
||||||
|
|
|
@ -0,0 +1,135 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr "Content-Type: text/plain; charset=UTF-8"
|
||||||
|
|
||||||
|
msgid "Allow ringbuffer to exceed limit by this amount"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Ask for username and password on connect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Authentication required"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Auto"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Automatic disabling of MJPEG mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Blink"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Check to save the stream to an mjpeg file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Command to run"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Device"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Do not initalize dynctrls of Linux-UVC driver"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Don't initalize dynctrls"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Drop frames smaller then this limit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enable YUYV format"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Exceed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Execute command after saving picture. Mjpg-streamer parse the filename as "
|
||||||
|
"first parameter to your script."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "File input"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "File output"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Folder"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Folder that contains webpages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Frames per second"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "HTTP output"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Interval between saving pictures"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "JPEG compression quality"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Led control"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "MJPG-streamer"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Max. number of pictures to hold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mjpeg output"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Off"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "On"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Port"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Resolution"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Ring buffer size"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Set folder to save pictures"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Set the inteval in millisecond"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Set the minimum size if the webcam produces small-sized garbage frames. May "
|
||||||
|
"happen under low light conditions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Set the quality in percent. This setting activates YUYV format, disables "
|
||||||
|
"MJPEG"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "TCP port for this HTTP server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "UVC input"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Username"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "WWW folder"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"mjpg streamer is a streaming application for Linux-UVC compatible webcams"
|
||||||
|
msgstr ""
|
Loading…
Reference in New Issue