|
|
@@ -130,18 +130,32 @@ export class LyricParser implements IParser {
|
|
|
let firstTimeline = -1;
|
|
|
|
|
|
// 正则匹配:[00:00.000]中文字
|
|
|
- const regex = /\[(\d{2}:\d{2}\.\d{2,3})\]([^\[]*)/g;
|
|
|
+ // const regex = /\[(\d{2}:\d{2}\.\d{2,3})\]([^\[]*)/g;
|
|
|
+ // let match;
|
|
|
+ //
|
|
|
+ // while ((match = regex.exec(line)) !== null) {
|
|
|
+ // const timeStr = match[1]; // 时间部分 00:00.000
|
|
|
+ // const word = match[2].trim(); // 歌词文本
|
|
|
+ //
|
|
|
+ // if (!word) continue; // 跳过空词
|
|
|
+ //
|
|
|
+ // const timeline = this.parseTimeline2(timeStr) - offset;
|
|
|
+ // if (firstTimeline < 0) firstTimeline = timeline;
|
|
|
+ //
|
|
|
+ // words.push(new LyricWord(word, timeline, 0));
|
|
|
+ // }
|
|
|
+
|
|
|
+ // 正则增强:支持高精度时间戳(如 [02:34.54001])
|
|
|
+ const regex = /\[(\d{2}:\d{2}[.:]\d{2,5})\]([^\[]*)/g;
|
|
|
let match;
|
|
|
|
|
|
while ((match = regex.exec(line)) !== null) {
|
|
|
- const timeStr = match[1]; // 时间部分 00:00.000
|
|
|
- const word = match[2].trim(); // 歌词文本
|
|
|
+ const timeStr = match[1];
|
|
|
+ const word = match[2].trim();
|
|
|
+ if (!word) continue;
|
|
|
|
|
|
- if (!word) continue; // 跳过空词
|
|
|
-
|
|
|
- const timeline = this.parseTimeline2(timeStr) - offset;
|
|
|
+ const timeline = this.parseTimeline(timeStr) - offset;
|
|
|
if (firstTimeline < 0) firstTimeline = timeline;
|
|
|
-
|
|
|
words.push(new LyricWord(word, timeline, 0));
|
|
|
}
|
|
|
|
|
|
@@ -225,18 +239,43 @@ export class LyricParser implements IParser {
|
|
|
let result = spr1.replace("]", "")
|
|
|
return result
|
|
|
}
|
|
|
+ //
|
|
|
+ // private parseTimeline(timeString: string): number {
|
|
|
+ // // 00:00.50
|
|
|
+ // let timeStringList = timeString.split(':')
|
|
|
+ // let minuteString = timeStringList[0] //00
|
|
|
+ // let minute = Number.parseInt(minuteString)
|
|
|
+ // let secondStrings = timeStringList[1] //00.50
|
|
|
+ // let secondStringList = secondStrings.split(".")
|
|
|
+ // let secondString = secondStringList[0] //00
|
|
|
+ // let millionSecondString = secondStringList[1] //50
|
|
|
+ // let seconds = Number.parseInt(secondString)
|
|
|
+ // let millionSecond = Number.parseInt(millionSecondString)
|
|
|
+ // return minute * 60000 + seconds * 1000 + millionSecond // covert to million seconds
|
|
|
+ // }
|
|
|
|
|
|
private parseTimeline(timeString: string): number {
|
|
|
- // 00:00.50
|
|
|
- let timeStringList = timeString.split(':')
|
|
|
- let minuteString = timeStringList[0] //00
|
|
|
- let minute = Number.parseInt(minuteString)
|
|
|
- let secondStrings = timeStringList[1] //00.50
|
|
|
- let secondStringList = secondStrings.split(".")
|
|
|
- let secondString = secondStringList[0] //00
|
|
|
- let millionSecondString = secondStringList[1] //50
|
|
|
- let seconds = Number.parseInt(secondString)
|
|
|
- let millionSecond = Number.parseInt(millionSecondString)
|
|
|
- return minute * 60000 + seconds * 1000 + millionSecond // covert to million seconds
|
|
|
+ // 支持多种分隔符:`.` 或 `:`
|
|
|
+ const parts = timeString.split(/[:.]/);
|
|
|
+ if (parts.length < 2) {
|
|
|
+ printW(`Invalid timeline format: ${timeString}`);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析分钟、秒、毫秒
|
|
|
+ const minutes = parseInt(parts[0], 10) || 0;
|
|
|
+ const seconds = parseInt(parts[1], 10) || 0;
|
|
|
+ let milliseconds = 0;
|
|
|
+
|
|
|
+ // 处理毫秒部分(可能为厘秒或毫秒)
|
|
|
+ if (parts.length > 2) {
|
|
|
+ const fraction = parts[2];
|
|
|
+ // 根据小数位长度判断精度:2位为厘秒(需*10),3位以上为毫秒
|
|
|
+ milliseconds = fraction.length <= 2 ?
|
|
|
+ parseInt(fraction, 10) * 10 : // 厘秒转毫秒(如 "54" -> 540ms)
|
|
|
+ parseInt(fraction.substring(0, 3), 10); // 截取前3位(如 "54001" -> 540ms)
|
|
|
+ }
|
|
|
+
|
|
|
+ return minutes * 60000 + seconds * 1000 + milliseconds;
|
|
|
}
|
|
|
}
|