修复歌词标签解析格式没有严格按照标准的问题(#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
View File
@@ -11,3 +11,4 @@
- 修复 mg 图片、歌词获取 - 修复 mg 图片、歌词获取
- 修复某些 tx 歌单打开失败的问题 (#1060, @ght-000) - 修复某些 tx 歌单打开失败的问题 (#1060, @ght-000)
- 修复在某些情况下添加、移动歌曲时可能导致保存的歌曲顺序不对的问题(#2842) - 修复在某些情况下添加、移动歌曲时可能导致保存的歌曲顺序不对的问题(#2842)
- 修复歌词标签解析格式没有严格按照标准的问题(#2855)
+1 -1
View File
@@ -42,7 +42,7 @@ const parseLyric = str => {
let lxlyric = str.replace(/\[((\d+),\d+)\].*/g, str => { let lxlyric = str.replace(/\[((\d+),\d+)\].*/g, str => {
let result = str.match(/\[((\d+),\d+)\].*/) let result = str.match(/\[((\d+),\d+)\].*/)
let time = parseInt(result[2]) let time = parseInt(result[2])
let ms = time % 1000 let ms = (time % 1000).toString().padStart(3, '0')
time /= 1000 time /= 1000
let m = parseInt(time / 60).toString().padStart(2, '0') let m = parseInt(time / 60).toString().padStart(2, '0')
time %= 60 time %= 60
+4 -4
View File
@@ -108,8 +108,8 @@ export const lrcTools = {
getWordInfo(str, str2, prevWord) { getWordInfo(str, str2, prevWord) {
const offset = parseInt(str) const offset = parseInt(str)
const offset2 = parseInt(str2) const offset2 = parseInt(str2)
let startTime = Math.abs((offset + offset2) / (this.offset * 2)) let startTime = Math.trunc(Math.abs((offset + offset2) / (this.offset * 2)))
let endTime = Math.abs((offset - offset2) / (this.offset2 * 2)) + startTime let endTime = Math.trunc(Math.abs((offset - offset2) / (this.offset2 * 2)) + startTime)
if (prevWord) { if (prevWord) {
if (startTime < prevWord.endTime) { if (startTime < prevWord.endTime) {
prevWord.endTime = startTime prevWord.endTime = startTime
@@ -117,14 +117,14 @@ export const lrcTools = {
prevWord.startTime = prevWord.endTime 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) // console.log(prevWord)
} }
} }
return { return {
startTime, startTime,
endTime, endTime,
timeStr: `<${startTime},${endTime - startTime}>`, timeStr: `<${startTime},${Math.trunc(endTime - startTime)}>`,
} }
}, },
parseLine(line) { parseLine(line) {
+2 -2
View File
@@ -21,7 +21,7 @@ const mrcTools = {
const startTime = parseInt(result[1]) const startTime = parseInt(result[1])
let time = startTime let time = startTime
let ms = time % 1000 let ms = (time % 1000).toString().padStart(3, '0')
time /= 1000 time /= 1000
let m = parseInt(time / 60).toString().padStart(2, '0') let m = parseInt(time / 60).toString().padStart(2, '0')
time %= 60 time %= 60
@@ -36,7 +36,7 @@ const mrcTools = {
if (!times) continue if (!times) continue
times = times.map(time => { times = times.map(time => {
const result = /\((\d+),(\d+)\)/.exec(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 wordArr = words.split(this.rxps.wordTime)
const newWords = times.map((time, index) => `${time}${wordArr[index]}`).join('') const newWords = times.map((time, index) => `${time}${wordArr[index]}`).join('')
+3 -3
View File
@@ -22,12 +22,12 @@ const parseTools = {
}, },
msFormat(timeMs) { msFormat(timeMs) {
if (Number.isNaN(timeMs)) return '' if (Number.isNaN(timeMs)) return ''
let ms = timeMs % 1000 let ms = (timeMs % 1000).toString().padStart(3, '0')
timeMs /= 1000 timeMs /= 1000
let m = parseInt(timeMs / 60).toString().padStart(2, '0') let m = parseInt(timeMs / 60).toString().padStart(2, '0')
timeMs %= 60 timeMs %= 60
let s = parseInt(timeMs).toString().padStart(2, '0') let s = parseInt(timeMs).toString().padStart(2, '0')
return `[${m}:${s}.${String(ms).padStart(3, '0')}]` return `[${m}:${s}.${ms}]`
}, },
parseLyric(lrc) { parseLyric(lrc) {
lrc = lrc.trim() lrc = lrc.trim()
@@ -65,7 +65,7 @@ const parseTools = {
if (!times) continue if (!times) continue
times = times.map(time => { times = times.map(time => {
const result = /\((\d+),(\d+)\)/.exec(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 wordArr = words.split(this.rxps.wordTime)
const newWords = times.map((time, index) => `${time}${wordArr[index]}`).join('') const newWords = times.map((time, index) => `${time}${wordArr[index]}`).join('')
+8 -4
View File
@@ -60,10 +60,13 @@ const parseTools = {
lineTime: /^\[(\d+),\d+\]/, lineTime: /^\[(\d+),\d+\]/,
wordTime: /\(\d+,\d+,\d+\)/, wordTime: /\(\d+,\d+,\d+\)/,
wordTimeAll: /(\(\d+,\d+,\d+\))/g, 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 '' 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 timeMs /= 1000
let m = parseInt(timeMs / 60).toString().padStart(2, '0') let m = parseInt(timeMs / 60).toString().padStart(2, '0')
timeMs %= 60 timeMs %= 60
@@ -97,7 +100,7 @@ const parseTools = {
if (!times) continue if (!times) continue
times = times.map(time => { times = times.map(time => {
const result = /\((\d+),(\d+),\d+\)/.exec(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) const wordArr = words.split(this.rxps.wordTime)
wordArr.shift() wordArr.shift()
@@ -113,12 +116,13 @@ const parseTools = {
str = str.trim() str = str.trim()
str = str.replace(/\r/g, '') str = str.replace(/\r/g, '')
if (!str) return null if (!str) return null
const isPad3 = this.rxps.timeMs3.test(str) || !this.rxps.timeMs2.test(str)
const lines = str.split('\n') const lines = str.split('\n')
return lines.map(line => { return lines.map(line => {
if (!this.rxps.info.test(line)) return line if (!this.rxps.info.test(line)) return line
try { try {
const info = JSON.parse(line) 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('')}` : '' return timeTag ? `${timeTag}${info.c.map(t => t.tx).join('')}` : ''
} catch { } catch {
return '' return ''