From e8769fefb0ec0208a1a052f713b0f89530ac35f2 Mon Sep 17 00:00:00 2001 From: Nexmoe <16796652+nexmoe@users.noreply.github.com> Date: Sun, 18 Jan 2026 13:34:39 +0800 Subject: [PATCH] fix(download): disambiguate duplicate playlist titles (#145) --- src/main/lib/download-engine.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/lib/download-engine.ts b/src/main/lib/download-engine.ts index 9eba4ba..c3a961c 100644 --- a/src/main/lib/download-engine.ts +++ b/src/main/lib/download-engine.ts @@ -628,16 +628,34 @@ class DownloadEngine extends EventEmitter { `Starting playlist download: ${selectionSize} items from "${playlistInfo.title}"` ) + const normalizedTitles = new Set() + let hasDuplicateTitles = false + for (const entry of selectedEntries) { + const key = sanitizeTemplateValue(entry.title || '').toLowerCase() + if (normalizedTitles.has(key)) { + hasDuplicateTitles = true + break + } + normalizedTitles.add(key) + } + const indexWidth = hasDuplicateTitles + ? String(Math.max(...selectedEntries.map((entry) => entry.index))).length + : 0 + // Create download items for each video in the playlist for (const entry of selectedEntries) { const downloadId = `${groupId}_${Math.random().toString(36).substring(2, 10)}` + const customFilenameTemplate = hasDuplicateTitles + ? `${String(entry.index).padStart(indexWidth, '0')} - %(title)s via VidBee.%(ext)s` + : undefined const downloadOptions: DownloadOptions = { url: entry.url, type: options.type, format: options.format, audioFormat: options.type === 'audio' ? options.format : undefined, - customDownloadPath: resolvedDownloadPath + customDownloadPath: resolvedDownloadPath, + customFilenameTemplate } const createdAt = Date.now()