OSDN Git Service

2847a7c5f7726b050009d6670ae765300eb48ea8
[immortalwrt/luci.git] / applications / luci-app-unblockneteasemusic / luasrc / model / cbi / unblockneteasemusic / unblockneteasemusic.lua
1 local m, s, o
2
3 m = Map("unblockneteasemusic", translate("解除网易云音乐播放限制"))
4 m.description = translate("原理:采用 [Bilibili/JOOX/酷狗/酷我/咪咕/pyncmd/QQ/Youtube] 等音源,替换网易云音乐 无版权/收费 歌曲链接<br/>具体使用方法参见:<a href=\"https://github.com/UnblockNeteaseMusic/luci-app-unblockneteasemusic\" target=\"_blank\">GitHub @UnblockNeteaseMusic/luci-app-unblockneteasemusic</a>")
5
6 m:section(SimpleSection).template = "unblockneteasemusic/unblockneteasemusic_status"
7
8 s = m:section(TypedSection, "unblockneteasemusic")
9 s.anonymous = true
10 s.addremove = false
11
12 o = s:option(Flag, "enable", translate("启用本插件"))
13 o.description = translate("启用本插件以解除网易云音乐播放限制")
14 o.default = 0
15 o.rmempty = false
16
17 o = s:option(Value, "music_source", translate("音源接口"))
18 o:value("default", translate("默认"))
19 o:value("bilibili", translate("Bilibili音乐"))
20 o:value("joox", translate("JOOX音乐"))
21 o:value("kugou", translate("酷狗音乐"))
22 o:value("kuwo", translate("酷我音乐"))
23 o:value("migu", translate("咪咕音乐"))
24 o:value("pyncmd", translate("网易云音乐(pyncmd)"))
25 o:value("qq", translate("QQ音乐"))
26 o:value("youtube", translate("Youtube音乐"))
27 o:value("youtubedl", translate("Youtube音乐(youtube-dl)"))
28 o:value("ytdlp", translate("Youtube音乐(yt-dlp)"))
29 o:value("ytdownload", translate("Youtube音乐(ytdownload)"))
30 o.description = translate("自定义模式下,多个音源请用空格隔开")
31 o.default = "default"
32 o.rmempty = false
33
34 o = s:option(Flag, "local_vip", translate("启用本地 VIP"))
35 o.description = translate("启用后,可以使用去广告、个性换肤、鲸云音效等本地功能")
36 o.default = 0
37 o.rmempty = false
38
39 o = s:option(Flag, "enable_flac", translate("启用无损音质"))
40 o.description = translate("目前仅支持酷狗、酷我、咪咕、pyncmd、QQ 音源")
41 o.default = 0
42 o.rmempty = false
43
44 o = s:option(ListValue, "replace_music_source", translate("强制音乐音源替换"))
45 o:value("dont_replace", translate("不强制替换音乐音源"))
46 o:value("lower_than_192kbps", translate("当音质低于 192 Kbps(中)时"))
47 o:value("lower_than_320kbps", translate("当音质低于 320 Kbps(高)时"))
48 o:value("lower_than_999kbps", translate("当音质低于 999 Kbps(无损)时"))
49 o:value("replace_all", translate("替换所有音乐音源"))
50 o.description = translate("当音乐音质低于指定数值时,尝试强制使用其他平台的高音质版本进行替换")
51 o.default = "dont_replace"
52 o.rmempty = false
53
54 o = s:option(Flag, "use_custom_cookie", translate("使用自定义 Cookie"))
55 o.description = translate("使用自定义 Cookie 请求音源接口")
56 o.default = 0
57 o.rmempty = false
58
59 o = s:option(Value, "joox_cookie", translate("JOOX Cookie"))
60 o.description = translate("在 joox.com 获取,需要 wmid 和 session_key 值")
61 o.placeholder = "wmid=; session_key="
62 o.datatype = "string"
63 o:depends("use_custom_cookie", 1)
64
65 o = s:option(Value, "qq_cookie", translate("QQ Cookie"))
66 o.description = translate("在 y.qq.com 获取,需要 uin 和 qm_keyst值 ")
67 o.placeholder = "uin=; qm_keyst="
68 o.datatype = "string"
69 o:depends("use_custom_cookie", 1)
70
71 o = s:option(Value, "youtube_key", translate("Youtube API Key"))
72 o.description = translate("API Key 申请地址:https://developers.google.com/youtube/v3/getting-started#before-you-start")
73 o.datatype = "string"
74 o:depends("use_custom_cookie", 1)
75
76 o = s:option(Flag, "auto_update", translate("启用自动更新"))
77 o.description = translate("启用后,每天将定时自动检查最新版本并更新")
78 o.default = 0
79 o.rmempty = false
80
81 o = s:option(ListValue, "update_time", translate("检查更新时间"))
82 for update_time_hour = 0,23 do
83         o:value(update_time_hour, update_time_hour..":00")
84 end
85 o.default = "3"
86 o.description = translate("设定每天自动检查更新时间")
87 o:depends("auto_update", 1)
88
89 o = s:option(Button,"certificate", translate("HTTPS 证书"))
90 o.inputtitle = translate("下载 CA 根证书")
91 o.description = translate("Linux/iOS/MacOSX 在信任根证书后方可正常使用")
92 o.inputstyle = "reload"
93 o.write = function()
94         act_download_cert()
95 end
96
97 function act_download_cert()
98         local t,e
99         t=nixio.open("/usr/share/unblockneteasemusic/core/ca.crt","r")
100         luci.http.header('Content-Disposition','attachment; filename="ca.crt"')
101         luci.http.prepare_content("application/octet-stream")
102         while true do
103                 e=t:read(nixio.const.buffersize)
104                 if(not e)or(#e==0)then
105                         break
106                 else
107                         luci.http.write(e)
108                 end
109         end
110         t:close()
111         luci.http.close()
112 end
113
114 o = s:option(Flag, "advanced_mode", translate("启用进阶设置"))
115 o.description = translate("非必要不推荐使用")
116 o.default = 0
117 o.rmempty = false
118
119 o = s:option(Value, "http_port", translate("HTTP 监听端口"))
120 o.description = translate("程序监听的 HTTP 端口,不可与 其他程序/HTTPS 共用一个端口")
121 o.placeholder = "5200"
122 o.default = "5200"
123 o.datatype = "port"
124 o:depends({advanced_mode = true, hijack_ways = "dont_hijack"})
125 o:depends({advanced_mode = true, hijack_ways = "use_ipset"})
126
127 o = s:option(Value, "https_port", translate("HTTPS 监听端口"))
128 o.description = translate("程序监听的 HTTPS 端口,不可与 其他程序/HTTP 共用一个端口")
129 o.placeholder = "5201"
130 o.default = "5201"
131 o.datatype = "port"
132 o:depends({advanced_mode = true, hijack_ways = "dont_hijack"})
133 o:depends({advanced_mode = true, hijack_ways = "use_ipset"})
134
135 o = s:option(Value, "endpoint_url", translate("EndPoint"))
136 o.description = translate("具体说明参见:https://github.com/UnblockNeteaseMusic/server")
137 o.default = "https://music.163.com"
138 o.placeholder = "https://music.163.com"
139 o.datatype = "string"
140 o:depends("advanced_mode", 1)
141
142 o = s:option(Value, "cnrelay", translate("UNM bridge 服务器"))
143 o.description = translate("使用 UnblockNeteaseMusic 中继桥(bridge)以获取音源信息")
144 o.placeholder = "http(s)://host:port"
145 o.datatype = "string"
146 o:depends("advanced_mode", 1)
147
148 o = s:option(ListValue, "hijack_ways", translate("劫持方法"))
149 o:value("dont_hijack", translate("不开启劫持"))
150 o:value("use_ipset", translate("使用 IPSet 劫持"))
151 o:value("use_hosts", translate("使用 Hosts 劫持"))
152 o.description = translate("如果使用Hosts劫持,程序监听的 HTTP/HTTPS 端口将被锁定为 80/443")
153 o.default = "dont_hijack"
154 o:depends("advanced_mode", 1)
155
156 o = s:option(Flag, "keep_core_when_upgrade", translate("升级时保留核心程序"))
157 o.description = translate("默认情况下,在系统升级后会导致核心程序丢失,开启此选项后会保留当前下载的核心程序")
158 o.default = 0
159 o.rmempty = false
160 o:depends("advanced_mode", 1)
161
162 o = s:option(Flag, "pub_access", translate("部署到公网"))
163 o.description = translate("默认仅监听局域网,如需提供公开访问请勾选此选项")
164 o.default = 0
165 o.rmempty = false
166 o:depends("advanced_mode", 1)
167
168 o = s:option(Flag, "strict_mode", translate("启用严格模式"))
169 o.description = translate("若将服务部署到公网,则强烈建议使用严格模式,此模式下仅放行网易云音乐所属域名的请求;注意:该模式下不能使用全局代理")
170 o.default = 0
171 o.rmempty = false
172 o:depends("advanced_mode", 1)
173
174 o = s:option(Value, "netease_server_ip", translate("网易云服务器 IP"))
175 o.description = translate("通过 ping music.163.com 即可获得 IP 地址,仅限填写一个")
176 o.placeholder = "59.111.181.38"
177 o.datatype = "ipaddr"
178 o:depends("advanced_mode", 1)
179
180 o = s:option(Value, "proxy_server_ip", translate("代理服务器地址"))
181 o.description = translate("使用代理服务器获取音乐信息")
182 o.placeholder = "http(s)://host:port"
183 o.datatype = "string"
184 o:depends("advanced_mode", 1)
185
186 o = s:option(Value, "self_issue_cert_crt", translate("自签发证书公钥位置"))
187 o.description = translate("[公钥] 默认使用 UnblockNeteaseMusic 项目提供的 CA 证书,您可以指定为您自己的证书")
188 o.placeholder = "/usr/share/unblockneteasemusic/core/server.crt"
189 o.datatype = "file"
190 o:depends("advanced_mode", 1)
191
192 o = s:option(Value, "self_issue_cert_key", translate("自签发证书私钥位置"))
193 o.description = translate("[私钥] 默认使用 UnblockNeteaseMusic 项目提供的 CA 证书,您可以指定为您自己的证书")
194 o.placeholder = "/usr/share/unblockneteasemusic/core/server.key"
195 o.datatype = "file"
196 o:depends("advanced_mode", 1)
197
198 s = m:section(TypedSection, "acl_rule", translate("例外客户端规则"), translate("可以为局域网客户端分别设置不同的例外模式,默认无需设置"))
199 s.template = "cbi/tblsection"
200 s.sortable = true
201 s.anonymous = true
202 s.addremove = true
203
204 o = s:option(Value, "ip_addr", translate("IP 地址"))
205 o.width = "40%"
206 o.datatype = "ip4addr"
207 o.placeholder = "0.0.0.0/0"
208 luci.ip.neighbors({ family = 4 }, function(entry)
209         if entry.reachable then
210                 o:value(entry.dest:string())
211         end
212 end)
213
214 o = s:option(ListValue, "filter_mode", translate("规则"))
215 o.width = "40%"
216 o.default = "disable_all"
217 o.rmempty = false
218 o:value("disable_all", translate("不代理 HTTP 和 HTTPS"))
219 o:value("disable_http", translate("不代理 HTTP"))
220 o:value("disable_https", translate("不代理 HTTPS"))
221
222 return m