From 6c082a87ab6b0261a3ad8ab2f719c0b0de6f7d51 Mon Sep 17 00:00:00 2001 From: xRangerDE Date: Thu, 19 Mar 2026 18:12:50 +0100 Subject: [PATCH] fix(merge-split): fix premature 100% progress, add ffmpeg preflight, clean partial splits, use locale metaLabel Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main.ts | 11 ++++++++++- src/renderer-queue.ts | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main.ts b/src/main.ts index 1531636..2aa57a6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3002,6 +3002,11 @@ async function processDownloadMergeGroup( return { success: false, error: 'Streamlink fehlt.' }; } + const ffmpegReady = await ensureFfmpegInstalled(); + if (!ffmpegReady) { + return { success: false, error: 'FFmpeg fehlt.' }; + } + const streamer = mg.items[0].streamer.replace(/[^a-zA-Z0-9_-]/g, ''); const date = new Date(mg.items[0].date); const dateStr = `${date.getDate().toString().padStart(2, '0')}.${(date.getMonth() + 1).toString().padStart(2, '0')}.${date.getFullYear()}`; @@ -3165,7 +3170,7 @@ async function processDownloadMergeGroup( }); }, (currentPart, totalParts) => { - const overallProgress = 90 + (currentPart / totalParts) * 10; // split = 90-100% + const overallProgress = 90 + ((currentPart - 1) / totalParts) * 10; // split = 90-100% onProgress({ id: item.id, progress: overallProgress, @@ -3179,6 +3184,10 @@ async function processDownloadMergeGroup( ); if (!splitResult.success) { + // Clean up any partial split files + for (const partFile of splitResult.files) { + try { if (fs.existsSync(partFile)) fs.unlinkSync(partFile); } catch { } + } return { success: false, error: 'FFmpeg Split fehlgeschlagen.' }; } diff --git a/src/renderer-queue.ts b/src/renderer-queue.ts index 921d21e..a39cda6 100644 --- a/src/renderer-queue.ts +++ b/src/renderer-queue.ts @@ -219,7 +219,7 @@ function renderQueue(): void { ? ' ' : ''; const mergeMetaExtra = isMergeGroup - ? ` (${item.mergeGroup!.items.length} VODs)` + ? ` (${UI_TEXT.mergeGroup.metaLabel.replace('{count}', String(item.mergeGroup!.items.length))})` : ''; return `