修复歌词标签解析格式没有严格按照标准的问题(#2855)
This commit is contained in:
@@ -11,3 +11,4 @@
|
|||||||
- 修复 mg 图片、歌词获取
|
- 修复 mg 图片、歌词获取
|
||||||
- 修复某些 tx 歌单打开失败的问题 (#1060, @ght-000)
|
- 修复某些 tx 歌单打开失败的问题 (#1060, @ght-000)
|
||||||
- 修复在某些情况下添加、移动歌曲时可能导致保存的歌曲顺序不对的问题(#2842)
|
- 修复在某些情况下添加、移动歌曲时可能导致保存的歌曲顺序不对的问题(#2842)
|
||||||
|
- 修复歌词标签解析格式没有严格按照标准的问题(#2855)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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('')
|
||||||
|
|||||||
@@ -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('')
|
||||||
|
|||||||
@@ -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 ''
|
||||||
|
|||||||
Reference in New Issue
Block a user