luci-app-unblockmusic: sync source

This commit is contained in:
CN_SZTL 2019-07-14 05:17:46 +08:00
parent fe4faa3d07
commit a1d9a6fccd
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
9 changed files with 75 additions and 32 deletions

View File

@ -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,

View 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')

View File

@ -1,5 +1,5 @@
{
"name": "unblockneteasemusic",
"version": "0.15.1",
"version": "0.15.2",
"lockfileVersion": 1
}

View File

@ -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": {

View File

@ -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
})
}

View File

@ -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)

View File

@ -1,5 +1,4 @@
const find = require('./find')
const crypto = require('../crypto')
const request = require('../request')
const provider = {

View File

@ -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}

View File

@ -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)))