修复lrcx下载和解析问题
This commit is contained in:
@ -2,6 +2,7 @@ import zlib from 'zlib'
|
||||
import iconv from 'iconv-lite'
|
||||
import { IKaraokeWord, ILyric, ILyricLine, LyricType } from './declare'
|
||||
import { genLyricTag, parseLyricTag } from './common'
|
||||
import { parse as parseLrc } from './lrc'
|
||||
|
||||
|
||||
const KUWO_LYRIC_KEY = Buffer.from('yeelion')
|
||||
@ -22,13 +23,20 @@ function cryptLRCX(buffer: Buffer) {
|
||||
export function decrypt(buffer: Buffer) {
|
||||
try {
|
||||
//解压
|
||||
const b64Str = zlib.inflateSync(buffer).toString()
|
||||
//取得内容
|
||||
const content = Buffer.from(b64Str, 'base64')
|
||||
//解密
|
||||
cryptLRCX(content)
|
||||
const b64Buffer = zlib.inflateSync(buffer)
|
||||
const b64Str = b64Buffer.toString()
|
||||
//不需要解码
|
||||
if (/\s*\[[a-z0-9A-z]+:/.test(b64Str)) return iconv.decode(b64Buffer, 'gb18030')
|
||||
//进行解码
|
||||
else {
|
||||
//取得内容
|
||||
const content = Buffer.from(b64Str, 'base64')
|
||||
//解密
|
||||
cryptLRCX(content)
|
||||
//return
|
||||
return iconv.decode(content, 'gb18030')
|
||||
}
|
||||
//完成
|
||||
return iconv.decode(content, 'gb18030')
|
||||
} catch (err) {
|
||||
return null
|
||||
}
|
||||
@ -54,6 +62,9 @@ export function encrypt(content: string | Buffer) {
|
||||
* @param lrcxText LRCX歌词文本内容
|
||||
*/
|
||||
export function parse(lrcxText: string) {
|
||||
//如果不是lrcx则按照lrc解析
|
||||
if (!/^\[kuwo:\d+\]$/im.test(lrcxText)) return parseLrc(lrcxText)
|
||||
|
||||
//结果
|
||||
const result: ILyric = { type: LyricType.KARA, content: [] }
|
||||
|
||||
|
@ -149,8 +149,18 @@ export async function downloadKugouLyric(option: IKugouLyricDownloadOption) {
|
||||
|
||||
/** 酷我音乐歌词下载选项 */
|
||||
interface IKuwoLyricDownloadOption {
|
||||
/** 歌词KEY */
|
||||
key: string
|
||||
/**
|
||||
* 歌曲ID
|
||||
*
|
||||
* 可以是数字组成的ID,也可以是`MUSIC_\d+`
|
||||
*/
|
||||
musicID: string | number
|
||||
/**
|
||||
* 是否加载lrcx歌词, 默认`true`
|
||||
*
|
||||
* 如果没有lrcx歌词,返回的将是lrc歌词,可以通过判断歌词中是否有`[kuwo:\d+]`来检测是不是lrcx歌词
|
||||
*/
|
||||
lrcx?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
@ -158,8 +168,34 @@ interface IKuwoLyricDownloadOption {
|
||||
* @param option 下载选项
|
||||
*/
|
||||
export async function downloadKuwoLyric(option: IKuwoLyricDownloadOption) {
|
||||
|
||||
const KUWO_KEY = Buffer.from('yeelion')
|
||||
//加密歌词参数
|
||||
const buildParams = (id: string | number, lrcx: boolean) => {
|
||||
const rid = (typeof id == 'number' || /^\d+$/.test(id)) ? `MUSIC_${id}` : id
|
||||
let params = `user=313928,MUSIC_9.1.1.8_W6,kwmusic_web_6 (1).exe,KwMusic&requester=localhost&req=1&rid=${rid}`
|
||||
if (lrcx) params += '&lrcx=1&olrc=1'
|
||||
const pBuffer = Buffer.from(params)
|
||||
const output = new Uint16Array(pBuffer.byteLength)
|
||||
for (let i = 0; i < pBuffer.byteLength; ++i) {
|
||||
output[i] = KUWO_KEY[i % KUWO_KEY.length] ^ pBuffer[i]
|
||||
}
|
||||
return Buffer.from(output).toString('base64')
|
||||
}
|
||||
|
||||
//测试解码
|
||||
// const test = (buf: Buffer) => {
|
||||
// const src = Uint16Array.from(buf)
|
||||
// const out = Buffer.alloc(src.length)
|
||||
// for (let i = 0; i < src.length; ++i) {
|
||||
// out[i] = KUWO_KEY[i % KUWO_KEY.length] ^ src[i]
|
||||
// }
|
||||
// console.log(out + '')
|
||||
// }
|
||||
// test(Buffer.from(option.key, 'base64'))
|
||||
|
||||
//请求歌词
|
||||
let buffer = await request<Buffer>({ url: `http://newlyric.kuwo.cn/newlyric.lrc?${option.key}`, method: 'get' })
|
||||
let buffer = await request<Buffer>({ url: `http://newlyric.kuwo.cn/newlyric.lrc?${buildParams(option.musicID, option.lrcx ?? true)}`, method: 'get' })
|
||||
|
||||
//读取基本信息(其实没有用),并得到歌词内容
|
||||
const baseInfo: any = {}
|
||||
|
@ -13,7 +13,6 @@ async function test() {
|
||||
// }
|
||||
|
||||
console.log('==============================测试qrc==========================================')
|
||||
|
||||
await utils.downloadQQMusicLyric({ songID: 102878776 }).then(data => {
|
||||
const lyric = qrc.parse(data!)
|
||||
console.log(lyric)
|
||||
@ -29,7 +28,8 @@ async function test() {
|
||||
|
||||
console.log('==============================测试lrcx==========================================')
|
||||
await utils.downloadKuwoLyric({
|
||||
key: 'DBYAHlRcX0pcV1RFIjsqLCYzUEFfV1RLVDY4WFUOEgEcHAcaOhIJCzBYWU1URUcKFhxJLhskGh0QBkMeDB4bHBYRCRtSAhYGBAABAB0NQxcJGFJfWUMWAwcIABgIAFG9ra+40Z/dhKG8zKG1qE8OHA0MFhhU2qW5k9uRTx0HHVgoOTomLSZTUl9dX1tJU0MAGwwWRFRDAwUdDURU',
|
||||
musicID: 'MUSIC_67340506',
|
||||
lrcx: true,
|
||||
}).then(txt => {
|
||||
const lyric = lrcx.parse(txt!)
|
||||
console.log(lyric)
|
||||
|
Reference in New Issue
Block a user