|
|
@@ -8,6 +8,7 @@ import {
|
|
|
PreferencesUtil,
|
|
|
RandomUtil, StrUtil } from '@pura/harmony-utils';
|
|
|
import { media } from '@kit.MediaKit';
|
|
|
+import * as chardet from '@changwei/chardet';
|
|
|
import fs, { ReadTextOptions } from '@ohos.file.fs';
|
|
|
import { image } from '@kit.ImageKit';
|
|
|
import fileIo from '@ohos.file.fs';
|
|
|
@@ -24,6 +25,8 @@ import { pinyin4js } from '@ohos/pinyin4js';
|
|
|
import { VipData } from '../../viewmodel/VipData';
|
|
|
import { VipPage } from '../../pages/VipPage';
|
|
|
import { FFmpeg, FFProgressMessageParser } from '@sj/ffmpeg';
|
|
|
+import { util } from '@kit.ArkTS';
|
|
|
+import { UniversalDetector } from '@ohos/juniversalchardet';
|
|
|
|
|
|
export interface FFMpegTags {
|
|
|
album?: string;
|
|
|
@@ -831,6 +834,7 @@ export class Utility {
|
|
|
let commands = ["ffprobe", "-v", "quiet", "-print_format", "json", "-show_format", "-show_streams", inputPath];
|
|
|
let outputJson = "";
|
|
|
|
|
|
+
|
|
|
FFmpeg.execute(commands, {
|
|
|
logCallback: (logLevel: number, logMessage: string) => console.log(`[${logLevel}]${logMessage}`),
|
|
|
outputCallback: (message: string) => {
|
|
|
@@ -872,11 +876,19 @@ export class Utility {
|
|
|
const tags = format.tags || {};
|
|
|
let artist = tags.artist ||tags.ARTIST || '';
|
|
|
let title = tags.title ||tags.TITLE || '';
|
|
|
- const album = tags.album ||tags.ALBUM|| '';
|
|
|
+ let album = tags.album ||tags.ALBUM|| '';
|
|
|
console.log(`onecold tags.tags:${JSON.stringify(tags)}`);
|
|
|
- // console.log(`onecold tags.LYRICS:${tags.LYRICS}`);
|
|
|
- // console.log(`onecold tags.lyrics:${tags.lyrics}`);
|
|
|
- // console.log(`onecold tags.UNSYNCEDLYRICS:${tags.UNSYNCEDLYRICS}`);
|
|
|
+ // 检查是否有乱码
|
|
|
+ if (hasGarbledText(tags)) {
|
|
|
+ // 第二次尝试用华为的接口提取元数据
|
|
|
+ let hwTags = await extractHwMediaMetadata(inputPath)
|
|
|
+ artist = hwTags?.artist|| '';
|
|
|
+ title = hwTags?.title|| '';
|
|
|
+ album = hwTags?.album|| '';
|
|
|
+ console.info('onecold 乱码修正 artist='+artist);
|
|
|
+ console.info('onecold 乱码修正 title='+title);
|
|
|
+ console.info('onecold 乱码修正 album='+album);
|
|
|
+ }
|
|
|
if(StrUtil.isEmpty(title)){
|
|
|
//自动解析像这样的获取不到元数据的 周杰伦-七里香.mp3文件
|
|
|
console.log(`onecold musicName为空:${file.name}`);
|
|
|
@@ -2008,4 +2020,51 @@ function getFileFormatByPath(filePath: string): string {
|
|
|
return filePath.substring(lastDotIndex + 1).toLowerCase();
|
|
|
}
|
|
|
|
|
|
+// 检查乱码的简单方法
|
|
|
+function hasGarbledText(tags: FFMpegTags): boolean {
|
|
|
+ if (!tags) return false;
|
|
|
+ const text = [tags.title, tags.artist, tags.album].join("");
|
|
|
+ return /[À-ÿµØÇò]/.test(text); // 匹配常见乱码字符
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 提取华为接口的媒体文件元数据
|
|
|
+ * @param filePath 文件路径(如:/data/storage/el1/base/test.mp3 )
|
|
|
+ * @returns Promise<FFMpegTags> 包含专辑、艺术家、标题的元数据对象
|
|
|
+ */
|
|
|
+export async function extractHwMediaMetadata(filePath: string): Promise<FFMpegTags> {
|
|
|
+ const tags: FFMpegTags = {};
|
|
|
|
|
|
+ if (!canIUse("SystemCapability.Multimedia.Media.AVMetadataExtractor")) {
|
|
|
+ console.warn("Metadata extraction not supported on this device");
|
|
|
+ return tags;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ const avMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor();
|
|
|
+ const fd = await fs.open(filePath, fs.OpenMode.READ_ONLY);
|
|
|
+
|
|
|
+ // 设置文件描述符并提取元数据
|
|
|
+ avMetadataExtractor.fdSrc = fd;
|
|
|
+ const metadata = await avMetadataExtractor.fetchMetadata();
|
|
|
+
|
|
|
+ // 映射标准FFMpeg标签
|
|
|
+ if (metadata) {
|
|
|
+ tags.album = metadata.album ?? undefined;
|
|
|
+ tags.artist = metadata.artist ?? metadata.author ?? undefined; // 兼容不同元数据字段
|
|
|
+ tags.title = metadata.title ?? undefined;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关闭文件描述符
|
|
|
+ await fs.close(fd);
|
|
|
+ return tags;
|
|
|
+ } catch (error) {
|
|
|
+ const err = error as BusinessError;
|
|
|
+ console.error(`Metadata extraction failed: ${err.code}, ${err.message}`);
|
|
|
+
|
|
|
+ return tags;
|
|
|
+ }
|
|
|
+
|
|
|
+ return tags;
|
|
|
+}
|