修复歌词标签解析格式没有严格按照标准的问题(#2855)

This commit is contained in:
lyswhut
2026-07-06 20:56:58 +08:00
parent af4603d87b
commit 75ba99d9d1
6 changed files with 19 additions and 14 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ const parseLyric = str => {
let lxlyric = str.replace(/\[((\d+),\d+)\].*/g, str => {
let result = str.match(/\[((\d+),\d+)\].*/)
let time = parseInt(result[2])
let ms = time % 1000
let ms = (time % 1000).toString().padStart(3, '0')
time /= 1000
let m = parseInt(time / 60).toString().padStart(2, '0')
time %= 60
+4 -4
View File
@@ -108,8 +108,8 @@ export const lrcTools = {
getWordInfo(str, str2, prevWord) {
const offset = parseInt(str)
const offset2 = parseInt(str2)
let startTime = Math.abs((offset + offset2) / (this.offset * 2))
let endTime = Math.abs((offset - offset2) / (this.offset2 * 2)) + startTime
let startTime = Math.trunc(Math.abs((offset + offset2) / (this.offset * 2)))
let endTime = Math.trunc(Math.abs((offset - offset2) / (this.offset2 * 2)) + startTime)
if (prevWord) {
if (startTime < prevWord.endTime) {
prevWord.endTime = startTime
@@ -117,14 +117,14 @@ export const lrcTools = {
prevWord.startTime = prevWord.endTime
}
prevWord.newTimeStr = `<${prevWord.startTime},${prevWord.endTime - prevWord.startTime}>`
prevWord.newTimeStr = `<${prevWord.startTime},${Math.trunc(prevWord.endTime - prevWord.startTime)}>`
// console.log(prevWord)
}
}
return {
startTime,
endTime,
timeStr: `<${startTime},${endTime - startTime}>`,
timeStr: `<${startTime},${Math.trunc(endTime - startTime)}>`,
}
},
parseLine(line) {
+2 -2
View File
@@ -21,7 +21,7 @@ const mrcTools = {
const startTime = parseInt(result[1])
let time = startTime
let ms = time % 1000
let ms = (time % 1000).toString().padStart(3, '0')
time /= 1000
let m = parseInt(time / 60).toString().padStart(2, '0')
time %= 60
@@ -36,7 +36,7 @@ const mrcTools = {
if (!times) continue
times = times.map(time => {
const result = /\((\d+),(\d+)\)/.exec(time)
return `<${parseInt(result[1]) - startTime},${result[2]}>`
return `<${Math.trunc(parseInt(result[1]) - startTime)},${result[2]}>`
})
const wordArr = words.split(this.rxps.wordTime)
const newWords = times.map((time, index) => `${time}${wordArr[index]}`).join('')
+3 -3
View File
@@ -22,12 +22,12 @@ const parseTools = {
},
msFormat(timeMs) {
if (Number.isNaN(timeMs)) return ''
let ms = timeMs % 1000
let ms = (timeMs % 1000).toString().padStart(3, '0')
timeMs /= 1000
let m = parseInt(timeMs / 60).toString().padStart(2, '0')
timeMs %= 60
let s = parseInt(timeMs).toString().padStart(2, '0')
return `[${m}:${s}.${String(ms).padStart(3, '0')}]`
return `[${m}:${s}.${ms}]`
},
parseLyric(lrc) {
lrc = lrc.trim()
@@ -65,7 +65,7 @@ const parseTools = {
if (!times) continue
times = times.map(time => {
const result = /\((\d+),(\d+)\)/.exec(time)
return `<${Math.max(parseInt(result[1]) - startMsTime, 0)},${result[2]}>`
return `<${Math.trunc(Math.max(parseInt(result[1]) - startMsTime, 0))},${result[2]}>`
})
const wordArr = words.split(this.rxps.wordTime)
const newWords = times.map((time, index) => `${time}${wordArr[index]}`).join('')
+8 -4
View File
@@ -60,10 +60,13 @@ const parseTools = {
lineTime: /^\[(\d+),\d+\]/,
wordTime: /\(\d+,\d+,\d+\)/,
wordTimeAll: /(\(\d+,\d+,\d+\))/g,
timeMs2: /\[\d+:\d+\.\d{2}]/,
timeMs3: /\[\d+:\d+\.\d{3}]/,
},
msFormat(timeMs) {
msFormat(timeMs, pad3 = true) {
if (Number.isNaN(timeMs)) return ''
let ms = timeMs % 1000
let ms = (timeMs % 1000).toString().padStart(pad3 ? 3 : 2, '0')
if (!pad3 && ms.length > 2) ms = ms.slice(0, 2)
timeMs /= 1000
let m = parseInt(timeMs / 60).toString().padStart(2, '0')
timeMs %= 60
@@ -97,7 +100,7 @@ const parseTools = {
if (!times) continue
times = times.map(time => {
const result = /\((\d+),(\d+),\d+\)/.exec(time)
return `<${Math.max(parseInt(result[1]) - startMsTime, 0)},${result[2]}>`
return `<${Math.trunc(Math.max(parseInt(result[1]) - startMsTime, 0))},${result[2]}>`
})
const wordArr = words.split(this.rxps.wordTime)
wordArr.shift()
@@ -113,12 +116,13 @@ const parseTools = {
str = str.trim()
str = str.replace(/\r/g, '')
if (!str) return null
const isPad3 = this.rxps.timeMs3.test(str) || !this.rxps.timeMs2.test(str)
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)
const timeTag = this.msFormat(info.t, isPad3)
return timeTag ? `${timeTag}${info.c.map(t => t.tx).join('')}` : ''
} catch {
return ''