diff options
author | Jo-Philipp Wich <jo@mein.io> | 2020-03-01 20:21:14 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2020-03-01 20:21:14 +0100 |
commit | 9ae591b38fedf16c3e5c97350b7182c5e28ed71f (patch) | |
tree | 9995b63807ebb39a0fd92e0a17807e86cbb67bc8 /applications/luci-app-minidlna/htdocs/luci-static/resources/view | |
parent | 0d68d0ad7bd2ab036caba973daa85864f8ec81a3 (diff) |
luci-app-minidlna: convert to client side rendering
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'applications/luci-app-minidlna/htdocs/luci-static/resources/view')
-rw-r--r-- | applications/luci-app-minidlna/htdocs/luci-static/resources/view/minidlna.js | 118 | ||||
-rw-r--r-- | applications/luci-app-minidlna/htdocs/luci-static/resources/view/status/include/80_minidlna.js | 30 |
2 files changed, 148 insertions, 0 deletions
diff --git a/applications/luci-app-minidlna/htdocs/luci-static/resources/view/minidlna.js b/applications/luci-app-minidlna/htdocs/luci-static/resources/view/minidlna.js new file mode 100644 index 0000000000..ff3cae13ee --- /dev/null +++ b/applications/luci-app-minidlna/htdocs/luci-static/resources/view/minidlna.js @@ -0,0 +1,118 @@ +'use strict'; +'require fs'; +'require uci'; +'require form'; +'require tools.widgets as widgets'; + +var CBIMiniDLNAStatus = form.DummyValue.extend({ + load: function() { + var port = +uci.get_first('minidlna', 'minidlna', 'port'); + + if (isNaN(port) || port < 0 || port > 65535) + port = 8200; + + return L.resolveDefault(fs.exec_direct('/usr/bin/wget', [ '-q', 'http://127.0.0.1:%d/'.format(port), '-O', '-' ]), null) + .then(L.bind(function(html) { + if (html == null) { + this.default = E('em', {}, [ _('The miniDLNA service is not running.') ]); + } + else { + var audio = html.match(/Audio files<\/td><td>(\d+)/), + video = html.match(/Video files<\/td><td>(\d+)/), + image = html.match(/Image files<\/td><td>(\d+)/); + + this.default = _('The miniDLNA service is active, serving %d audio, %d video and %d image files.') + .format(audio ? +audio[1] : 0, video ? +video[1] : 0, image ? +image[1] : 0); + } + }, this)); + } +}); + +return L.view.extend({ + render: function() { + var m, s, o; + + m = new form.Map('minidlna', _('miniDLNA'), _('MiniDLNA is server software with the aim of being fully compliant with DLNA/UPnP-AV clients.')); + + s = m.section(form.TypedSection); + s.title = _('Status'); + s.anonymous = true; + s.cfgsections = function() { return [ '_status' ] }; + + o = s.option(CBIMiniDLNAStatus); + + + s = m.section(form.TypedSection, 'minidlna', 'miniDLNA Settings'); + s.anonymous = true; + s.addremove = false; + + s.tab('general', _('General Settings')); + s.tab('advanced', _('Advanced Settings')); + + o = s.taboption('general', form.Flag, 'enabled', _('Enable')); + + o = s.taboption('general', form.Value, 'port', _('Port'), + _('Port for HTTP (descriptions, SOAP, media transfer) traffic.')); + o.default = '8200'; + + o = s.taboption('general', widgets.DeviceSelect, 'interface', _('Interfaces'), _('Network interfaces to serve.')); + o.multiple = true; + o.noaliases = true; + o.cfgvalue = function(section_id) { + return L.toArray(uci.get('minidlna', section_id, 'interface')).join(',').split(/[ \t,]+/); + }; + o.write = function(section_id, value) { + return uci.set('minidlna', section_id, 'interface', L.toArray(value).join(',')); + }; + + o = s.taboption('general', form.Value, 'friendly_name', _('Friendly name'), _('Set this if you want to customize the name that shows up on your clients.')); + + o = s.taboption('general', form.ListValue, 'root_container', _('Root container')); + o.value('.', _('Standard container')); + o.value('B', _('Browse directory')); + o.value('M', _('Music')); + o.value('V', _('Video')); + o.value('P', _('Pictures')); + + o = s.taboption('general', form.DynamicList, 'media_dir', _('Media directories'), _('Set this to the directory you want scanned. If you want to restrict the directory to a specific content type, you can prepend the type (\'A\' for audio, \'V\' for video, \'P\' for images), followed by a comma, to the directory (eg. A,/mnt/media/Music). Multiple directories can be specified.')); + + o = s.taboption('general', form.DynamicList, 'album_art_names', _('Album art names'), _('This is a list of file names to check for when searching for album art.')); + o.cfgvalue = function(section_id) { + return L.toArray(uci.get('minidlna', section_id, 'album_art_names')).join('/').split(/\//); + }; + o.write = function(section_id, value) { + return uci.set('minidlna', section_id, 'album_art_names', L.toArray(value).join('/')); + }; + + o = s.taboption('advanced', form.Value, 'db_dir', _('Database directory'), _('Set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache.')); + + o = s.taboption('advanced', form.Value, 'log_dir', _('Log directory'), _('Set this if you would like to specify the directory where you want MiniDLNA to store its log file.')); + + o = s.taboption('advanced', form.Flag, 'inotify', _('Enable inotify'), _('Set this to enable inotify monitoring to automatically discover new files.')); + o.default = o.enabled; + + o = s.taboption('advanced', form.Flag, 'enable_tivo', _('Enable TIVO'), _('Set this to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO.')); + + o = s.taboption('advanced', form.Flag, 'wide_links', _('Allow wide links'), _('Set this to allow serving content outside the media root (via symlinks).')); + + o = s.taboption('advanced', form.Flag, 'strict_dlna', _('Strict to DLNA standard'), _('Set this to strictly adhere to DLNA standards. This will allow server-side downscaling of very large JPEG images, which may hurt JPEG serving performance on (at least) Sony DLNA products.')); + + o = s.taboption('advanced', form.Value, 'presentation_url', _('Presentation URL')); + + o = s.taboption('advanced', form.Value, 'notify_interval', _('Notify interval'), _('Notify interval in seconds.')); + o.placeholder = '900'; + + o = s.taboption('advanced', form.Value, 'serial', _('Announced serial number'), _('Serial number the miniDLNA daemon will report to clients in its XML description.')); + o.placeholder = '12345678'; + + o = s.taboption('advanced', form.Value, 'uuid', _('Announced UUID')); + o.placeholder = '019f9a56-ff60-44c0-9edc-eae88d09fa05'; + + o = s.taboption('advanced', form.Value, 'model_number', _('Announced model number'), _('Model number the miniDLNA daemon will report to clients in its XML description.')); + o.placeholder = '1'; + + o = s.taboption('advanced', form.Value, 'minissdpsocket', _('miniSSDP socket'), _('Specify the path to the MiniSSDPd socket.')); + + return m.render(); + } +}); diff --git a/applications/luci-app-minidlna/htdocs/luci-static/resources/view/status/include/80_minidlna.js b/applications/luci-app-minidlna/htdocs/luci-static/resources/view/status/include/80_minidlna.js new file mode 100644 index 0000000000..f67e5f84b5 --- /dev/null +++ b/applications/luci-app-minidlna/htdocs/luci-static/resources/view/status/include/80_minidlna.js @@ -0,0 +1,30 @@ +'use strict'; +'require fs'; +'require uci'; + +return L.Class.extend({ + title: _('miniDLNA Status'), + + load: function() { + return uci.load('minidlna').then(function() { + var port = +uci.get_first('minidlna', 'minidlna', 'port'); + + if (isNaN(port) || port < 0 || port > 65535) + port = 8200; + + return L.resolveDefault(fs.exec_direct('/usr/bin/wget', [ '-q', 'http://127.0.0.1:%d/'.format(port), '-O', '-' ]), null); + }); + }, + + render: function(html) { + if (html == null) + return E('em', {}, [ _('The miniDLNA service is not running.') ]); + + var audio = html.match(/Audio files<\/td><td>(\d+)/), + video = html.match(/Video files<\/td><td>(\d+)/), + image = html.match(/Image files<\/td><td>(\d+)/); + + return _('The miniDLNA service is active, serving %d audio, %d video and %d image files.') + .format(audio ? +audio[1] : 0, video ? +video[1] : 0, image ? +image[1] : 0); + } +}); |