diff --git a/src/index.html b/src/index.html index 2de1a02..12f9028 100644 --- a/src/index.html +++ b/src/index.html @@ -106,6 +106,11 @@ style="width: 18px; height: 18px; accent-color: #9146FF;"> 01.02.2026_CLIP_00-00-00_1.mp4 (mit Zeitstempel) + + + 01.02.2026_Part01.mp4 (Parts-Format) + diff --git a/src/main.ts b/src/main.ts index a0787de..1d7ebfb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -364,7 +364,7 @@ function sanitizeCustomClip(raw: unknown): CustomClip | undefined { if (!Number.isFinite(startSec) || !Number.isFinite(durationSec) || durationSec <= 0 || !Number.isFinite(startPart)) return undefined; const filenameFormat = raw.filenameFormat; - if (filenameFormat !== 'simple' && filenameFormat !== 'timestamp' && filenameFormat !== 'template') return undefined; + if (filenameFormat !== 'simple' && filenameFormat !== 'timestamp' && filenameFormat !== 'template' && filenameFormat !== 'parts') return undefined; return { startSec: Math.max(0, startSec), @@ -2666,9 +2666,15 @@ async function downloadVOD( const s = Math.floor(startOffset % 60); const timeStr = `${h.toString().padStart(2, '0')}-${m.toString().padStart(2, '0')}-${s.toString().padStart(2, '0')}`; return path.join(folder, `${dateStr}_CLIP_${timeStr}_${partNum}.mp4`); - } else { - return path.join(folder, `${dateStr}_${partNum}.mp4`); } + + if (clip.filenameFormat === 'parts') { + // Mirrors the global filename_template_parts default: + // `{date}_Part{part_padded}.mp4` -> e.g. 08.05.2026_Part07.mp4 + return path.join(folder, `${dateStr}_Part${partNum.toString().padStart(2, '0')}.mp4`); + } + + return path.join(folder, `${dateStr}_${partNum}.mp4`); }; // If clip is longer than part duration, split into parts diff --git a/src/renderer-globals.d.ts b/src/renderer-globals.d.ts index 370dab5..9b12f8b 100644 --- a/src/renderer-globals.d.ts +++ b/src/renderer-globals.d.ts @@ -34,7 +34,7 @@ interface CustomClip { startSec: number; durationSec: number; startPart: number; - filenameFormat: 'simple' | 'timestamp' | 'template'; + filenameFormat: 'simple' | 'timestamp' | 'template' | 'parts'; filenameTemplate?: string; } diff --git a/src/renderer-locale-de.ts b/src/renderer-locale-de.ts index 7f45407..7906a11 100644 --- a/src/renderer-locale-de.ts +++ b/src/renderer-locale-de.ts @@ -189,6 +189,7 @@ const UI_TEXT_DE = { unknownError: 'Unbekannter Fehler', formatSimple: '(Standard)', formatTimestamp: '(mit Zeitstempel)', + formatParts: '(Parts-Format)', formatTemplate: '(benutzerdefiniert)', templateEmpty: 'Das Template darf im benutzerdefinierten Modus nicht leer sein.', templatePlaceholder: '{date}_{part}.mp4', diff --git a/src/renderer-locale-en.ts b/src/renderer-locale-en.ts index 6d1672b..3096784 100644 --- a/src/renderer-locale-en.ts +++ b/src/renderer-locale-en.ts @@ -189,6 +189,7 @@ const UI_TEXT_EN = { unknownError: 'Unknown error', formatSimple: '(default)', formatTimestamp: '(with timestamp)', + formatParts: '(parts naming)', formatTemplate: '(custom template)', templateEmpty: 'Template cannot be empty in custom template mode.', templatePlaceholder: '{date}_{part}.mp4', diff --git a/src/renderer.ts b/src/renderer.ts index 050a8d6..19766fa 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -535,9 +535,12 @@ function formatSecondsWithPattern(totalSeconds: number, pattern: string): string .replace(/\\(.)/g, '$1'); } -function getSelectedFilenameFormat(): 'simple' | 'timestamp' | 'template' { +function getSelectedFilenameFormat(): 'simple' | 'timestamp' | 'template' | 'parts' { const selected = query('input[name="filenameFormat"]:checked').value; - return selected === 'template' ? 'template' : selected === 'timestamp' ? 'timestamp' : 'simple'; + if (selected === 'template') return 'template'; + if (selected === 'timestamp') return 'timestamp'; + if (selected === 'parts') return 'parts'; + return 'simple'; } function updateFilenameTemplateVisibility(): void { @@ -895,6 +898,7 @@ function updateFilenameExamples(): void { byId('formatSimple').textContent = `${dateStr}_${partNum}.mp4 ${UI_TEXT.clips.formatSimple}`; byId('formatTimestamp').textContent = `${dateStr}_CLIP_${timeStr}_${partNum}.mp4 ${UI_TEXT.clips.formatTimestamp}`; + byId('formatParts').textContent = `${dateStr}_Part${partNum.padStart(2, '0')}.mp4 ${UI_TEXT.clips.formatParts}`; byId('formatTemplate').textContent = `${buildTemplatePreview(template, { title: clipDialogData.title, date, diff --git a/src/types.ts b/src/types.ts index 8e12d43..1e74ec2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -2,7 +2,7 @@ export interface CustomClip { startSec: number; durationSec: number; startPart: number; - filenameFormat: 'simple' | 'timestamp' | 'template'; + filenameFormat: 'simple' | 'timestamp' | 'template' | 'parts'; filenameTemplate?: string; }