From 4ea05279bdbdc01d3c7bc74728fabd67ab42474d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E6=82=A6?= Date: Fri, 9 Jan 2026 10:13:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(=E6=9C=8D=E5=8A=A1=E5=99=A8)?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=BC=BA=E6=96=87=E4=BB=B6=E5=90=8D=E6=B8=85?= =?UTF-8?q?=E7=90=86=E7=9A=84=E5=81=A5=E5=A3=AE=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实施更严格的文件名清理措施,包括Unicode标准化处理(NFC)、控制字符移除以及200字符的长度限制,以防止歌曲下载过程中出现文件系统错误。 --- sync-server/server.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/sync-server/server.js b/sync-server/server.js index 7a3dc11..586b5de 100644 --- a/sync-server/server.js +++ b/sync-server/server.js @@ -127,9 +127,20 @@ async function tryDownloadSongs(data) { function processSong(song) { return new Promise((resolve) => { - // Basic sanitization - const safeName = (song.name || 'unknown').replace(/[\\/:*?"<>|]/g, '_'); - const safeArtist = (song.artist || 'unknown').replace(/[\\/:*?"<>|]/g, '_'); + // Sanitize filename with proper encoding handling + const sanitizeFilename = (str) => { + if (!str) return 'unknown'; + // Normalize Unicode (NFC) to ensure consistent encoding + const normalized = str.normalize('NFC'); + // Replace Windows illegal characters and control characters + return normalized + .replace(/[\\/:*?"<>|\x00-\x1f\x7f]/g, '_') + .trim() + .substring(0, 200); // Limit length to avoid path too long errors + }; + + const safeName = sanitizeFilename(song.name); + const safeArtist = sanitizeFilename(song.artist); const source = song.platform || song.source; // Filename: Artist - Name [source_id] const baseName = `${safeArtist} - ${safeName} [${source}_${song.id}]`;