Forráskód Böngészése

新增 读取内嵌歌词功能
ohpm install @sgaolei/lrc_parser

支持多格式歌词解析:

FLAC:解析 Vorbis 注释中的 LYRICS 标签
MP3:解析 ID3v2 标签中的 USLT 帧(非同步歌词)
OGG:解析 Vorbis 注释中的 LYRICS 标签
鸿蒙原生支持:
通过 C++ 动态库(.so)与 ArkTS 桥接,符合鸿蒙应用开发规范。

高性能解析:
基于 TagLib 原生实现,解析效率高,资源占用低。

onecold 1 éve
szülő
commit
a21fc9f04d

+ 22 - 5
entry/src/main/ets/view/LocalMusic.ets

@@ -75,6 +75,7 @@ import File from '@system.file';
 import {deviceInfo } from '@kit.BasicServicesKit';
 import {deviceInfo } from '@kit.BasicServicesKit';
 
 
 import { HSBColorPicker, HSBColorPickerLayout } from '@keke/color-picker'
 import { HSBColorPicker, HSBColorPickerLayout } from '@keke/color-picker'
+import { LrcParser } from '@sgaolei/lrc_parser';
 
 
 const TAG = 'LocalMusic';
 const TAG = 'LocalMusic';
 
 
@@ -4268,6 +4269,23 @@ export  struct  LocalMusic{
     this.lyricController.setLyric(null)
     this.lyricController.setLyric(null)
     let jiaMilyricPath = lyricPath.substring(0,lyricPath.lastIndexOf('.'))+'.lrcc'
     let jiaMilyricPath = lyricPath.substring(0,lyricPath.lastIndexOf('.'))+'.lrcc'
     LogUtil.debug("onecold lyricPath =" + lyricPath)
     LogUtil.debug("onecold lyricPath =" + lyricPath)
+
+    const neiqianLrc = LrcParser.getLyrics(this.videoUrl);
+    LogUtil.debug("onecold 找到内嵌歌词 neiqianLrc =" + neiqianLrc  )
+    if(StrUtil.isNotEmpty(neiqianLrc)){
+      // 将文件内容按行分割成字符串数组
+      let lines = neiqianLrc.split('\n').map(line => line.trim());
+      // 3.解析歌词
+      let lyric = this.parser.parse(lines);
+      // 4.设置歌词
+      this.lyricController.setLyric(lyric);
+      return
+
+    }
+
+
+
+
     if(isToast||((!FileUtil.accessSync(lyricPath)&&!FileUtil.accessSync(jiaMilyricPath))
     if(isToast||((!FileUtil.accessSync(lyricPath)&&!FileUtil.accessSync(jiaMilyricPath))
       &&!Utility.isVideoByExtension(this.videoUrl))){
       &&!Utility.isVideoByExtension(this.videoUrl))){
       if(this.currentSong!==undefined){
       if(this.currentSong!==undefined){
@@ -4697,10 +4715,7 @@ export  struct  LocalMusic{
           .aspectRatio(CommonConstants.ASPECT_RATIO)
           .aspectRatio(CommonConstants.ASPECT_RATIO)
           .margin({right:30})
           .margin({right:30})
           .onClick(()=>{
           .onClick(()=>{
-            // if(StrUtil.isNotEmpty(this.videoUrl)){
-            //   let lyricPath = this.videoUrl.substring(0,this.videoUrl.lastIndexOf('.'))+'.lrc'
-            //   this.initLyric(lyricPath);
-            // }
+
             this.isLyricSetting = !this.isLyricSetting;
             this.isLyricSetting = !this.isLyricSetting;
           })
           })
           .bindSheet($$this.isLyricSetting, this.lyricSettingSheet(), {
           .bindSheet($$this.isLyricSetting, this.lyricSettingSheet(), {
@@ -5307,7 +5322,7 @@ export  struct  LocalMusic{
 
 
       Row() {
       Row() {
         this.pushLyricButton($r('app.media.cut_current'),  0, '本地歌词')
         this.pushLyricButton($r('app.media.cut_current'),  0, '本地歌词')
-        // this.pushLyricButton($r('app.media.white_search'),  1, '内嵌歌词')
+        // this.pushLyricButton($r('app.media.white_search'),  1, '获取歌词')
         // this.pushLyricButton($r('app.media.white_search'),  2, '获取歌词')
         // this.pushLyricButton($r('app.media.white_search'),  2, '获取歌词')
 
 
 
 
@@ -6458,6 +6473,8 @@ export  struct  LocalMusic{
           }else{
           }else{
             this.getImageColor();
             this.getImageColor();
           }
           }
+
+
           let lyricPath = this.videoUrl.substring(0,this.videoUrl.lastIndexOf('.'))+'.lrc'
           let lyricPath = this.videoUrl.substring(0,this.videoUrl.lastIndexOf('.'))+'.lrc'
           await this.initLyric(lyricPath);
           await this.initLyric(lyricPath);
 
 

+ 18 - 0
oh-package-lock.json5

@@ -20,11 +20,13 @@
     "@pura/harmony-utils@^1.2.4": "@pura/harmony-utils@1.2.4",
     "@pura/harmony-utils@^1.2.4": "@pura/harmony-utils@1.2.4",
     "@pura/spinkit@^1.0.4": "@pura/spinkit@1.0.4",
     "@pura/spinkit@^1.0.4": "@pura/spinkit@1.0.4",
     "@seagazer/cclyric@lib": "@seagazer/cclyric@lib",
     "@seagazer/cclyric@lib": "@seagazer/cclyric@lib",
+    "@sgaolei/lrc_parser@^1.0.0": "@sgaolei/lrc_parser@1.0.0",
     "@simplepeng/spider-man@^1.0.1": "@simplepeng/spider-man@1.0.1",
     "@simplepeng/spider-man@^1.0.1": "@simplepeng/spider-man@1.0.1",
     "@smarthane/appupdate@^1.0.0": "@smarthane/appupdate@1.0.0",
     "@smarthane/appupdate@^1.0.0": "@smarthane/appupdate@1.0.0",
     "@taobao-ohos/utdid_sdk@oh_modules/.ohpm/@cashier_alipay+cashiersdk@15.8.32/oh_modules/@cashier_alipay/cashiersdk/lib/utdid_sdk-1.0.9.har": "@taobao-ohos/utdid_sdk@oh_modules/.ohpm/@cashier_alipay+cashiersdk@15.8.32/oh_modules/@cashier_alipay/cashiersdk/lib/utdid_sdk-1.0.9.har",
     "@taobao-ohos/utdid_sdk@oh_modules/.ohpm/@cashier_alipay+cashiersdk@15.8.32/oh_modules/@cashier_alipay/cashiersdk/lib/utdid_sdk-1.0.9.har": "@taobao-ohos/utdid_sdk@oh_modules/.ohpm/@cashier_alipay+cashiersdk@15.8.32/oh_modules/@cashier_alipay/cashiersdk/lib/utdid_sdk-1.0.9.har",
     "class-transformer@^0.5.1": "class-transformer@0.5.1",
     "class-transformer@^0.5.1": "class-transformer@0.5.1",
     "libblueshield.so@oh_modules/.ohpm/@alipay+blueshieldsdk@cow+0gass5tzqhymzjby2f6sd+g2xtoatqsiyvi9qsy=/oh_modules/@alipay/blueshieldsdk/src/main/cpp/types/libblueshield": "libblueshield.so@oh_modules/.ohpm/@alipay+blueshieldsdk@cow+0gass5tzqhymzjby2f6sd+g2xtoatqsiyvi9qsy=/oh_modules/@alipay/blueshieldsdk/src/main/cpp/types/libblueshield",
     "libblueshield.so@oh_modules/.ohpm/@alipay+blueshieldsdk@cow+0gass5tzqhymzjby2f6sd+g2xtoatqsiyvi9qsy=/oh_modules/@alipay/blueshieldsdk/src/main/cpp/types/libblueshield": "libblueshield.so@oh_modules/.ohpm/@alipay+blueshieldsdk@cow+0gass5tzqhymzjby2f6sd+g2xtoatqsiyvi9qsy=/oh_modules/@alipay/blueshieldsdk/src/main/cpp/types/libblueshield",
+    "liblrcparser.so@oh_modules/.ohpm/@sgaolei+lrc_parser@1.0.0/oh_modules/@sgaolei/lrc_parser/src/main/cpp/types/liblrcparser": "liblrcparser.so@oh_modules/.ohpm/@sgaolei+lrc_parser@1.0.0/oh_modules/@sgaolei/lrc_parser/src/main/cpp/types/liblrcparser",
     "pako@^2.1.0": "pako@2.1.0"
     "pako@^2.1.0": "pako@2.1.0"
   },
   },
   "packages": {
   "packages": {
@@ -148,6 +150,16 @@
       "resolved": "lib",
       "resolved": "lib",
       "registryType": "local"
       "registryType": "local"
     },
     },
+    "@sgaolei/lrc_parser@1.0.0": {
+      "name": "@sgaolei/lrc_parser",
+      "version": "1.0.0",
+      "integrity": "sha512-JnkArqOidM0qN+Daoxka+PvMq4Eqyv39/oZ/4vHTYlU5ssCTUqJ0GWF7ti9ZQTrDbg89Shx6hjODVXhs3IjgAg==",
+      "resolved": "https://repo.harmonyos.com/ohpm/@sgaolei/lrc_parser/-/lrc_parser-1.0.0.har",
+      "registryType": "ohpm",
+      "dependencies": {
+        "liblrcparser.so": "file:./src/main/cpp/types/liblrcparser"
+      }
+    },
     "@simplepeng/spider-man@1.0.1": {
     "@simplepeng/spider-man@1.0.1": {
       "name": "@simplepeng/spider-man",
       "name": "@simplepeng/spider-man",
       "version": "1.0.1",
       "version": "1.0.1",
@@ -182,6 +194,12 @@
       "resolved": "oh_modules/.ohpm/@alipay+blueshieldsdk@cow+0gass5tzqhymzjby2f6sd+g2xtoatqsiyvi9qsy=/oh_modules/@alipay/blueshieldsdk/src/main/cpp/types/libblueshield",
       "resolved": "oh_modules/.ohpm/@alipay+blueshieldsdk@cow+0gass5tzqhymzjby2f6sd+g2xtoatqsiyvi9qsy=/oh_modules/@alipay/blueshieldsdk/src/main/cpp/types/libblueshield",
       "registryType": "local"
       "registryType": "local"
     },
     },
+    "liblrcparser.so@oh_modules/.ohpm/@sgaolei+lrc_parser@1.0.0/oh_modules/@sgaolei/lrc_parser/src/main/cpp/types/liblrcparser": {
+      "name": "liblrcparser.so",
+      "version": "1.0.0",
+      "resolved": "oh_modules/.ohpm/@sgaolei+lrc_parser@1.0.0/oh_modules/@sgaolei/lrc_parser/src/main/cpp/types/liblrcparser",
+      "registryType": "local"
+    },
     "pako@2.1.0": {
     "pako@2.1.0": {
       "name": "pako",
       "name": "pako",
       "version": "2.1.0",
       "version": "2.1.0",

+ 2 - 1
oh-package.json5

@@ -27,7 +27,8 @@
     "@cashier_alipay/cashiersdk": "^15.8.32",
     "@cashier_alipay/cashiersdk": "^15.8.32",
     "@ohos/imageknife": "^3.2.3",
     "@ohos/imageknife": "^3.2.3",
     "@simplepeng/spider-man": "^1.0.1",
     "@simplepeng/spider-man": "^1.0.1",
-    "@keke/color-picker": "^1.0.4"
+    "@keke/color-picker": "^1.0.4",
+    "@sgaolei/lrc_parser": "^1.0.0"
   },
   },
   "dynamicDependencies": {}
   "dynamicDependencies": {}
 }
 }

+ 23 - 0
oh_modules/.ohpm/lock.json5

@@ -62,6 +62,10 @@
         "@keke/color-picker": {
         "@keke/color-picker": {
           "specifier": "^1.0.4",
           "specifier": "^1.0.4",
           "version": "1.0.4"
           "version": "1.0.4"
+        },
+        "@sgaolei/lrc_parser": {
+          "specifier": "^1.0.0",
+          "version": "1.0.0"
         }
         }
       },
       },
       "devDependencies": {
       "devDependencies": {
@@ -309,6 +313,25 @@
       "dynamic": false,
       "dynamic": false,
       "maskedByOverrideDependencyMap": false
       "maskedByOverrideDependencyMap": false
     },
     },
+    "@sgaolei/lrc_parser@1.0.0": {
+      "integrity": "sha512-JnkArqOidM0qN+Daoxka+PvMq4Eqyv39/oZ/4vHTYlU5ssCTUqJ0GWF7ti9ZQTrDbg89Shx6hjODVXhs3IjgAg==",
+      "storePath": "oh_modules/.ohpm/@sgaolei+lrc_parser@1.0.0",
+      "dependencies": {
+        "liblrcparser.so": "oh_modules/.ohpm/@sgaolei+lrc_parser@1.0.0/oh_modules/@sgaolei/lrc_parser/src/main/cpp/types/liblrcparser"
+      },
+      "dynamicDependencies": {},
+      "dev": false,
+      "dynamic": false,
+      "maskedByOverrideDependencyMap": false
+    },
+    "liblrcparser.so@file:oh_modules/.ohpm/@sgaolei+lrc_parser@1.0.0/oh_modules/@sgaolei/lrc_parser/src/main/cpp/types/liblrcparser": {
+      "storePath": "oh_modules/.ohpm/@sgaolei+lrc_parser@1.0.0/oh_modules/@sgaolei/lrc_parser/src/main/cpp/types/liblrcparser",
+      "dependencies": {},
+      "dynamicDependencies": {},
+      "dev": false,
+      "dynamic": false,
+      "maskedByOverrideDependencyMap": false
+    },
     "@ohos/hypium@1.0.19": {
     "@ohos/hypium@1.0.19": {
       "integrity": "sha512-cEjDgLFCm3cWZDeRXk7agBUkPqjWxUo6AQeiu0gEkb3J8ESqlduQLSIXeo3cCsm8U/asL7iKjF85ZyOuufAGSQ==",
       "integrity": "sha512-cEjDgLFCm3cWZDeRXk7agBUkPqjWxUo6AQeiu0gEkb3J8ESqlduQLSIXeo3cCsm8U/asL7iKjF85ZyOuufAGSQ==",
       "storePath": "oh_modules/.ohpm/@ohos+hypium@1.0.19",
       "storePath": "oh_modules/.ohpm/@ohos+hypium@1.0.19",