添加wy源逐字歌词的支持
parent
4e3356ccb2
commit
7e27ec488b
|
@ -3,6 +3,7 @@
|
|||
- 新增桌面歌词设置字体加粗设置,可以到设置-桌面歌词设置-加粗字体修改
|
||||
- 新增是否自动下载更新设置,默认开启,可以去设置-软件更新更改
|
||||
- 新增当前版本更新日志显示弹窗(建议大家阅读更新日志以了解当前版本的变化),在更新版本后将自动弹出
|
||||
- 添加wy源逐字歌词的支持
|
||||
|
||||
### 优化
|
||||
|
||||
|
|
|
@ -119,15 +119,17 @@ export const getCachedLyricInfo = async(musicInfo: LX.Music.MusicInfo): Promise<
|
|||
// }
|
||||
|
||||
if (lrcInfo.lxlyric == null) {
|
||||
switch (musicInfo.source) {
|
||||
switch (musicInfo.source) { // 以下源支持lxlyric 重新获取
|
||||
case 'kg':
|
||||
case 'kw':
|
||||
case 'mg':
|
||||
case 'wy':
|
||||
break
|
||||
default:
|
||||
return lrcInfo
|
||||
}
|
||||
} else if (lrcInfo.rlyric == null) {
|
||||
// 以下源支持 rlyric 重新获取
|
||||
if (!['wy', 'kg'].includes(musicInfo.source)) return lrcInfo
|
||||
} else return lrcInfo
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { httpFetch } from '../../request'
|
||||
import { linuxapi } from './utils/crypto'
|
||||
import { eapi } from './utils/crypto'
|
||||
// import { decodeName } from '../..'
|
||||
|
||||
// const parseLyric = (str, lrc) => {
|
||||
|
@ -34,33 +34,176 @@ import { linuxapi } from './utils/crypto'
|
|||
// return lxlyric.trim()
|
||||
// }
|
||||
|
||||
// https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1523/files
|
||||
export default songmid => {
|
||||
const requestObj = httpFetch('https://music.163.com/api/linux/forward', {
|
||||
const eapiRequest = (url, data) => {
|
||||
return httpFetch('https://interface3.music.163.com/eapi/song/lyric/v1', {
|
||||
method: 'post',
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
|
||||
form: linuxapi({
|
||||
method: 'POST',
|
||||
url: 'https://music.163.com/api/song/lyric?_nmclfl=1',
|
||||
params: {
|
||||
id: songmid,
|
||||
tv: -1,
|
||||
lv: -1,
|
||||
rv: -1,
|
||||
kv: -1,
|
||||
},
|
||||
}),
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
|
||||
origin: 'https://music.163.com',
|
||||
// cookie: 'os=pc; deviceId=A9C064BB4584D038B1565B58CB05F95290998EE8B025AA2D07AE; osver=Microsoft-Windows-10-Home-China-build-19043-64bit; appver=2.5.2.197409; channel=netease; MUSIC_A=37a11f2eb9de9930cad479b2ad495b0e4c982367fb6f909d9a3f18f876c6b49faddb3081250c4980dd7e19d4bd9bf384e004602712cf2b2b8efaafaab164268a00b47359f85f22705cc95cb6180f3aee40f5be1ebf3148d888aa2d90636647d0c3061cd18d77b7a0; __csrf=05b50d54082694f945d7de75c210ef94; mode=Z7M-KP5(7)GZ; NMTID=00OZLp2VVgq9QdwokUgq3XNfOddQyIAAAF_6i8eJg; ntes_kaola_ad=1',
|
||||
},
|
||||
form: eapi(url, data),
|
||||
})
|
||||
// requestObj.promise = requestObj.promise.then(({ body }) => {
|
||||
// // console.log(raw)
|
||||
// console.log(body)
|
||||
// // console.log(eapiDecrypt(raw))
|
||||
// // return eapiDecrypt(raw)
|
||||
// return body
|
||||
// })
|
||||
// return requestObj
|
||||
}
|
||||
|
||||
const parseTools = {
|
||||
rxps: {
|
||||
info: /^{"/,
|
||||
lineTime: /^\[(\d+),\d+\]/,
|
||||
wordTime: /\(\d+,\d+,\d+\)/,
|
||||
wordTimeAll: /(\(\d+,\d+,\d+\))/g,
|
||||
},
|
||||
msFormat(timeMs) {
|
||||
if (Number.isNaN(timeMs)) return ''
|
||||
let ms = timeMs % 1000
|
||||
timeMs /= 1000
|
||||
let m = parseInt(timeMs / 60).toString().padStart(2, '0')
|
||||
timeMs %= 60
|
||||
let s = parseInt(timeMs).toString().padStart(2, '0')
|
||||
return `[${m}:${s}.${ms}]`
|
||||
},
|
||||
parseLyric(lines) {
|
||||
const lxlrcLines = []
|
||||
const lrcLines = []
|
||||
|
||||
for (let line of lines) {
|
||||
line = line.trim()
|
||||
let result = this.rxps.lineTime.exec(line)
|
||||
if (!result) continue
|
||||
|
||||
const startMsTime = parseInt(result[1])
|
||||
const startTimeStr = this.msFormat(startMsTime)
|
||||
if (!startTimeStr) continue
|
||||
|
||||
let words = line.replace(this.rxps.lineTime, '')
|
||||
|
||||
lrcLines.push(`${startTimeStr}${words.replace(this.rxps.wordTimeAll, '')}`)
|
||||
|
||||
let times = words.match(this.rxps.wordTimeAll)
|
||||
if (!times) continue
|
||||
times = times.map(time => {
|
||||
const result = /\((\d+),(\d+),\d+\)/.exec(time)
|
||||
return `<${Math.max(parseInt(result[1]) - startMsTime, 0)},${result[2]}>`
|
||||
})
|
||||
const wordArr = words.split(this.rxps.wordTime)
|
||||
wordArr.shift()
|
||||
const newWords = times.map((time, index) => `${time}${wordArr[index]}`).join('')
|
||||
lxlrcLines.push(`${startTimeStr}${newWords}`)
|
||||
}
|
||||
return {
|
||||
lyric: lrcLines.join('\n'),
|
||||
lxlyric: lxlrcLines.join('\n'),
|
||||
}
|
||||
},
|
||||
parseHeaderInfo(str) {
|
||||
str = str.trim()
|
||||
str = str.replace(/\r/g, '')
|
||||
if (!str) return null
|
||||
const lines = str.split('\n')
|
||||
return lines.map(line => {
|
||||
if (!this.rxps.info.test(line)) return line
|
||||
try {
|
||||
const info = JSON.parse(line)
|
||||
const timeTag = this.msFormat(info.t)
|
||||
return timeTag ? `${timeTag}${info.c.map(t => t.tx).join('')}` : ''
|
||||
} catch {
|
||||
return ''
|
||||
}
|
||||
})
|
||||
},
|
||||
parse(ylrc, lrc, tlrc, rlrc) {
|
||||
const info = {
|
||||
lyric: '',
|
||||
tlyric: '',
|
||||
rlyric: '',
|
||||
lxlyric: '',
|
||||
}
|
||||
if (ylrc) {
|
||||
let lines = this.parseHeaderInfo(ylrc)
|
||||
if (lines) {
|
||||
const timeRxp = /^\[[\d:.]+\]/
|
||||
const headers = lines.filter(l => timeRxp.test(l)).join('\n')
|
||||
const result = this.parseLyric(lines)
|
||||
info.lxlyric = result.lxlyric
|
||||
info.lyric = `${headers}\n${result.lyric}`
|
||||
} else if (lrc) {
|
||||
lines = this.parseHeaderInfo(lrc)
|
||||
if (lines) info.lyric = lines.join('\n')
|
||||
}
|
||||
} else if (lrc) {
|
||||
const lines = this.parseHeaderInfo(lrc)
|
||||
if (lines) info.lyric = lines.join('\n')
|
||||
}
|
||||
if (tlrc) {
|
||||
const lines = this.parseHeaderInfo(tlrc)
|
||||
if (lines) info.tlyric = lines.join('\n')
|
||||
}
|
||||
if (rlrc) {
|
||||
const lines = this.parseHeaderInfo(rlrc)
|
||||
if (lines) info.rlyric = lines.join('\n')
|
||||
}
|
||||
|
||||
return info
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
// https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1523/files
|
||||
// export default songmid => {
|
||||
// const requestObj = httpFetch('https://music.163.com/api/linux/forward', {
|
||||
// method: 'post',
|
||||
// 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
|
||||
// form: linuxapi({
|
||||
// method: 'POST',
|
||||
// url: 'https://music.163.com/api/song/lyric?_nmclfl=1',
|
||||
// params: {
|
||||
// id: songmid,
|
||||
// tv: -1,
|
||||
// lv: -1,
|
||||
// rv: -1,
|
||||
// kv: -1,
|
||||
// },
|
||||
// }),
|
||||
// })
|
||||
// requestObj.promise = requestObj.promise.then(({ body }) => {
|
||||
// if (body.code !== 200 || !body?.lrc?.lyric) return Promise.reject(new Error('Get lyric failed'))
|
||||
// // console.log(body)
|
||||
// return {
|
||||
// lyric: body.lrc.lyric,
|
||||
// tlyric: body.tlyric?.lyric ?? '',
|
||||
// rlyric: body.romalrc?.lyric ?? '',
|
||||
// // lxlyric: parseLyric(body.klyric.lyric),
|
||||
// }
|
||||
// })
|
||||
// return requestObj
|
||||
// }
|
||||
|
||||
|
||||
// https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/module/lyric_new.js
|
||||
export default songmid => {
|
||||
const requestObj = eapiRequest('/api/song/lyric/v1', {
|
||||
id: songmid,
|
||||
cp: false,
|
||||
tv: 0,
|
||||
lv: 0,
|
||||
rv: 0,
|
||||
kv: 0,
|
||||
yv: 0,
|
||||
ytv: 0,
|
||||
yrv: 0,
|
||||
})
|
||||
requestObj.promise = requestObj.promise.then(({ body }) => {
|
||||
if (body.code !== 200 || !body?.lrc?.lyric) return Promise.reject(new Error('Get lyric failed'))
|
||||
// console.log(body)
|
||||
return {
|
||||
lyric: body.lrc.lyric,
|
||||
tlyric: body.tlyric?.lyric ?? '',
|
||||
rlyric: body.romalrc?.lyric ?? '',
|
||||
// lxlyric: parseLyric(body.klyric.lyric),
|
||||
}
|
||||
if (body.code !== 200 || !body?.lrc?.lyric) return Promise.reject(new Error('Get lyric failed'))
|
||||
return parseTools.parse(body.yrc?.lyric, body.lrc.lyric, body.tlyric?.lyric, body.romalrc?.lyric)
|
||||
})
|
||||
return requestObj
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue