1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
-- Copyright 2012 Gabor Juhos <juhosg@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local m, s, o
m = Map("minidlna", translate("miniDLNA"),
translate("MiniDLNA is server software with the aim of being fully compliant with DLNA/UPnP-AV clients."))
m:section(SimpleSection).template = "minidlna_status"
s = m:section(TypedSection, "minidlna", "miniDLNA Settings")
s.addremove = false
s.anonymous = true
s:tab("general", translate("General Settings"))
s:tab("advanced", translate("Advanced Settings"))
o = s:taboption("general", Flag, "enabled", translate("Enable:"))
o.rmempty = false
function o.cfgvalue(self, section)
return luci.sys.init.enabled("minidlna") and self.enabled or self.disabled
end
function o.write(self, section, value)
if value == "1" then
luci.sys.init.enable("minidlna")
luci.sys.call("/etc/init.d/minidlna start >/dev/null")
else
luci.sys.call("/etc/init.d/minidlna stop >/dev/null")
luci.sys.init.disable("minidlna")
end
return Flag.write(self, section, value)
end
o = s:taboption("general", Value, "port", translate("Port:"),
translate("Port for HTTP (descriptions, SOAP, media transfer) traffic."))
o.datatype = "port"
o.default = 8200
o = s:taboption("general", Value, "interface", translate("Interfaces:"),
translate("Network interfaces to serve."))
o.template = "cbi/network_ifacelist"
o.widget = "checkbox"
o.nocreate = true
function o.cfgvalue(self, section)
local rv = { }
local val = Value.cfgvalue(self, section)
if val then
local ifc
for ifc in val:gmatch("[^,%s]+") do
rv[#rv+1] = ifc
end
end
return rv
end
function o.write(self, section, value)
local rv = { }
local ifc
for ifc in luci.util.imatch(value) do
rv[#rv+1] = ifc
end
Value.write(self, section, table.concat(rv, ","))
end
o = s:taboption("general", Value, "friendly_name", translate("Friendly name:"),
translate("Set this if you want to customize the name that shows up on your clients."))
o.rmempty = true
o.placeholder = "OpenWrt DLNA Server"
o = s:taboption("advanced", Value, "db_dir", translate("Database directory:"),
translate("Set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache."))
o.rmempty = true
o.placeholder = "/var/cache/minidlna"
o = s:taboption("advanced", Value, "log_dir", translate("Log directory:"),
translate("Set this if you would like to specify the directory where you want MiniDLNA to store its log file."))
o.rmempty = true
o.placeholder = "/var/log"
s:taboption("advanced", Flag, "inotify", translate("Enable inotify:"),
translate("Set this to enable inotify monitoring to automatically discover new files."))
s:taboption("advanced", Flag, "enable_tivo", translate("Enable TIVO:"),
translate("Set this to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO."))
o.rmempty = true
o = s:taboption("advanced", Flag, "strict_dlna", translate("Strict to DLNA standard:"),
translate("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.rmempty = true
o = s:taboption("advanced", Value, "presentation_url", translate("Presentation URL:"))
o.rmempty = true
o.placeholder = "http://192.168.1.1/"
o = s:taboption("advanced", Value, "notify_interval", translate("Notify interval:"),
translate("Notify interval in seconds."))
o.datatype = "uinteger"
o.placeholder = 900
o = s:taboption("advanced", Value, "serial", translate("Announced serial number:"),
translate("Serial number the miniDLNA daemon will report to clients in its XML description."))
o.placeholder = "12345678"
s:taboption("advanced", Value, "model_number", translate("Announced model number:"),
translate("Model number the miniDLNA daemon will report to clients in its XML description."))
o.placholder = "1"
o = s:taboption("advanced", Value, "minissdpsocket", translate("miniSSDP socket:"),
translate("Specify the path to the MiniSSDPd socket."))
o.rmempty = true
o.placeholder = "/var/run/minissdpd.sock"
o = s:taboption("general", ListValue, "root_container", translate("Root container:"))
o:value(".", translate("Standard container"))
o:value("B", translate("Browse directory"))
o:value("M", translate("Music"))
o:value("V", translate("Video"))
o:value("P", translate("Pictures"))
s:taboption("general", DynamicList, "media_dir", translate("Media directories:"),
translate("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. media_dir=A,/mnt/media/Music). Multiple directories can be specified."))
o = s:taboption("general", DynamicList, "album_art_names", translate("Album art names:"),
translate("This is a list of file names to check for when searching for album art."))
o.rmempty = true
o.placeholder = "Cover.jpg"
function o.cfgvalue(self, section)
local rv = { }
local val = Value.cfgvalue(self, section)
if type(val) == "table" then
val = table.concat(val, "/")
elseif not val then
val = ""
end
local file
for file in val:gmatch("[^/%s]+") do
rv[#rv+1] = file
end
return rv
end
function o.write(self, section, value)
local rv = { }
local file
for file in luci.util.imatch(value) do
rv[#rv+1] = file
end
Value.write(self, section, table.concat(rv, "/"))
end
return m
|