diff --git a/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js b/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js index 0bf311c..feb32e0 100644 --- a/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js +++ b/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js @@ -1403,7 +1403,9 @@ const ApiUtils = { return { id: trailer.Id, - url: `${STATE.jellyfinData.serverAddress}/Videos/${trailer.Id}/stream.mp4?mediaSourceId=${mediaSourceId}&api_key=${STATE.jellyfinData.accessToken}` + // static=true forces Jellyfin to direct-stream (no transcoding) which enables + // HTTP Range Requests (Accept-Ranges: bytes) — required by Safari for video playback + url: `${STATE.jellyfinData.serverAddress}/Videos/${trailer.Id}/stream.mp4?mediaSourceId=${mediaSourceId}&api_key=${STATE.jellyfinData.accessToken}&static=true` }; } return null; @@ -1798,6 +1800,8 @@ const SlideCreator = { const iframe = event.target.getIframe(); if (iframe) { iframe.setAttribute('referrerpolicy', 'strict-origin-when-cross-origin'); + // Full allow attribute matching what YouTube sets on their own embed pages + iframe.setAttribute('allow', 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'); } // Store start/end time and videoId for later use @@ -1928,7 +1932,10 @@ const SlideCreator = { }); videoBackdrop.addEventListener('error', (event) => { - console.warn(`Local video error for item ${itemId}`); + const src = event.target.src || event.target.getAttribute('data-src') || 'unknown'; + const errCode = event.target.error ? event.target.error.code : 'n/a'; + const errMsg = event.target.error ? event.target.error.message : 'n/a'; + console.warn(`Local video error for item ${itemId} | code=${errCode} | msg=${errMsg} | url=${src}`); const slide = event.target.closest('.slide'); if (slide && slide.classList.contains('active')) { SlideshowManager.nextSlide();