From 6aff3cabc08834b95717d294568b5e4dea3a628e Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Fri, 15 May 2026 21:26:22 -0400 Subject: [PATCH] fix: set asset status=ready after thumbnail completes --- services/worker/src/workers/thumbnail.js | 30 +++++++++++------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/services/worker/src/workers/thumbnail.js b/services/worker/src/workers/thumbnail.js index da103e0..fb0117a 100644 --- a/services/worker/src/workers/thumbnail.js +++ b/services/worker/src/workers/thumbnail.js @@ -11,7 +11,7 @@ export const thumbnailWorker = async (job) => { const { assetId, proxyKey, outputKey } = job.data; const tmpDir = tmpdir(); - const inputPath = join(tmpDir, `thumb-input-${job.id}.mp4`); + const inputPath = join(tmpDir, `thumb-input-${job.id}.mp4`); const outputPath = join(tmpDir, `thumb-output-${job.id}.jpg`); try { @@ -20,40 +20,38 @@ export const thumbnailWorker = async (job) => { console.log(`[thumbnail] Downloading ${proxyKey} for asset ${assetId}`); await downloadFromS3(S3_BUCKET, proxyKey, inputPath); - // Extract frame at 5 seconds + // Extract frame at 5 seconds (or start if clip is short) job.updateProgress(40); console.log(`[thumbnail] Extracting frame for asset ${assetId}`); await extractFrameAtTime(inputPath, outputPath, '00:00:05'); - // Upload to S3 + // Upload thumbnail to S3 job.updateProgress(70); console.log(`[thumbnail] Uploading to ${outputKey}`); await uploadToS3(S3_BUCKET, outputKey, outputPath); - // Update database + // Update asset: thumbnail key + mark ready job.updateProgress(90); - console.log(`[thumbnail] Updating asset record for ${assetId}`); await query( - 'UPDATE assets SET thumbnail_s3_key = $1 WHERE id = $2', + `UPDATE assets + SET thumbnail_s3_key = $1, status = 'ready', updated_at = NOW() + WHERE id = $2`, [outputKey, assetId] ); job.updateProgress(100); - console.log(`[thumbnail] Asset ${assetId} thumbnail complete`); + console.log(`[thumbnail] Asset ${assetId} thumbnail complete → status=ready`); return { assetId, outputKey }; } catch (error) { console.error(`[thumbnail] Error processing asset ${assetId}:`, error); + // Don't set status=error just because thumbnail failed — asset is still usable + // Just log and let it be retried throw error; } finally { - // Cleanup - try { - await Promise.all([ - unlink(inputPath).catch(() => {}), - unlink(outputPath).catch(() => {}), - ]); - } catch (err) { - console.error(`[thumbnail] Cleanup error for job ${job.id}:`, err); - } + await Promise.all([ + unlink(inputPath).catch(() => {}), + unlink(outputPath).catch(() => {}), + ]); } };