From d9e20ec86717cb8d58e1c7b9c51be8e76556b8f7 Mon Sep 17 00:00:00 2001 From: Dennis Rijsdijk Date: Sat, 4 Feb 2023 18:27:54 +0100 Subject: [PATCH 1/2] fix: long videos resourceToken expires before video finish, retrieve length from overlay. --- src/backend/effects/builtin/play-video.js | 27 ++++++++++++++++++++++- src/resources/overlay/js/main.js | 15 +++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/backend/effects/builtin/play-video.js b/src/backend/effects/builtin/play-video.js index 9a3a66823..55eec2e37 100644 --- a/src/backend/effects/builtin/play-video.js +++ b/src/backend/effects/builtin/play-video.js @@ -438,7 +438,31 @@ const playVideo = { return true; } - const resourceToken = resourceTokenManager.storeResourcePath(data.filepath, effect.length); + const durationToken = resourceTokenManager.storeResourcePath(data.filepath, 5); + + const durationPromise = new Promise(async (resolve, reject) => { + const listener = (event) => { + try { + if (event.name === "video-duration" && event.data.resourceToken === durationToken) { + webServer.removeListener("overlay-event", listener); + resolve(event.data.duration); + } + } catch (err) { + logger.error("Error while trying to process overlay-event for getVideoDuration: ", err); + reject(err); + } + }; + webServer.on("overlay-event", listener); + }); + + webServer.sendToOverlay("getVideoDuration", { + resourceToken: durationToken + }); + + const duration = await durationPromise; + + const resourceToken = resourceTokenManager.storeResourcePath(data.filepath, duration + 5); + logger.info(`Retrieved duration for video: ${duration}`); data.resourceToken = resourceToken; webServer.sendToOverlay("video", data); @@ -452,6 +476,7 @@ const playVideo = { } } catch (err) { logger.error("Error while trying to process overlay-event for play-video: ", err); + reject(err); } }; webServer.on("overlay-event", listener); diff --git a/src/resources/overlay/js/main.js b/src/resources/overlay/js/main.js index 615acaf7e..191d6800c 100644 --- a/src/resources/overlay/js/main.js +++ b/src/resources/overlay/js/main.js @@ -49,6 +49,21 @@ function overlaySocketConnect(){ return; } + if(event == "getVideoDuration") { + const token = encodeURIComponent(data.meta.resourceToken); + const url = `http://${window.location.hostname}:7472/resource/${token}`; + const videoElement = ` + + `; + $(".wrapper").append(videoElement); + const video = document.getElementById(token); + video.oncanplay = () => { + sendWebsocketEvent("video-duration", {resourceToken: token, duration: Math.ceil(video.duration)}); + video.remove(); + } + } firebotOverlay.emit(event, data.meta); }; From 5c6e105112e4eca6f03ec0a07a11249adcbc7292 Mon Sep 17 00:00:00 2001 From: Dennis Rijsdijk Date: Sat, 4 Feb 2023 18:32:53 +0100 Subject: [PATCH 2/2] Use video overlay instance for getting duration --- src/backend/effects/builtin/play-video.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/effects/builtin/play-video.js b/src/backend/effects/builtin/play-video.js index 55eec2e37..614212212 100644 --- a/src/backend/effects/builtin/play-video.js +++ b/src/backend/effects/builtin/play-video.js @@ -456,7 +456,8 @@ const playVideo = { }); webServer.sendToOverlay("getVideoDuration", { - resourceToken: durationToken + resourceToken: durationToken, + overlayInstance: data.overlayInstance }); const duration = await durationPromise;