diff options
author | Ted Hess <thess@kitschensync.net> | 2014-10-10 18:27:40 -0400 |
---|---|---|
committer | Ted Hess <thess@kitschensync.net> | 2014-12-09 09:49:58 -0500 |
commit | 624e37ceae2fa2bef7f51565f28bfc827ad0f704 (patch) | |
tree | a8b340d4b7732027aa6b89bc3803f3c0f2de1a60 | |
parent | 91532de6179704e4c69f1580274123f5956baf03 (diff) |
luci-app-mjpg-streamer: Add new module for mjpg-streamer management
Signed-off-by: Ted Hess <thess@kitschensync.net>
-rw-r--r-- | applications/luci-mjpg-streamer/Makefile | 4 | ||||
-rw-r--r-- | applications/luci-mjpg-streamer/ipkg/postinst | 6 | ||||
-rw-r--r-- | applications/luci-mjpg-streamer/luasrc/controller/mjpg-streamer.lua | 29 | ||||
-rw-r--r-- | applications/luci-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua | 235 | ||||
-rwxr-xr-x | applications/luci-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer | 11 | ||||
-rw-r--r-- | contrib/package/luci-addons/Makefile | 2 | ||||
-rw-r--r-- | po/templates/mjpg-streamer.pot | 135 |
7 files changed, 421 insertions, 1 deletions
diff --git a/applications/luci-mjpg-streamer/Makefile b/applications/luci-mjpg-streamer/Makefile new file mode 100644 index 000000000..1726202af --- /dev/null +++ b/applications/luci-mjpg-streamer/Makefile @@ -0,0 +1,4 @@ +PO = mjpg-streamer + +include ../../build/config.mk +include ../../build/module.mk diff --git a/applications/luci-mjpg-streamer/ipkg/postinst b/applications/luci-mjpg-streamer/ipkg/postinst new file mode 100644 index 000000000..cfca9d308 --- /dev/null +++ b/applications/luci-mjpg-streamer/ipkg/postinst @@ -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 +} diff --git a/applications/luci-mjpg-streamer/luasrc/controller/mjpg-streamer.lua b/applications/luci-mjpg-streamer/luasrc/controller/mjpg-streamer.lua new file mode 100644 index 000000000..97b9aa4ab --- /dev/null +++ b/applications/luci-mjpg-streamer/luasrc/controller/mjpg-streamer.lua @@ -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 diff --git a/applications/luci-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua b/applications/luci-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua new file mode 100644 index 000000000..1a627a6f3 --- /dev/null +++ b/applications/luci-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua @@ -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 diff --git a/applications/luci-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer b/applications/luci-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer new file mode 100755 index 000000000..6a380cfe5 --- /dev/null +++ b/applications/luci-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer @@ -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 diff --git a/contrib/package/luci-addons/Makefile b/contrib/package/luci-addons/Makefile index 859390cb2..1e4c31ed3 100644 --- a/contrib/package/luci-addons/Makefile +++ b/contrib/package/luci-addons/Makefile @@ -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,transmission,LuCI Support for Transmission,transmission-daemon)) $(eval $(call application,watchcat,LuCI Support for Watchcat,watchcat)) - +$(eval $(call application,mjpg-streamer,MJPG-Streamer service configuration module,mjpg-streamer)) ### Themes ### define theme diff --git a/po/templates/mjpg-streamer.pot b/po/templates/mjpg-streamer.pot new file mode 100644 index 000000000..5cd722f3a --- /dev/null +++ b/po/templates/mjpg-streamer.pot @@ -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 "" |