From 978f4698cd42d08300be5caf81a4b5aa6807a41e Mon Sep 17 00:00:00 2001 From: Christopher Dwyer-Perkins Date: Sat, 27 Jun 2026 15:18:38 -0300 Subject: [PATCH 1/3] Add view-mode selector to the Roku Device View with WebRTC playback --- .../RokuDeviceView/RokuDeviceView.svelte | 200 +++++++++++++++++- 1 file changed, 198 insertions(+), 2 deletions(-) diff --git a/webviews/src/views/RokuDeviceView/RokuDeviceView.svelte b/webviews/src/views/RokuDeviceView/RokuDeviceView.svelte index 91398a6d3..2739e0e51 100644 --- a/webviews/src/views/RokuDeviceView/RokuDeviceView.svelte +++ b/webviews/src/views/RokuDeviceView/RokuDeviceView.svelte @@ -33,6 +33,20 @@ utils.setStorageValue('enableScreenshotCaptureAutoRefresh', enableScreenshotCaptureAutoRefresh); } + // Which source the view renders: live device screenshots (default) or a WebRTC stream + type RokuDeviceViewMode = 'screenshot' | 'webrtc'; + let viewMode: RokuDeviceViewMode = utils.getStorageValue('rokuDeviceViewMode', 'screenshot') as RokuDeviceViewMode; + $: utils.setStorageValue('rokuDeviceViewMode', viewMode); + + function onViewModeChange() { + if (viewMode === 'screenshot') { + // Leaving WebRTC mode: tear down the stream and resume screenshot capture + stopWebrtc(); + void requestScreenshot(); + } + // Entering WebRTC mode: the screenshot loop is gated on viewMode and stops on its own + } + // We can't observe the image height directly so we observe the surrounding div instead let screenshotContainerWidth = 0; let screenshotContainerHeight = 0; @@ -230,7 +244,7 @@ let currentlyCapturingScreenshot = false; async function requestScreenshot() { - if (!deviceAvailable || currentlyCapturingScreenshot) { + if (viewMode !== 'screenshot' || !deviceAvailable || currentlyCapturingScreenshot) { return; } @@ -301,6 +315,120 @@ } } + // #region WebRTC stream prototype + // Receives a WebRTC stream via WHEP (WebRTC-HTTP Egress Protocol): POST an SDP offer + // to the URL, get an SDP answer back, then render the resulting track in a