From 3cf45f602f2bcb7c3c644e3573967db1db05b39d Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 22 Apr 2023 18:32:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=B9=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=97=B6=E9=97=B4=E6=A0=87=E7=AD=BE=E7=9A=84?= =?UTF-8?q?=E6=AD=8C=E8=AF=8D=E7=9A=84=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + .../utils/lyric-font-player/line-player.js | 30 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 12cac98a..d52ac0e5 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -12,6 +12,7 @@ - 修复启用全局快捷键时与Media Session注册冲突的问题,启用全局快捷键时,不再注册媒体控制快捷键 - 修复mg搜索不显示时长的问题(@Folltoshe) - 修复mg评论加载失败的问题(@Folltoshe) +- 修复对存在错误时间标签的歌词的解析 ### 其他 diff --git a/src/common/utils/lyric-font-player/line-player.js b/src/common/utils/lyric-font-player/line-player.js index 4144d4b4..e7e7c202 100644 --- a/src/common/utils/lyric-font-player/line-player.js +++ b/src/common/utils/lyric-font-player/line-player.js @@ -1,9 +1,7 @@ const { getNow, TimeoutTools } = require('./utils') const timeFieldExp = /^(?:\[[\d:.]+\])+/g -const timeExp = /[\d:.]+/g -const timeLabelRxp = /^(\[[\d:]+\.)0+(\d+\])/ -const timeLabelFixRxp = /(?:\.0+|0+)$/ +const timeExp = /\d{1,3}(:\d{1,3}){0,2}(?:\.\d{1,3})/g const tagRegMap = { title: 'ti', artist: 'ar', @@ -14,6 +12,15 @@ const tagRegMap = { const timeoutTools = new TimeoutTools() +const t_rxp_1 = /^0+(\d+)/ +const t_rxp_2 = /:0+(\d+)/g +const t_rxp_3 = /\.0+(\d+)/ +const formaterTimeLabel = (label) => { + return label.replace(t_rxp_1, '$1') + .replace(t_rxp_2, ':$1') + .replace(t_rxp_3, '.$1') +} + const parseExtendedLyric = (lrcLinesMap, extendedLyric) => { const extendedLines = extendedLyric.split(/\r\n|\n|\r/) for (let i = 0; i < extendedLines.length; i++) { @@ -26,9 +33,7 @@ const parseExtendedLyric = (lrcLinesMap, extendedLyric) => { const times = timeField.match(timeExp) if (times == null) continue for (let time of times) { - if (time.includes('.')) time = time.replace(timeLabelRxp, '$1$2') - else time += '.0' - const timeStr = time.replace(timeLabelFixRxp, '') + const timeStr = formaterTimeLabel(time) const targetLine = lrcLinesMap[timeStr] if (targetLine) targetLine.extendedLyrics.push(text) } @@ -88,19 +93,16 @@ module.exports = class LinePlayer { const times = timeField.match(timeExp) if (times == null) continue for (let time of times) { - if (time.includes('.')) time = time.replace(timeLabelRxp, '$1$2') - else time += '.0' - const timeStr = time.replace(timeLabelFixRxp, '') + const timeStr = formaterTimeLabel(time) if (linesMap[timeStr]) { linesMap[timeStr].extendedLyrics.push(text) continue } const timeArr = timeStr.split(':') - if (timeArr.length < 3) timeArr.unshift(0) - if (timeArr[2].indexOf('.') > -1) { - timeArr.push(...timeArr[2].split('.')) - timeArr.splice(2, 1) - } else if (!timeArr[2]) timeArr[2] = '0' + if (timeArr.length > 3) continue + else if (timeArr.length < 3) for (let i = 3 - timeArr.length; i--;) timeArr.unshift('0') + if (timeArr[2].indexOf('.') > -1) timeArr.splice(2, 1, ...timeArr[2].split('.')) + linesMap[timeStr] = { time: parseInt(timeArr[0]) * 60 * 60 * 1000 + parseInt(timeArr[1]) * 60 * 1000 + parseInt(timeArr[2]) * 1000 + parseInt(timeArr[3] || 0), text,