+
Clean only
@@ -2312,6 +2356,104 @@
{/if}
+
+{#if showCleanPreview && cleanPreviewFile}
+ e.key === "Escape" && closeCleanPreview()}
+ >
+
+
+
+
Clean Preview
+
+ {cleanPreviewFile.name}
+
+
+
+
+
+ {#if cleanPreviewLoading}
+
+ Building preview…
+
+ {:else if cleanPreviewError}
+
+ {cleanPreviewError}
+
+ {:else if cleanPreviewData}
+
+
+ Summary
+
+ {cleanPreviewData.removed_blocks} removed ·
+ {cleanPreviewData.modified_blocks} modified
+
+
+
+ {#if cleanPreviewData.total_changed_blocks === 0}
+
+ No changes detected.
+
+ {:else}
+
+ {#each cleanPreviewData.changes as change}
+
+
+ {change.type} · {change.timecode}
+
+
+
Before
+
After
+
{change.before || "(removed)"}
+
{change.after || "(removed)"}
+
+
+ {/each}
+
+
+ {#if cleanPreviewData.changes_truncated}
+
+ Preview truncated. Run clean to apply all changes.
+
+ {/if}
+ {/if}
+
+ {/if}
+
+
+{/if}
+
{#if showTitleSelector && titleSelectorFile}
00:01:25,000", after: "(removed)" },
+ { before: "WE HAVE TO GO!\nWE HAVE TO GO!", after: "WE HAVE TO GO!" },
+ ];
+
// Keywords that get stripped from filenames
const filenameKeywords = [
{ name: "Quality", examples: ["480p", "720p", "1080p", "4K", "HDR"] },
@@ -56,6 +63,7 @@
onSave({
strip_keywords: stripKeywords,
clean_subtitle_content: cleanSubtitleContent,
+ clean_subtitle_garbage: cleanSubtitleGarbage,
clean_subtitle_force_remove: forceRemoveKeywords
.split(/[\n,]+/)
.map((entry) => entry.trim())
@@ -169,6 +177,53 @@
+
+
+
+
+ {#if cleanSubtitleGarbage}
+
+
+ OCR Garbage Examples
+
+
+ {#each garbageExamples as example}
+
+
+ {example.before}
+
+
+
+ {example.after}
+
+
+ {/each}
+
+
+ {/if}
+
{#if cleanSubtitleContent}
diff --git a/frontend/src/lib/api.js b/frontend/src/lib/api.js
index 534361f..ed60734 100644
--- a/frontend/src/lib/api.js
+++ b/frontend/src/lib/api.js
@@ -485,6 +485,18 @@ export async function clearAllSuggestedMatches() {
})
}
+/**
+ * POST /api/clean/preview - Preview cleaning changes
+ * Body: { file: string }
+ * Returns: { success, preview }
+ */
+export async function previewClean(file) {
+ return apiFetch('/clean/preview', {
+ method: 'POST',
+ body: JSON.stringify({ file })
+ })
+}
+
// ============ MAINTENANCE API ============
/**