Selaa lähdekoodia

歌词解析增强对高精度时间戳(如 [02:34.54001])的解析能力。

onecold 11 kuukautta sitten
vanhempi
sitoutus
6269b3e39e

+ 2 - 2
AppScope/app.json5

@@ -2,8 +2,8 @@
   "app": {
     "bundleName": "com.xgplayer.ttmusic.hm",
     "vendor": "example",
-    "versionCode": 20250912,
-    "versionName": "1.5.8",
+    "versionCode": 20250915,
+    "versionName": "1.5.9",
     "icon": "$media:app_icon",
     "label": "$string:app_name",
     "multiAppMode": {

+ 3 - 4
entry/src/main/ets/view/LocalMusic.ets

@@ -3289,8 +3289,7 @@ export struct LocalMusic {
             }else{
               this.isGridMusic = !this.isGridMusic
             }
-
-
+            PreferencesUtil.put(SettingPage.TWO_FINGER_TYPE, this.twoFingerType)
             PreferencesUtil.put(SettingPage.IS_GRID_MUSIC, this.isGridMusic)
           })
       }
@@ -3628,9 +3627,9 @@ export struct LocalMusic {
               bottomLeft: 0,
               bottomRight: 0
             })
-            .interpolation(ImageInterpolation.High)// 用于重采样后的抗锯齿
             .draggable(false)// 禁止长按手势拖动
-            .autoResize(true) // 重采样,可减少内存占用
+            // .autoResize(true) // 重采样,可减少内存占用
+            // .interpolation(ImageInterpolation.High)// 用于重采样后的抗锯齿
             .width('100%')
             .height('auto')
             .objectFit(ImageFit.Auto)

+ 57 - 18
lib/src/main/ets/parse/LyricParser.ts

@@ -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;
     }
 }