From 687b419182aa59040eaabfdce24296f71949bd0f Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 20:30:59 +0000 Subject: [PATCH] fix: robustify WebTorrent playback startup to prevent gray screen Improves the playback startup sequence in `js/webtorrent.js` by explicitly listening for `loadeddata` in addition to `canplay` and checking `readyState` immediately after streaming starts. This ensures autoplay is triggered reliably even if the browser has already buffered enough data or if the `canplay` event logic is bypassed. Co-authored-by: PR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> --- js/webtorrent.js | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/js/webtorrent.js b/js/webtorrent.js index 22763b05..df95e2dd 100644 --- a/js/webtorrent.js +++ b/js/webtorrent.js @@ -747,16 +747,19 @@ export class TorrentClient { this.log("Video error:", e.target.error); }); - videoElement.addEventListener( - "canplay", - () => { - this.attemptAutoplay(videoElement, "chrome"); - }, - { once: true } - ); + const tryStart = () => { + this.attemptAutoplay(videoElement, "chrome"); + }; + + videoElement.addEventListener("canplay", tryStart, { once: true }); + videoElement.addEventListener("loadeddata", tryStart, { once: true }); try { file.streamTo(videoElement); + // If the video is already ready (e.g. from cache or fast load), try starting immediately + if (videoElement.readyState >= 3) { + tryStart(); + } this.currentTorrent = torrent; resolve(torrent); } catch (err) { @@ -786,16 +789,19 @@ export class TorrentClient { this.log("Video error (Firefox path):", e.target.error); }); - videoElement.addEventListener( - "canplay", - () => { - this.attemptAutoplay(videoElement, "firefox"); - }, - { once: true } - ); + const tryStart = () => { + this.attemptAutoplay(videoElement, "firefox"); + }; + + videoElement.addEventListener("canplay", tryStart, { once: true }); + videoElement.addEventListener("loadeddata", tryStart, { once: true }); try { file.streamTo(videoElement, { highWaterMark: 256 * 1024 }); + // If the video is already ready (e.g. from cache or fast load), try starting immediately + if (videoElement.readyState >= 3) { + tryStart(); + } this.currentTorrent = torrent; resolve(torrent); } catch (err) {