From 1d78af63c27b8a7958dd340711129e364f37d64f Mon Sep 17 00:00:00 2001 From: John Corser Date: Sun, 17 May 2026 11:08:17 -0400 Subject: [PATCH 1/3] fix: default preferHls to true on Safari Safari has poor DASH/MSE support, causing error 3016 (VIDEO_ERROR / PIPELINE_ERROR_DECODE) when playing videos via generated DASH manifests. Since Safari natively supports HLS, default preferHls to true on Safari while keeping the existing default (false) for other browsers. Users can still override this in preferences. --- src/components/VideoPlayer.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/VideoPlayer.vue b/src/components/VideoPlayer.vue index d869e6d699..46eecc1418 100644 --- a/src/components/VideoPlayer.vue +++ b/src/components/VideoPlayer.vue @@ -587,6 +587,7 @@ async function loadVideo() { streams.push(...props.video.videoStreams); const MseSupport = window.MediaSource !== undefined || window.ManagedMediaSource !== undefined; + const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); const lbry = null; @@ -600,7 +601,7 @@ async function loadVideo() { props.video.audioStreams.length > 0 && !lbry && MseSupport && - !getPreferenceBoolean("preferHls", false) + !getPreferenceBoolean("preferHls", isSafari) ) { if (!props.video.dash) { const dash = (await import("../utils/DashUtils.js")).generate_dash_file_from_formats( @@ -638,7 +639,7 @@ async function loadVideo() { return response.headers.get("Content-Type"); }); mime = contentType; - } else if (props.video.dash && !getPreferenceBoolean("preferHls", false)) { + } else if (props.video.dash && !getPreferenceBoolean("preferHls", isSafari)) { uri = props.video.dash; mime = "application/dash+xml"; } else if (props.video.hls) { From ccdb66e2ace2d3ae02c5eb7d773aa0dfc8335c62 Mon Sep 17 00:00:00 2001 From: John Corser Date: Sun, 17 May 2026 11:13:35 -0400 Subject: [PATCH 2/3] chore: add explanatory comments for Safari HLS default --- src/components/VideoPlayer.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/VideoPlayer.vue b/src/components/VideoPlayer.vue index 46eecc1418..070cdd48c2 100644 --- a/src/components/VideoPlayer.vue +++ b/src/components/VideoPlayer.vue @@ -587,6 +587,7 @@ async function loadVideo() { streams.push(...props.video.videoStreams); const MseSupport = window.MediaSource !== undefined || window.ManagedMediaSource !== undefined; + // Safari has limited MSE/DASH support, so we default to native HLS playback. const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); const lbry = null; @@ -639,6 +640,7 @@ async function loadVideo() { return response.headers.get("Content-Type"); }); mime = contentType; + // Safari defaults to HLS due to limited MSE/DASH support (see isSafari above). } else if (props.video.dash && !getPreferenceBoolean("preferHls", isSafari)) { uri = props.video.dash; mime = "application/dash+xml"; From ea617617da322ccad0a3424c3a74bf92b09fd509 Mon Sep 17 00:00:00 2001 From: John Corser Date: Sun, 17 May 2026 11:15:27 -0400 Subject: [PATCH 3/3] style: fix comment indentation --- src/components/VideoPlayer.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/VideoPlayer.vue b/src/components/VideoPlayer.vue index 070cdd48c2..e2bfd0e7a7 100644 --- a/src/components/VideoPlayer.vue +++ b/src/components/VideoPlayer.vue @@ -640,7 +640,7 @@ async function loadVideo() { return response.headers.get("Content-Type"); }); mime = contentType; - // Safari defaults to HLS due to limited MSE/DASH support (see isSafari above). + // Safari defaults to HLS due to limited MSE/DASH support (see isSafari above). } else if (props.video.dash && !getPreferenceBoolean("preferHls", isSafari)) { uri = props.video.dash; mime = "application/dash+xml";