From 67ea357495172bcfa7bad78606135be9b2ceead3 Mon Sep 17 00:00:00 2001 From: Matt Cohen Date: Tue, 27 Jan 2026 10:39:04 +1300 Subject: [PATCH] 1.1.1 - OCR garbage removal detection frontend changes --- frontend/src/components/AppSidebar.svelte | 2 +- .../src/components/scan/ResultsList.svelte | 142 ++++++++++++++++++ .../settings/FilenameCleaningSettings.svelte | 55 +++++++ frontend/src/lib/api.js | 12 ++ 4 files changed, 210 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/AppSidebar.svelte b/frontend/src/components/AppSidebar.svelte index 39d0fee..bff400d 100644 --- a/frontend/src/components/AppSidebar.svelte +++ b/frontend/src/components/AppSidebar.svelte @@ -172,7 +172,7 @@ class={`flex items-center px-3 py-2 text-xs ${collapsed ? "justify-center" : "justify-between"}`} > {#if !collapsed} - Version: v1.1.0 + Version: v1.1.1 {:else} v {/if} diff --git a/frontend/src/components/scan/ResultsList.svelte b/frontend/src/components/scan/ResultsList.svelte index 7d8201e..bfef803 100644 --- a/frontend/src/components/scan/ResultsList.svelte +++ b/frontend/src/components/scan/ResultsList.svelte @@ -15,6 +15,7 @@ searchTitle, saveSuggestedMatches, processBatch, + previewClean, } from "../../lib/api.js"; const dispatch = createEventDispatcher(); @@ -68,6 +69,11 @@ let showPreview = false; let previewFile = null; + let showCleanPreview = false; + let cleanPreviewFile = null; + let cleanPreviewData = null; + let cleanPreviewLoading = false; + let cleanPreviewError = null; let showTitleSelector = false; let titleSelectorFile = null; let searchResults = []; @@ -759,6 +765,30 @@ previewFile = null; } + async function openCleanPreview(file) { + cleanPreviewFile = file; + showCleanPreview = true; + cleanPreviewLoading = true; + cleanPreviewError = null; + cleanPreviewData = null; + + try { + const response = await previewClean(file.path); + cleanPreviewData = response.preview; + } catch (err) { + cleanPreviewError = err?.message || "Failed to load preview"; + } finally { + cleanPreviewLoading = false; + } + } + + function closeCleanPreview() { + showCleanPreview = false; + cleanPreviewFile = null; + cleanPreviewData = null; + cleanPreviewError = null; + } + function getMediaType(file) { return file.media_type || "N/A"; } @@ -1261,6 +1291,13 @@
+ Clean only @@ -1361,6 +1398,13 @@
+ Clean only @@ -2312,6 +2356,104 @@
{/if} + +{#if showCleanPreview && cleanPreviewFile} +
e.key === "Escape" && closeCleanPreview()} + > + +
+{/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 ============ /**