2aeb97383c
Backend: - 204 response: add Cache-Control: no-store so browser never caches 'no thumbnail yet' — next GET after PUT upload gets the WebP Frontend: - _videoThumbCache (Map): persists fileId → URL across re-renders, so switching tabs reuses cached URLs instantly (no re-decode) - Render: videos with cached URL skip the 204/error/decode cycle - After PUT succeeds: swap blob URL → server ?v=1 URL so blob is GC'd - Concurrency throttle: max 3 simultaneous video decodes to avoid overwhelming network + CPU when gallery has many videos - Decode queue: pending videos processed as slots free up