diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/browser/request.js b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/browser/request.js index 46da340083..07c1f9f94f 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/browser/request.js +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/browser/request.js @@ -4,7 +4,7 @@ export default (method, url, headers, body) => new Promise((resolve, reject) => xhr.onreadystatechange = () => {if(xhr.readyState == 4) resolve(xhr)} xhr.onerror = error => reject(error) xhr.open(method, url, true) - Object.keys(headers).filter(key => !['origin', 'referer'].includes(key)).forEach(key => xhr.setRequestHeader(key, headers[key])) + Object.keys(headers).filter(key => !['origin', 'referer'].includes(key.toLowerCase())).forEach(key => xhr.setRequestHeader(key, headers[key])) xhr.send(body) }).then(xhr => Object.assign(xhr, { statusCode: xhr.status, diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/crypto.js b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/crypto.js old mode 100644 new mode 100755 index 301fdf06ba..0d7c19f2bf --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/crypto.js +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/crypto.js @@ -1,6 +1,7 @@ 'use strict' const crypto = require('crypto') +const bodyify = require('querystring').stringify const parse = require('url').parse const uriKey = '3go8&$8*3*3h0k(2)2' const eapiKey = 'e82ckenh8dichen8' @@ -28,7 +29,9 @@ module.exports = { let data = `${url.path}-36cd479b6b5-${text}-36cd479b6b5-${digest}` return { url: url.href.replace(/\w*api/, 'eapi'), - body: 'params=' + encrypt(Buffer.from(data), eapiKey).toString('hex').toUpperCase() + body: bodyify({ + params: encrypt(Buffer.from(data), eapiKey).toString('hex').toUpperCase() + }) } } }, @@ -40,10 +43,37 @@ module.exports = { let text = JSON.stringify({method: 'POST', url: url.href, params: object}) return { url: url.resolve('/api/linux/forward'), - body: 'eparams=' + encrypt(Buffer.from(text), linuxapiKey).toString('hex').toUpperCase() + body: bodyify({ + eparams: encrypt(Buffer.from(text), linuxapiKey).toString('hex').toUpperCase() + }) } } }, + miguapi: { + encrypt: object => { + let text = JSON.stringify(object) + const EVP_BytesToKey = (password, salt, keyLength, ivSize) => { + salt = salt || Buffer.alloc(0) + let keySize = keyLength / 8 + let repeat = Math.ceil((keySize + ivSize * 8) / 32) + let buffer = Buffer.concat(Array.from(Array(repeat).keys()).reduce(result => + result.concat(crypto.createHash('md5').update(Buffer.concat([result.slice(-1)[0], password, salt])).digest()) + , [Buffer.alloc(0)])) + return { + key: buffer.slice(0, keySize), + iv: buffer.slice(keySize, keySize + ivSize) + } + } + let password = Buffer.from(crypto.randomBytes(32).toString('hex')), salt = crypto.randomBytes(8), + key = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8asrfSaoOb4je+DSmKdriQJKWVJ2oDZrs3wi5W67m3LwTB9QVR+cE3XWU21Nx+YBxS0yun8wDcjgQvYt625ZCcgin2ro/eOkNyUOTBIbuj9CvMnhUYiR61lC1f1IGbrSYYimqBVSjpifVufxtx/I3exReZosTByYp4Xwpb1+WAQIDAQAB\n-----END PUBLIC KEY-----' + let parameter = EVP_BytesToKey(password, salt, 256, 16) + let cipher = crypto.createCipheriv('aes-256-cbc', parameter.key, parameter.iv) + return bodyify({ + data: Buffer.concat([Buffer.from('Salted__'), salt, cipher.update(Buffer.from(text)), cipher.final()]).toString('base64'), + secKey: crypto.publicEncrypt({key, padding: crypto.constants.RSA_PKCS1_PADDING}, password).toString('base64') + }) + } + }, base64: { encode: text => Buffer.from(text).toString('base64').replace(/\+/g, '-').replace(/\//g, '_'), decode: text => Buffer.from(text.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('ascii') 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 3ac6c1216c..0f48883757 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.1", + "version": "0.15.2", "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 837d680dee..d4601a3e75 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.1", + "version": "0.15.2", "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 8f98754054..aa81285153 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,7 +14,7 @@ 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.name + ' - ' + info.artists[0].name + info.keyword = info.artists[0].name + ' - ' + info.name return info }) } diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/kugou.js b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/kugou.js index 46c95557b5..3f70109307 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/kugou.js +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/kugou.js @@ -21,16 +21,11 @@ const search = info => { const track = id => { let url = - 'http://www.kugou.com/yy/index.php?r=play/getdata&hash=' + id + 'http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash=' + id - return request('GET', url, {cookie: `kg_mid=${id.toLowerCase()}`}) + return request('GET', url) .then(response => response.json()) - .then(jsonBody => { - if(jsonBody.status == '1') - return jsonBody.data.play_url - else - return Promise.reject() - }) + .then(jsonBody => jsonBody.url || Promise.reject()) } const check = info => cache(search, info).then(track) diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/match.js b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/match.js index ee7eabdf1f..3e48118695 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/match.js +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/match.js @@ -1,5 +1,4 @@ const find = require('./find') -const crypto = require('../crypto') const request = require('../request') const provider = { diff --git a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/migu.js b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/migu.js index f287ab4934..80497d47fb 100644 --- a/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/migu.js +++ b/package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/provider/migu.js @@ -1,6 +1,12 @@ const cache = require('../cache') +const crypto = require('../crypto') const request = require('../request') +let headers = { + 'origin': 'http://music.migu.cn/', + 'referer': 'http://music.migu.cn/' +} + const search = info => { let url = 'http://m.10086.cn/migu/remoting/scr_search_tag?' + @@ -9,16 +15,28 @@ const search = info => { return request('GET', url) .then(response => response.json()) .then(jsonBody => { - if('musics' in jsonBody){ - let matched = jsonBody.musics[0] - return matched.mp3 - } - else{ + if('musics' in jsonBody) + return jsonBody.musics[0].copyrightId + else return Promise.reject() - } }) } -const check = info => cache(search, info) +const track = id => { + let url = + 'http://music.migu.cn/v3/api/music/audioPlayer/getPlayInfo?' + + 'dataType=2&' + crypto.miguapi.encrypt({copyrightId: id.toString()}) + + return request('GET', url, headers) + .then(response => response.json()) + .then(jsonBody => { + if('walkmanInfo' in jsonBody) + return encodeURI(jsonBody.walkmanInfo.playUrl) + else + return Promise.reject() + }) +} + +const check = info => cache(search, info).then(track) module.exports = {check} \ 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 c3ded51f7a..5e4f430bb7 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 @@ -72,17 +72,18 @@ const request = (method, url, headers, body) => { }) } -const read = (connect, raw) => new Promise((resolve, reject) => { - let chunks = [] - connect - .on('data', chunk => chunks.push(chunk)) - .on('end', () => { - let buffer = Buffer.concat(chunks) - buffer = (buffer.length && ['gzip', 'deflate'].includes(connect.headers['content-encoding'])) ? zlib.unzipSync(buffer) : buffer - resolve(raw == true ? buffer : buffer.toString()) +const read = (connect, raw) => + new Promise((resolve, reject) => { + let chunks = [] + connect + .on('data', chunk => chunks.push(chunk)) + .on('end', () => resolve(Buffer.concat(chunks))) + .on('error', error => reject(error)) + }) + .then(buffer => { + buffer = (buffer.length && ['gzip', 'deflate'].includes(connect.headers['content-encoding'])) ? zlib.unzipSync(buffer) : buffer + return raw == true ? buffer : buffer.toString() }) - .on('error', error => reject(error)) -}) const json = connect => read(connect, false).then(body => JSON.parse(body)) const jsonp = connect => read(connect, false).then(body => JSON.parse(body.slice(body.indexOf('(') + 1, -')'.length)))