From 958549dfb9b2a32cfe16ff81d1e4a31b70dee0e4 Mon Sep 17 00:00:00 2001 From: alger Date: Wed, 4 Mar 2026 21:00:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=9C=AC=E5=9C=B0=E9=9F=B3=E4=B9=90):=20?= =?UTF-8?q?=E5=85=83=E6=95=B0=E6=8D=AE=E8=A7=A3=E6=9E=90=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E9=99=90=E6=B5=81=E5=B9=B6=E9=99=90=E5=88=B6?= =?UTF-8?q?=E5=B0=81=E9=9D=A2=E4=BD=93=E7=A7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/modules/localMusicScanner.ts | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/modules/localMusicScanner.ts b/src/main/modules/localMusicScanner.ts index 4d3f733..b44006e 100644 --- a/src/main/modules/localMusicScanner.ts +++ b/src/main/modules/localMusicScanner.ts @@ -4,10 +4,13 @@ import { ipcMain } from 'electron'; import * as fs from 'fs'; import * as mm from 'music-metadata'; +import * as os from 'os'; import * as path from 'path'; /** 支持的音频文件格式 */ const SUPPORTED_AUDIO_FORMATS = ['.mp3', '.flac', '.wav', '.ogg', '.m4a', '.aac'] as const; +const METADATA_PARSE_CONCURRENCY = Math.min(8, Math.max(2, os.cpus().length)); +const MAX_COVER_BYTES = 1024 * 1024; /** * 主进程返回的原始音乐元数据 @@ -72,6 +75,9 @@ function extractCoverAsDataUrl(picture: mm.IPicture | undefined): string | null return null; } try { + if (picture.data.length > MAX_COVER_BYTES) { + return null; + } const mime = picture.format ?? 'image/jpeg'; const base64 = Buffer.from(picture.data).toString('base64'); return `data:${mime};base64,${base64}`; @@ -263,13 +269,23 @@ async function parseMetadata(filePath: string): Promise { * @returns 元数据对象列表 */ async function batchParseMetadata(filePaths: string[]): Promise { - const results: LocalMusicMeta[] = []; - - for (const filePath of filePaths) { - const meta = await parseMetadata(filePath); - results.push(meta); + if (filePaths.length === 0) { + return []; } + const results = new Array(filePaths.length); + const workerCount = Math.min(METADATA_PARSE_CONCURRENCY, filePaths.length); + let index = 0; + + const workers = Array.from({ length: workerCount }, async () => { + while (index < filePaths.length) { + const current = index; + index += 1; + results[current] = await parseMetadata(filePaths[current]); + } + }); + + await Promise.all(workers); return results; }