luci-app-unblockmusic: sync source
This commit is contained in:
parent
fe4faa3d07
commit
a1d9a6fccd
@ -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,
|
||||
|
||||
34
package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/crypto.js
Normal file → Executable file
34
package/lean/luci-app-unblockmusic/root/usr/share/unblockmusic/crypto.js
Normal file → Executable file
@ -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')
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "unblockneteasemusic",
|
||||
"version": "0.15.1",
|
||||
"version": "0.15.2",
|
||||
"lockfileVersion": 1
|
||||
}
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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
|
||||
})
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
const find = require('./find')
|
||||
const crypto = require('../crypto')
|
||||
const request = require('../request')
|
||||
|
||||
const provider = {
|
||||
|
||||
@ -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}
|
||||
@ -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)))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user