diff --git a/publish/changeLog.md b/publish/changeLog.md index c9331ea6..604f744a 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -11,3 +11,4 @@ - 修复 mg 图片、歌词获取 - 修复某些 tx 歌单打开失败的问题 (#1060, @ght-000) - 修复在某些情况下添加、移动歌曲时可能导致保存的歌曲顺序不对的问题(#2842) +- 修复歌词标签解析格式没有严格按照标准的问题(#2855) diff --git a/src/common/utils/lyricUtils/kg.js b/src/common/utils/lyricUtils/kg.js index 8cf64ac7..47d54e26 100644 --- a/src/common/utils/lyricUtils/kg.js +++ b/src/common/utils/lyricUtils/kg.js @@ -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 diff --git a/src/renderer/utils/musicSdk/kw/util.js b/src/renderer/utils/musicSdk/kw/util.js index 61bffbec..df6d87ad 100644 --- a/src/renderer/utils/musicSdk/kw/util.js +++ b/src/renderer/utils/musicSdk/kw/util.js @@ -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) { diff --git a/src/renderer/utils/musicSdk/mg/lyric.js b/src/renderer/utils/musicSdk/mg/lyric.js index feb07933..27639706 100644 --- a/src/renderer/utils/musicSdk/mg/lyric.js +++ b/src/renderer/utils/musicSdk/mg/lyric.js @@ -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('') diff --git a/src/renderer/utils/musicSdk/tx/lyric.js b/src/renderer/utils/musicSdk/tx/lyric.js index ec2a809b..3090f2f8 100644 --- a/src/renderer/utils/musicSdk/tx/lyric.js +++ b/src/renderer/utils/musicSdk/tx/lyric.js @@ -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('') diff --git a/src/renderer/utils/musicSdk/wy/lyric.js b/src/renderer/utils/musicSdk/wy/lyric.js index 3d74f762..ce7d2c3c 100644 --- a/src/renderer/utils/musicSdk/wy/lyric.js +++ b/src/renderer/utils/musicSdk/wy/lyric.js @@ -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 ''