lx-music-desktop/src/renderer/utils/music/kw/util.js
2021-05-15 01:42:23 +08:00

79 lines
2.1 KiB
JavaScript

import { httpGet, httpFetch } from '../../request'
import { rendererInvoke, NAMES } from '../../../../common/ipc'
const kw_token = {
token: null,
isGetingToken: false,
}
const translationMap = {
"{'": '{"',
"'}\n": '"}',
"'}": '"}',
"':'": '":"',
"','": '","',
"':{'": '":{"',
"':['": '":["',
"'}],'": '"}],"',
"':[{'": '":[{"',
"'},'": '"},"',
"'},{'": '"},{"',
"':[],'": '":[],"',
"':{},'": '":{},"',
}
export const objStr2JSON = str => {
return JSON.parse(str.replace(/(^{'|'}\n$|'}$|':'|','|':\[{'|'}\],'|':{'|'},'|'},{'|':\['|':\[\],'|':{},')/g, s => translationMap[s]))
}
export const formatSinger = rawData => rawData.replace(/&/g, '、')
export const matchToken = headers => {
try {
return headers['set-cookie'][0].match(/kw_token=(\w+)/)[1]
} catch (err) {
return null
}
}
const wait = time => new Promise(resolve => setTimeout(() => resolve(), time))
export const getToken = (retryNum = 0) => new Promise((resolve, reject) => {
if (retryNum > 2) return Promise.reject(new Error('try max num'))
if (kw_token.isGetingToken) return wait(1000).then(() => getToken(retryNum).then(token => resolve(token)))
if (kw_token.token) return resolve(kw_token.token)
kw_token.isGetingToken = true
httpGet('http://www.kuwo.cn/', (err, resp) => {
kw_token.isGetingToken = false
if (err) return getToken(++retryNum)
if (resp.statusCode != 200) return reject(new Error('获取失败'))
const token = kw_token.token = matchToken(resp.headers)
resolve(token)
})
})
export const decodeLyric = base64Data => rendererInvoke(NAMES.mainWindow.handle_kw_decode_lyric, base64Data)
export const tokenRequest = async(url, options = {}) => {
let token = kw_token.token
if (!token) token = await getToken()
if (!options.headers) {
options.headers = {
Referer: 'http://www.kuwo.cn/',
csrf: token,
cookie: 'kw_token=' + token,
}
}
const requestObj = httpFetch(url, options)
requestObj.promise = requestObj.promise.then(resp => {
console.log(resp)
if (resp.statusCode == 200) {
kw_token.token = matchToken(resp.headers)
}
return resp
})
return requestObj
}