新增对kw源卡拉OK歌词的支持
This commit is contained in:
@@ -76,3 +76,81 @@ export const tokenRequest = async(url, options = {}) => {
|
||||
})
|
||||
return requestObj
|
||||
}
|
||||
|
||||
export const lrcTools = {
|
||||
rxps: {
|
||||
wordLine: /^(\[\d{1,2}:.*\d{1,4}\])\s*(\S+(?:\s+\S+)*)?\s*/,
|
||||
tagLine: /\[(ver|ti|ar|al|by|kuwo):\s*(\S+(?:\s+\S+)*)\s*\]/,
|
||||
wordTimeAll: /<(-?\d+),(-?\d+)(?:,-?\d+)?>/g,
|
||||
wordTime: /<(-?\d+),(-?\d+)(?:,-?\d+)?>/,
|
||||
},
|
||||
offset: 1,
|
||||
offset2: 1,
|
||||
isOK: false,
|
||||
lines: [],
|
||||
getWordInfo(str, str2) {
|
||||
const offset = parseInt(str)
|
||||
const offset2 = parseInt(str2)
|
||||
const startTime = Math.floor((offset + offset2) / (this.offset * 2))
|
||||
const timeLength = Math.floor((offset - offset2) / (this.offset2 * 2))
|
||||
return {
|
||||
startTime,
|
||||
timeLength,
|
||||
}
|
||||
},
|
||||
parseLine(line) {
|
||||
if (line.length < 6) return
|
||||
let result = this.rxps.wordLine.exec(line)
|
||||
if (result) {
|
||||
const time = result[1]
|
||||
let words = result[2]
|
||||
if (words == null) {
|
||||
words = ''
|
||||
}
|
||||
const wordTimes = words.match(this.rxps.wordTimeAll)
|
||||
if (!wordTimes) {
|
||||
this.isOK = false
|
||||
return
|
||||
}
|
||||
// console.log(wordTimes)
|
||||
for (const timeStr of wordTimes) {
|
||||
const result = this.rxps.wordTime.exec(timeStr)
|
||||
const wordInfo = this.getWordInfo(result[1], result[2])
|
||||
words = words.replace(timeStr, `<${wordInfo.startTime},${wordInfo.timeLength}>`)
|
||||
}
|
||||
this.lines.push(time + words)
|
||||
return
|
||||
}
|
||||
result = this.rxps.tagLine.exec(line)
|
||||
if (!result) return
|
||||
if (result[1] == 'kuwo') {
|
||||
let content = result[2]
|
||||
if (content != null && content.includes('][')) {
|
||||
content = content.substring(0, content.indexOf(']['))
|
||||
}
|
||||
const valueOf = parseInt(content, 8)
|
||||
this.offset = Math.floor(valueOf / 10)
|
||||
this.offset2 = Math.floor(valueOf % 10)
|
||||
if (this.offset == 0 || Number.isNaN(this.offset) || this.offset2 == 0 || Number.isNaN(this.offset2)) {
|
||||
this.isOK = false
|
||||
}
|
||||
} else {
|
||||
this.lines.push(line)
|
||||
}
|
||||
},
|
||||
parse(lrc) {
|
||||
const lines = lrc.split(/\r\n|\r|\n/)
|
||||
const tools = Object.create(this)
|
||||
tools.isOK = true
|
||||
tools.offset = 1
|
||||
tools.offset2 = 1
|
||||
tools.lines = []
|
||||
|
||||
for (const line of lines) {
|
||||
if (!tools.isOK) return ''
|
||||
tools.parseLine(line)
|
||||
}
|
||||
|
||||
return tools.lines.length ? tools.lines.join('\n') : ''
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user