From 9ecb287976012818a7a3afbc2379f6790e6afa26 Mon Sep 17 00:00:00 2001 From: Hiren Kangad Date: Tue, 10 Mar 2026 12:02:47 +0530 Subject: [PATCH] fix(refboard): force seek to decode poster frame with preload='metadata' preload='metadata' doesn't decode video frames, so readyState stays at 1 (HAVE_METADATA) and loadeddata never fires. capturePoster() now detects this state and forces a seek to 0.1s via _trySeekCapture(), which triggers frame decode and captures on the 'seeked' event. --- frontend/src/canvas/sprites/VideoSprite.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/canvas/sprites/VideoSprite.ts b/frontend/src/canvas/sprites/VideoSprite.ts index 58bd4a8..ac420be 100644 --- a/frontend/src/canvas/sprites/VideoSprite.ts +++ b/frontend/src/canvas/sprites/VideoSprite.ts @@ -117,10 +117,15 @@ export class VideoSprite extends Container { capturePoster(): void { if (this._hasPoster || !this.videoEl || this.destroyed) return; - // Need loadeddata to capture a frame — listen if not yet ready if (this.videoEl.readyState >= 2) { + // Frame data already available — capture directly this._captureFirstFrame(); + } else if (this.videoEl.readyState >= 1) { + // Metadata loaded but no frame decoded (preload='metadata'). + // Force a seek to trigger frame decode, capture on 'seeked'. + this._trySeekCapture(); } else { + // Not even metadata yet — wait for loadeddata this.videoEl.addEventListener('loadeddata', this._onLoadedData, { once: true }); } }