From 85e1d9f70b137775a4ec82b102a6ef41dcc20037 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Wed, 17 Jul 2019 20:53:41 +0800 Subject: [PATCH] luci-app-unblockmusic: sync source --- package/lean/luci-app-unblockmusic/Makefile | 4 +-- .../root/usr/share/unblockmusic/hook.js | 10 ++++--- .../usr/share/unblockmusic/package-lock.json | 2 +- .../root/usr/share/unblockmusic/package.json | 2 +- .../usr/share/unblockmusic/provider/find.js | 4 +-- .../root/usr/share/unblockmusic/request.js | 2 +- .../root/usr/share/unblockmusic/server.js | 30 +++++++++++++------ 7 files changed, 34 insertions(+), 20 deletions(-) diff --git a/package/lean/luci-app-unblockmusic/Makefile b/package/lean/luci-app-unblockmusic/Makefile index d458059112..6a16e8242e 100644 --- a/package/lean/luci-app-unblockmusic/Makefile +++ b/package/lean/luci-app-unblockmusic/Makefile @@ -15,8 +15,8 @@ LUCI_TITLE:=LuCI support for UnblockNeteaseMusic LUCI_DEPENDS:=+node +bash +dnsmasq-full +ipset LUCI_PKGARCH:=all PKG_NAME:=luci-app-unblockmusic -PKG_VERSION:=1.2 -PKG_RELEASE:=3 +PKG_VERSION:=1.3 +PKG_RELEASE:=1 PKG_MAINTAINER:= diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/hook.js b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/hook.js index e777eaa379..0e7c5c8a75 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/hook.js +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/hook.js @@ -52,7 +52,9 @@ hook.target.path = [ '/api/v1/playlist/manipulate/tracks', '/api/song/like', '/api/v1/play/record', - '/api/playlist/v4/detail' + '/api/playlist/v4/detail', + '/api/v1/radio/get', + '/api/v1/discovery/recommend/songs' ] hook.request.before = ctx => { @@ -257,7 +259,7 @@ const tryMatch = ctx => { if((item.code != 200 || item.freeTrialInfo) && (target == 0 || item.id == target)){ return match(item.id) .then(song => { - item.url = `${global.endpoint || 'http://music.163.com'}/package/${crypto.base64.encode(song.url)}/${item.id}.mp3` + item.url = global.endpoint ? `${global.endpoint}/package/${crypto.base64.encode(song.url)}/${item.id}.mp3` : song.url item.md5 = song.md5 || crypto.md5.digest(song.url) item.size = song.size item.code = 200 @@ -280,8 +282,8 @@ const tryMatch = ctx => { try{ let header = netease.param.header header = typeof header === 'string' ? JSON.parse(header) : header - let {os, appver} = header - if(os in limit && newer(limit[os], appver)) + let os = header.os, version = header.appver + if(os in limit && newer(limit[os], version)) return cache(computeHash, task, 7 * 24 * 60 * 60 * 1000).then(value => item.md5 = value) } catch(e){} diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/package-lock.json b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/package-lock.json index 0f48883757..bacf84eb68 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/package-lock.json +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/package-lock.json @@ -1,5 +1,5 @@ { "name": "unblockneteasemusic", - "version": "0.15.2", + "version": "0.16.0", "lockfileVersion": 1 } diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/package.json b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/package.json index d4601a3e75..153ebbed77 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/package.json +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/package.json @@ -1,6 +1,6 @@ { "name": "unblockneteasemusic", - "version": "0.15.2", + "version": "0.16.0", "description": "Revive unavailable songs for Netease Cloud Music", "main": "provider/match.js", "bin": { diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/find.js b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/find.js index 3d5cfc4606..7c8cd78def 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/find.js +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/find.js @@ -14,9 +14,9 @@ const find = id => { let info = filter(jsonBody.songs[0], ['id', 'name', 'alias', 'duration']) info.album = filter(jsonBody.songs[0].album, ['id', 'name']) info.artists = jsonBody.songs[0].artists.map(artist => filter(artist, ['id', 'name'])) - info.keyword = info.artists.map(artist => artist.name).join(' / ') + ' - ' + info.name + info.keyword = info.name + ' - ' + info.artists.map(artist => artist.name).join(' / ') return info }) } -module.exports = id => cache(find, id) +module.exports = id => cache(find, id) \ No newline at end of file diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/request.js b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/request.js index 5e4f430bb7..cb4ac29348 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/request.js +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/request.js @@ -62,7 +62,7 @@ const request = (method, url, headers, body) => { .end(body) ) .on('error', error => reject(error)) - .end(body) + .end(options.method.toUpperCase() === 'CONNECT' ? null : body) }) .then(response => { if([201, 301, 302, 303, 307, 308].includes(response.statusCode)) diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/server.js b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/server.js index a57e841a5f..1710dac487 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/server.js +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/server.js @@ -24,6 +24,7 @@ const proxy = { else{ const ctx = {res, req} Promise.resolve() + .then(() => proxy.protect(ctx)) .then(() => proxy.authenticate(ctx)) .then(() => hook.request.before(ctx)) .then(() => proxy.filter(ctx)) @@ -37,6 +38,7 @@ const proxy = { tunnel: (req, socket, head) => { const ctx = {req, socket, head} Promise.resolve() + .then(() => proxy.protect(ctx)) .then(() => proxy.authenticate(ctx)) .then(() => hook.connect.before(ctx)) .then(() => proxy.filter(ctx)) @@ -47,6 +49,19 @@ const proxy = { .catch(() => proxy.tunnel.close(ctx)) } }, + abort: (socket, from) => { + // console.log('call abort', from) + if(socket) socket.end() + if(socket && !socket.destroyed) socket.destroy() + }, + protect: ctx => { + const req = ctx.req + const res = ctx.res + const socket = ctx.socket + if(req) req.on('error', () => proxy.abort(req.socket, 'req')) + if(res) res.on('error', () => proxy.abort(res.socket, 'res')) + if(socket) socket.on('error', () => proxy.abort(socket, 'socket')) + }, log: ctx => { const mark = {close: '|', blank: '-', proxy: '>'}[ctx.decision] || '>' if(ctx.socket) @@ -59,7 +74,8 @@ const proxy = { const res = ctx.res const socket = ctx.socket let credential = Buffer.from((req.headers['proxy-authorization'] || '').split(/\s+/).pop() || '', 'base64').toString() - if(server.authentication && credential != server.authentication){ + if('proxy-authorization' in req.headers) delete req.headers['proxy-authorization'] + if(server.authentication && credential != server.authentication && (socket || req.url.startsWith('http://'))){ if(socket) socket.write('HTTP/1.1 407 Proxy Auth Required\r\nProxy-Authenticate: Basic realm="realm"\r\n\r\n') else @@ -101,24 +117,20 @@ const proxy = { }), response: ctx => { const res = ctx.res - const proxyRes = ctx.proxyRes + const proxyRes = ctx.proxyRes.on('error', () => proxy.abort(ctx.proxyRes.socket, 'proxyRes')) res.writeHead(proxyRes.statusCode, proxyRes.headers) proxyRes.readable ? proxyRes.pipe(res) : res.end(proxyRes.body) }, close: ctx => { - ctx.res.socket.end() + proxy.abort(ctx.res.socket, 'mitm') } }, tunnel: { connect: ctx => new Promise((resolve, reject) => { if(ctx.decision === 'close') return reject(ctx.error = ctx.decision) const req = ctx.req - const socket = ctx.socket const head = ctx.head const url = parse('https://' + req.url) - socket.on('error', error => { - return reject(ctx.error = error) - }) if(global.proxy && !req.local){ const options = request.configure(req.method, url, req.headers) request.create(proxy)(options) @@ -150,12 +162,12 @@ const proxy = { pipe: ctx => new Promise((resolve, reject) => { if(ctx.decision === 'blank') return reject(ctx.error = ctx.decision) const socket = ctx.socket - const proxySocket = ctx.proxySocket + const proxySocket = ctx.proxySocket.on('error', () => proxy.abort(ctx.proxySocket, 'proxySocket')) socket.pipe(proxySocket) proxySocket.pipe(socket) }), close: ctx => { - ctx.socket.end() + proxy.abort(ctx.socket, 'tunnel') } } }