unblockneteasemusic.lua 10 KB

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