diff --git a/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js b/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js index 77bf52e..2a948c2 100644 --- a/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js +++ b/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js @@ -836,7 +836,7 @@ const LocalizationUtils = { } } - if (window.ApiClient && STATE.jellyfinData?.accessToken) { + if (window.ApiClient && STATE.jellyfinData && STATE.jellyfinData.accessToken) { try { const userId = window.ApiClient.getCurrentUserId(); if (userId) { @@ -846,7 +846,7 @@ const LocalizationUtils = { }); if (userResponse.ok) { const userData = await userResponse.json(); - if (userData.Configuration?.AudioLanguagePreference) { + if (userData.Configuration && userData.Configuration.AudioLanguagePreference) { locale = userData.Configuration.AudioLanguagePreference.toLowerCase(); } } @@ -856,7 +856,7 @@ const LocalizationUtils = { } } - if (!locale && window.ApiClient && STATE.jellyfinData?.accessToken) { + if (!locale && window.ApiClient && (STATE.jellyfinData && STATE.jellyfinData.accessToken)) { try { const configUrl = window.ApiClient.getUrl('System/Configuration'); const configResponse = await fetch(configUrl, { @@ -1031,7 +1031,7 @@ const LocalizationUtils = { */ getLocalizedString(key, fallback, ...args) { const locale = this.cachedLocale || 'en-us'; - let translated = this.translations[locale]?.[key] || fallback; + let translated = (this.translations[locale] && this.translations[locale][key]) || fallback; if (args.length > 0) { for (let i = 0; i < args.length; i++) { @@ -1776,9 +1776,12 @@ const SlideCreator = { } const isLowPower = isLowPowerDevice(); + const isIOSApp = /iPhone|iPad|iPod/i.test(navigator.userAgent); + const limitVideos = isLowPower || isIOSApp; const itemIndex = STATE.slideshow.itemIds ? STATE.slideshow.itemIds.indexOf(itemId) : -1; const isActiveSlide = itemIndex !== -1 && itemIndex === STATE.slideshow.currentSlideIndex; - const shouldCreateVideo = !isLowPower || isActiveSlide; + // Limit YouTube iframe bulk creation on low power devices OR iOS (which kills the WebProcess on OOM) + const shouldCreateVideo = !limitVideos || isActiveSlide; if (isYoutube && videoId && shouldCreateVideo) { isVideo = true; @@ -2804,7 +2807,7 @@ const SlideshowManager = { if (currentItemId) { const currentSlide = document.querySelector(`.slide[data-item-id="${currentItemId}"]`); - const video = currentSlide?.querySelector('video'); + const video = currentSlide ? currentSlide.querySelector('video') : null; if (video) { video.muted = STATE.slideshow.isMuted; @@ -2964,7 +2967,7 @@ const SlideshowManager = { if (!currentSlide) return; // YouTube player: just resume, don't reload - const ytPlayer = STATE.slideshow.videoPlayers?.[currentItemId]; + const ytPlayer = (STATE.slideshow.videoPlayers && STATE.slideshow.videoPlayers[currentItemId]) ? STATE.slideshow.videoPlayers[currentItemId] : undefined; if (ytPlayer && typeof ytPlayer.playVideo === 'function') { if (STATE.slideshow.isMuted) { if (typeof ytPlayer.mute === 'function') ytPlayer.mute();