From 8013ef7c55b2799e108402119985ec6ee1e4cef5 Mon Sep 17 00:00:00 2001 From: cottongin Date: Mon, 21 Sep 2026 11:18:14 -0400 Subject: [PATCH] fix: clear thumbnail cache and temp dirs on new session Co-authored-by: Cursor --- src-tauri/src/commands/media_analysis.rs | 7 +++++++ src-tauri/src/lib.rs | 1 + src-tauri/src/services/thumbnail_extractor.rs | 11 +++++++++++ src/lib/bindings/mediaAnalysis.ts | 4 ++++ src/lib/stores/videoSession.svelte.ts | 12 ++++++++++++ src/lib/timeline/thumbnailRenderer.ts | 4 ++++ 6 files changed, 39 insertions(+) diff --git a/src-tauri/src/commands/media_analysis.rs b/src-tauri/src/commands/media_analysis.rs index 765196b..d2a8cb0 100644 --- a/src-tauri/src/commands/media_analysis.rs +++ b/src-tauri/src/commands/media_analysis.rs @@ -35,3 +35,10 @@ pub async fn extract_thumbnails( .await .map_err(|e| format!("Task failed: {e}"))? } + +#[tauri::command] +pub async fn cleanup_thumbnails(paths: Vec) -> Result<(), String> { + tokio::task::spawn_blocking(move || thumbnail_extractor::cleanup_thumbnail_dirs(&paths)) + .await + .map_err(|e| format!("Task failed: {e}"))? +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e045d72..35e4840 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -19,6 +19,7 @@ pub fn run() { media_analysis::extract_keyframes, media_analysis::extract_waveform, media_analysis::extract_thumbnails, + media_analysis::cleanup_thumbnails, ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/src-tauri/src/services/thumbnail_extractor.rs b/src-tauri/src/services/thumbnail_extractor.rs index d300d36..7d66faf 100644 --- a/src-tauri/src/services/thumbnail_extractor.rs +++ b/src-tauri/src/services/thumbnail_extractor.rs @@ -76,6 +76,17 @@ pub fn extract_thumbnails( Ok(sheets) } +pub fn cleanup_thumbnail_dirs(paths: &[String]) -> Result<(), String> { + for path in paths { + let dir = std::path::Path::new(path); + if dir.is_dir() { + std::fs::remove_dir_all(dir) + .map_err(|e| format!("Failed to remove thumbnail dir {path}: {e}"))?; + } + } + Ok(()) +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/lib/bindings/mediaAnalysis.ts b/src/lib/bindings/mediaAnalysis.ts index c1d92e4..03f92fd 100644 --- a/src/lib/bindings/mediaAnalysis.ts +++ b/src/lib/bindings/mediaAnalysis.ts @@ -30,3 +30,7 @@ export async function extractThumbnails( duration, }); } + +export async function cleanupThumbnails(paths: string[]): Promise { + return invoke('cleanup_thumbnails', { paths }); +} diff --git a/src/lib/stores/videoSession.svelte.ts b/src/lib/stores/videoSession.svelte.ts index dd14752..e1194e3 100644 --- a/src/lib/stores/videoSession.svelte.ts +++ b/src/lib/stores/videoSession.svelte.ts @@ -2,10 +2,12 @@ import type { VideoMetadata } from '$lib/bindings/video'; import { startDownload } from '$lib/bindings/video'; import type { ThumbnailSpritesheet } from '$lib/bindings/mediaAnalysis'; import { + cleanupThumbnails, extractKeyframes, extractThumbnails, extractWaveform, } from '$lib/bindings/mediaAnalysis'; +import { clearThumbnailCache } from '$lib/timeline/thumbnailRenderer'; export type SessionStatus = 'idle' | 'resolving' | 'ready' | 'error'; export type DownloadStatus = 'idle' | 'downloading' | 'complete' | 'failed'; @@ -112,6 +114,10 @@ async function triggerPostDownloadProcessing(filePath: string) { export async function beginDownload() { if (!session.url) return; + const oldThumbnailDirs = [ + ...new Set(session.thumbnailSpritesheets.map((sheet) => sheet.filePath)), + ]; + clearThumbnailCache(); session.downloadStatus = 'downloading'; session.downloadProgress = 0; session.localFilePath = null; @@ -119,6 +125,12 @@ export async function beginDownload() { session.waveformPeaks = []; session.thumbnailSpritesheets = []; + if (oldThumbnailDirs.length > 0) { + void cleanupThumbnails(oldThumbnailDirs).catch((err) => { + console.error('Thumbnail temp dir cleanup failed:', err); + }); + } + try { await startDownload( session.url, diff --git a/src/lib/timeline/thumbnailRenderer.ts b/src/lib/timeline/thumbnailRenderer.ts index c09caa7..56d4b0c 100644 --- a/src/lib/timeline/thumbnailRenderer.ts +++ b/src/lib/timeline/thumbnailRenderer.ts @@ -4,6 +4,10 @@ import { timeToX, type TimelineState } from './renderer'; const imageCache = new Map(); +export function clearThumbnailCache(): void { + imageCache.clear(); +} + const TARGET_SPACING_PX = 100; function getImagePath(dir: string, frameIndex: number): string {