diff --git a/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js b/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js index 24c8333..866c08b 100644 --- a/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js +++ b/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js @@ -1,4 +1,4 @@ -/* +/* * Jellyfin Slideshow by M0RPH3US v4.0.1 * Modified by CodeDevMLH * @@ -124,7 +124,7 @@ const processNextRequest = () => { }) .then(callback) .catch((error) => { - console.error("Error in throttled request:", error); + console.error("🎬 Media Bar:", "Error in throttled request:", error); }) .finally(() => { setTimeout(processNextRequest, 100); @@ -158,7 +158,7 @@ const isUserLoggedIn = () => { window.ApiClient._serverInfo.AccessToken ); } catch (error) { - console.error("Error checking login status:", error); + console.error("🎬 Media Bar:", "Error checking login status:", error); return false; } }; @@ -177,7 +177,7 @@ const isLowPowerDevice = () => { */ const initJellyfinData = (callback) => { if (!window.ApiClient) { - console.warn("⏳ window.ApiClient is not available yet. Retrying..."); + console.warn("🎬 Media Bar:", "⏳ window.ApiClient is not available yet. Retrying..."); setTimeout(() => initJellyfinData(callback), CONFIG.retryInterval); return; } @@ -198,7 +198,7 @@ const initJellyfinData = (callback) => { callback(); } } catch (error) { - console.error("Error initializing Jellyfin data:", error); + console.error("🎬 Media Bar:", "Error initializing Jellyfin data:", error); setTimeout(() => initJellyfinData(callback), CONFIG.retryInterval); } }; @@ -210,9 +210,9 @@ const initLocalization = async () => { try { const locale = await LocalizationUtils.getCurrentLocale(); await LocalizationUtils.loadTranslations(locale); - console.log("✅ Localization initialized"); + console.log("🎬 Media Bar:", "✅ Localization initialized"); } catch (error) { - console.error("Error initializing localization:", error); + console.error("🎬 Media Bar:", "Error initializing localization:", error); } }; @@ -332,7 +332,7 @@ const initLoadingScreen = () => { * Resets the slideshow state completely */ const resetSlideshowState = () => { - console.log("🔄 Resetting slideshow state..."); + console.log("🎬 Media Bar:", "🔄 Resetting slideshow state..."); if (STATE.slideshow.slideInterval) { STATE.slideshow.slideInterval.stop(); @@ -386,14 +386,14 @@ const startLoginStatusWatcher = () => { if (isLoggedIn !== wasLoggedIn) { if (isLoggedIn) { - console.log("👤 User logged in. Initializing slideshow..."); + console.log("🎬 Media Bar:", "👤 User logged in. Initializing slideshow..."); if (!STATE.slideshow.hasInitialized) { waitForApiClientAndInitialize(); } else { - console.log("🔄 Slideshow already initialized, skipping"); + console.log("🎬 Media Bar:", "🔄 Slideshow already initialized, skipping"); } } else { - console.log("👋 User logged out. Stopping slideshow..."); + console.log("🎬 Media Bar:", "👋 User logged out. Stopping slideshow..."); resetSlideshowState(); } wasLoggedIn = isLoggedIn; @@ -411,7 +411,7 @@ const waitForApiClientAndInitialize = () => { window.slideshowCheckInterval = setInterval(() => { if (!window.ApiClient) { - console.log("⏳ ApiClient not available yet. Waiting..."); + console.log("🎬 Media Bar:", "⏳ ApiClient not available yet. Waiting..."); return; } @@ -421,23 +421,23 @@ const waitForApiClientAndInitialize = () => { window.ApiClient._serverInfo && window.ApiClient._serverInfo.AccessToken ) { - console.log( + console.log("🎬 Media Bar:", "🔓 User is fully logged in. Starting slideshow initialization..." ); clearInterval(window.slideshowCheckInterval); if (!STATE.slideshow.hasInitialized) { initJellyfinData(async () => { - console.log("✅ Jellyfin API client initialized successfully"); + console.log("🎬 Media Bar:", "✅ Jellyfin API client initialized successfully"); await initLocalization(); await fetchPluginConfig(); slidesInit(); }); } else { - console.log("🔄 Slideshow already initialized, skipping"); + console.log("🎬 Media Bar:", "🔄 Slideshow already initialized, skipping"); } } else { - console.log( + console.log("🎬 Media Bar:", "🔒 Authentication incomplete. Waiting for complete login..." ); } @@ -468,11 +468,11 @@ const fetchPluginConfig = async () => { // Sync to LocalStorage for next load localStorage.setItem('mediaBarEnhanced-enableLoadingScreen', CONFIG.enableLoadingScreen); - console.log("✅ MediaBarEnhanced config loaded", CONFIG); + console.log("🎬 Media Bar:", "✅ MediaBarEnhanced config loaded", CONFIG); } } } catch (e) { - console.error("Failed to load MediaBarEnhanced config", e); + console.error("🎬 Media Bar:", "Failed to load MediaBarEnhanced config", e); } }; @@ -738,7 +738,7 @@ const SlideUtils = { } } } catch (e) { - console.warn("Invalid URL for modal:", url); + console.warn("🎬 Media Bar:", "Invalid URL for modal:", url); } if (isYoutube && videoId) { @@ -821,7 +821,7 @@ const LocalizationUtils = { locale = localStorage.getItem("language").toLowerCase(); } } catch (e) { - console.warn("Could not access localStorage for language:", e); + console.warn("🎬 Media Bar:", "Could not access localStorage for language:", e); } if (!locale) { @@ -847,7 +847,7 @@ const LocalizationUtils = { } } } catch (error) { - console.warn("Could not fetch user audio language preference:", error); + console.warn("🎬 Media Bar:", "Could not fetch user audio language preference:", error); } } @@ -867,7 +867,7 @@ const LocalizationUtils = { } } } catch (error) { - console.warn("Could not fetch server metadata language preference:", error); + console.warn("🎬 Media Bar:", "Could not fetch server metadata language preference:", error); } } @@ -912,7 +912,7 @@ const LocalizationUtils = { } } } catch (e) { - console.warn("Error checking performance entries:", e); + console.warn("🎬 Media Bar:", "Error checking performance entries:", e); } } @@ -977,7 +977,7 @@ const LocalizationUtils = { this.translations[locale] = JSON.parse(jsonString); return; } catch (e) { - console.error('Failed to parse JSON from standard extraction.'); + console.error("🎬 Media Bar:", 'Failed to parse JSON from standard extraction.'); // Try alternative extraction below } @@ -989,7 +989,7 @@ const LocalizationUtils = { this.translations[locale] = JSON.parse(jsonString); return; } catch (e) { - console.error('Failed to parse JSON from direct extraction.'); + console.error("🎬 Media Bar:", 'Failed to parse JSON from direct extraction.'); // Try direct extraction } } @@ -1003,11 +1003,11 @@ const LocalizationUtils = { this.translations[locale] = JSON.parse(jsonString); return; } catch (e) { - console.error("Failed to parse JSON from chunk:", e); + console.error("🎬 Media Bar:", "Failed to parse JSON from chunk:", e); } } } catch (error) { - console.error("Error loading translations:", error); + console.error("🎬 Media Bar:", "Error loading translations:", error); } finally { delete this.isLoading[locale]; } @@ -1071,7 +1071,7 @@ const ApiUtils = { return itemData; } catch (error) { - console.error(`Error fetching details for item ${itemId}:`, error); + console.error("🎬 Media Bar:", `Error fetching details for item ${itemId}:`, error); return null; } }, @@ -1087,7 +1087,7 @@ const ApiUtils = { const response = await fetch(listFileName); if (!response.ok) { - console.warn("list.txt not found or inaccessible. Using random items."); + console.warn("🎬 Media Bar:", "list.txt not found or inaccessible. Using random items."); return []; } @@ -1098,7 +1098,7 @@ const ApiUtils = { .filter((id) => id) .slice(1); } catch (error) { - console.error("Error fetching list.txt:", error); + console.error("🎬 Media Bar:", "Error fetching list.txt:", error); return []; } }, @@ -1113,7 +1113,7 @@ const ApiUtils = { !STATE.jellyfinData.accessToken || STATE.jellyfinData.accessToken === "Not Found" ) { - console.warn("Access token not available. Delaying API request..."); + console.warn("🎬 Media Bar:", "Access token not available. Delaying API request..."); return []; } @@ -1121,11 +1121,11 @@ const ApiUtils = { !STATE.jellyfinData.serverAddress || STATE.jellyfinData.serverAddress === "Not Found" ) { - console.warn("Server address not available. Delaying API request..."); + console.warn("🎬 Media Bar:", "Server address not available. Delaying API request..."); return []; } - console.log("Fetching random items from server..."); + console.log("🎬 Media Bar:", "Fetching random items from server..."); let sortParams = `sortBy=${CONFIG.sortBy}`; @@ -1146,7 +1146,7 @@ const ApiUtils = { ); if (!response.ok) { - console.error( + console.error("🎬 Media Bar:", `Failed to fetch items: ${response.status} ${response.statusText}` ); return []; @@ -1155,13 +1155,13 @@ const ApiUtils = { const data = await response.json(); const items = data.Items || []; - console.log( + console.log("🎬 Media Bar:", `Successfully fetched ${items.length} random items from server` ); return items.map((item) => item.Id); } catch (error) { - console.error("Error fetching item IDs:", error); + console.error("🎬 Media Bar:", "Error fetching item IDs:", error); return []; } }, @@ -1185,7 +1185,7 @@ const ApiUtils = { try { const sessionId = await this.getSessionId(); if (!sessionId) { - console.error("Session ID not found."); + console.error("🎬 Media Bar:", "Session ID not found."); return false; } @@ -1201,10 +1201,10 @@ const ApiUtils = { ); } - console.log("Play command sent successfully to session:", sessionId); + console.log("🎬 Media Bar:", "Play command sent successfully to session:", sessionId); return true; } catch (error) { - console.error("Error sending play command:", error); + console.error("🎬 Media Bar:", "Error sending play command:", error); return false; } }, @@ -1230,7 +1230,7 @@ const ApiUtils = { const sessions = await response.json(); if (!sessions || sessions.length === 0) { - console.warn( + console.warn("🎬 Media Bar:", "No sessions found for deviceId:", STATE.jellyfinData.deviceId ); @@ -1239,7 +1239,7 @@ const ApiUtils = { return sessions[0].Id; } catch (error) { - console.error("Error fetching session data:", error); + console.error("🎬 Media Bar:", "Error fetching session data:", error); return null; } }, @@ -1267,7 +1267,7 @@ const ApiUtils = { } button.classList.toggle("favorited", !isFavorite); } catch (error) { - console.error("Error toggling favorite:", error); + console.error("🎬 Media Bar:", "Error toggling favorite:", error); } }, @@ -1309,7 +1309,7 @@ const ApiUtils = { this._sponsorBlockCache[videoId] = result; return result; } catch (error) { - console.warn('Error fetching SponsorBlock data:', error); + console.warn("🎬 Media Bar:", 'Error fetching SponsorBlock data:', error); return { intro: null, outro: null }; } }, @@ -1329,7 +1329,7 @@ const ApiUtils = { ); if (!response.ok) { - console.warn(`Failed to search for '${name}'`); + console.warn("🎬 Media Bar:", `Failed to search for '${name}'`); return null; } @@ -1339,7 +1339,7 @@ const ApiUtils = { } return null; } catch (error) { - console.error(`Error searching for '${name}':`, error); + console.error("🎬 Media Bar:", `Error searching for '${name}':`, error); return null; } }, @@ -1359,16 +1359,16 @@ const ApiUtils = { ); if (!response.ok) { - console.warn(`Failed to fetch collection items for ${collectionId}`); + console.warn("🎬 Media Bar:", `Failed to fetch collection items for ${collectionId}`); return []; } const data = await response.json(); const items = data.Items || []; - console.log(`Resolved collection ${collectionId} to ${items.length} items`); + console.log("🎬 Media Bar:", `Resolved collection ${collectionId} to ${items.length} items`); return items.map(i => ({ Id: i.Id, Type: i.Type })); } catch (error) { - console.error(`Error fetching collection items for ${collectionId}:`, error); + console.error("🎬 Media Bar:", `Error fetching collection items for ${collectionId}:`, error); return []; } }, @@ -1398,7 +1398,7 @@ const ApiUtils = { if (CONFIG.randomizeLocalTrailers && trailers.length > 1) { const randomIndex = Math.floor(Math.random() * trailers.length); trailer = trailers[randomIndex]; - console.log(`Using random local trailer (${randomIndex + 1}/${trailers.length}) for ${itemId}: ${trailer.Name}`); + console.log("🎬 Media Bar:", `Using random local trailer (${randomIndex + 1}/${trailers.length}) for ${itemId}: ${trailer.Name}`); } else { trailer = trailers[0]; } @@ -1412,7 +1412,7 @@ const ApiUtils = { } return null; } catch (error) { - console.error(`Error fetching local trailer for ${itemId}:`, error); + console.error("🎬 Media Bar:", `Error fetching local trailer for ${itemId}:`, error); return null; } }, @@ -1438,10 +1438,10 @@ const ApiUtils = { if (CONFIG.randomizeThemeVideos && items.length > 1) { const randomIndex = Math.floor(Math.random() * items.length); video = items[randomIndex]; - console.log(`Found Theme Video (Random ${randomIndex + 1}/${items.length}) via ThemeVideos endpoint: ${video.Name} (${video.Id})`); + console.log("🎬 Media Bar:", `Found Theme Video (Random ${randomIndex + 1}/${items.length}) via ThemeVideos endpoint: ${video.Name} (${video.Id})`); } else { video = items[0]; - console.log(`Found Theme Video (First) via ThemeVideos endpoint: ${video.Name} (${video.Id})`); + console.log("🎬 Media Bar:", `Found Theme Video (First) via ThemeVideos endpoint: ${video.Name} (${video.Id})`); } return { @@ -1452,7 +1452,7 @@ const ApiUtils = { } return null; } catch (error) { - console.error(`Error fetching theme videos for ${itemId}:`, error); + console.error("🎬 Media Bar:", `Error fetching theme videos for ${itemId}:`, error); return null; } } @@ -1636,7 +1636,7 @@ const SlideCreator = { */ createSlideElement(item, title) { if (!item || !item.Id) { - console.error("Invalid item data:", item); + console.error("🎬 Media Bar:", "Invalid item data:", item); return null; } @@ -1668,7 +1668,7 @@ const SlideCreator = { if (guidMatch) { const videoId = guidMatch[1]; - console.log(`Using custom local video ID for ${itemId}: ${videoId}`); + console.log("🎬 Media Bar:", `Using custom local video ID for ${itemId}: ${videoId}`); trailerUrl = { id: videoId, @@ -1677,18 +1677,18 @@ const SlideCreator = { } else { // Assume it's a standard URL (YouTube, etc.) trailerUrl = customValue; - console.log(`Using custom trailer URL for ${itemId}: ${trailerUrl}`); + console.log("🎬 Media Bar:", `Using custom trailer URL for ${itemId}: ${trailerUrl}`); } } // 1b. Check Theme Video if preferred (Local Backdrop) else if (CONFIG.preferLocalBackdrops && item.themeVideoUrl) { trailerUrl = item.themeVideoUrl; - console.log(`Using theme video (local backdrop) for ${itemId}: ${trailerUrl.url || trailerUrl}`); + console.log("🎬 Media Bar:", `Using theme video (local backdrop) for ${itemId}: ${trailerUrl.url || trailerUrl}`); } // 1c. Check Local Trailer if preferred else if (CONFIG.preferLocalTrailers && item.LocalTrailerCount > 0 && item.localTrailerUrl) { trailerUrl = item.localTrailerUrl; - console.log(`Using local trailer for ${itemId}: ${trailerUrl}`); + console.log("🎬 Media Bar:", `Using local trailer for ${itemId}: ${trailerUrl}`); } // 1d. Fallback to Remote Trailer else if (item.RemoteTrailers && item.RemoteTrailers.length > 0) { @@ -1697,7 +1697,7 @@ const SlideCreator = { // 1e. Final Fallback to Local Trailer (even if not preferred) else if (item.LocalTrailerCount > 0 && item.localTrailerUrl) { trailerUrl = item.localTrailerUrl; - console.log(`Using local trailer fallback for ${itemId}: ${trailerUrl}`); + console.log("🎬 Media Bar:", `Using local trailer fallback for ${itemId}: ${trailerUrl}`); } const isMobile = /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); @@ -1727,7 +1727,7 @@ const SlideCreator = { } } } catch (e) { - console.warn("Invalid trailer URL:", trailerUrl); + console.warn("🎬 Media Bar:", "Invalid trailer URL:", trailerUrl); } const isLowPower = isLowPowerDevice(); @@ -1794,11 +1794,11 @@ const SlideCreator = { // Apply SponsorBlock start/end times if (segments.intro) { playerVars.start = Math.ceil(segments.intro[1]); - console.info(`SponsorBlock intro detected for video ${videoId}: skipping to ${playerVars.start}s`); + console.info("🎬 Media Bar:", `SponsorBlock intro detected for video ${videoId}: skipping to ${playerVars.start}s`); } if (segments.outro) { playerVars.end = Math.floor(segments.outro[0]); - console.info(`SponsorBlock outro detected for video ${videoId}: ending at ${playerVars.end}s`); + console.info("🎬 Media Bar:", `SponsorBlock outro detected for video ${videoId}: ending at ${playerVars.end}s`); } STATE.slideshow.videoPlayers[itemId] = new YT.Player(ytPlayerIframe, { @@ -1836,16 +1836,16 @@ const SlideCreator = { // Re-check conditions before processing fallback const isVideoPlayerOpenNow = document.querySelector('.videoPlayerContainer') || document.querySelector('.youtubePlayerContainer'); if (document.hidden || (isVideoPlayerOpenNow && !isVideoPlayerOpenNow.classList.contains('hide')) || !slide.classList.contains('active')) { - console.log(`Navigation detected during autoplay check for ${itemId}, stopping video.`); + console.log("🎬 Media Bar:", `Navigation detected during autoplay check for ${itemId}, stopping video.`); try { event.target.stopVideo(); - } catch (e) { console.warn("Error stopping video in timeout:", e); } + } catch (e) { console.warn("🎬 Media Bar:", "Error stopping video in timeout:", e); } return; } if (event.target.getPlayerState() !== YT.PlayerState.PLAYING && event.target.getPlayerState() !== YT.PlayerState.BUFFERING) { - console.warn(`Autoplay blocked for ${itemId}, attempting muted fallback`); + console.warn("🎬 Media Bar:", `Autoplay blocked for ${itemId}, attempting muted fallback`); event.target.mute(); event.target.playVideo(); } @@ -1876,7 +1876,7 @@ const SlideCreator = { } }, 'onError': (event) => { - console.warn(`YouTube player error ${event.data} for video ${videoId}`); + console.warn("🎬 Media Bar:", `YouTube player error ${event.data} for video ${videoId}`); // Fallback to next slide on error if (CONFIG.waitForTrailerToEnd) { SlideshowManager.nextSlide(); @@ -1910,7 +1910,7 @@ const SlideCreator = { videoBackdrop.addEventListener('play', (event) => { const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`); if (!slide || !slide.classList.contains('active')) { - console.log(`Local video ${itemId} started playing but slide is not active, pausing.`); + console.log("🎬 Media Bar:", `Local video ${itemId} started playing but slide is not active, pausing.`); event.target.pause(); event.target.currentTime = 0; return; @@ -1932,7 +1932,7 @@ const SlideCreator = { }); videoBackdrop.addEventListener('error', (event) => { - console.warn(`Local video error for item ${itemId}`); + console.warn("🎬 Media Bar:", `Local video error for item ${itemId}`); const slide = event.target.closest('.slide'); if (slide && slide.classList.contains('active')) { SlideshowManager.nextSlide(); @@ -2295,7 +2295,7 @@ const SlideCreator = { return slideElement; } catch (error) { - console.error("Error creating slide for item:", error, itemId); + console.error("🎬 Media Bar:", "Error creating slide for item:", error, itemId); return null; } }, @@ -2394,7 +2394,7 @@ const SlideshowManager = { this.upgradeSlideImageQuality(currentSlide); if (!currentSlide) { - console.error(`Failed to create slide for item ${currentItemId}`); + console.error("🎬 Media Bar:", `Failed to create slide for item ${currentItemId}`); STATE.slideshow.isTransitioning = false; setTimeout(() => this.nextSlide(), 500); return; @@ -2486,9 +2486,9 @@ const SlideshowManager = { // Check if it actually started playing after a short delay (handling autoplay blocks) setTimeout(() => { if (videoBackdrop.paused && currentSlide.classList.contains('active')) { - console.warn(`Autoplay blocked for ${currentItemId}, attempting muted fallback`); + console.warn("🎬 Media Bar:", `Autoplay blocked for ${currentItemId}, attempting muted fallback`); videoBackdrop.muted = true; - videoBackdrop.play().catch(err => console.error("Muted fallback failed", err)); + videoBackdrop.play().catch(err => console.error("🎬 Media Bar:", "Muted fallback failed", err)); } }, 1000); }); @@ -2515,7 +2515,7 @@ const SlideshowManager = { if (player.getPlayerState && player.getPlayerState() !== YT.PlayerState.PLAYING && player.getPlayerState() !== YT.PlayerState.BUFFERING) { - console.log("YouTube loadVideoById didn't start playback, retrying muted..."); + console.log("🎬 Media Bar:", "YouTube loadVideoById didn't start playback, retrying muted..."); player.mute(); player.playVideo(); } @@ -2574,7 +2574,7 @@ const SlideshowManager = { this.pruneSlideCache(); } catch (error) { - console.error("Error updating current slide:", error); + console.error("🎬 Media Bar:", "Error updating current slide:", error); } finally { setTimeout(() => { STATE.slideshow.isTransitioning = false; @@ -2718,7 +2718,7 @@ const SlideshowManager = { delete STATE.slideshow.createdSlides[itemId]; prunedAny = true; - console.log(`Pruned slide ${itemId} at distance ${distance} from view`); + console.log("🎬 Media Bar:", `Pruned slide ${itemId} at distance ${distance} from view`); } }); @@ -2765,7 +2765,7 @@ const SlideshowManager = { } video.play().catch(error => { - console.warn("Unmuted play blocked, reverting to muted..."); + console.warn("🎬 Media Bar:", "Unmuted play blocked, reverting to muted..."); STATE.slideshow.isMuted = true; video.muted = true; video.play(); @@ -2786,7 +2786,7 @@ const SlideshowManager = { setTimeout(() => { const state = player.getPlayerState(); if (state === 2) { - console.log("Video was paused after unmute..."); + console.log("🎬 Media Bar:", "Video was paused after unmute..."); STATE.slideshow.isMuted = true; player.mute(); player.playVideo(); @@ -2877,7 +2877,7 @@ const SlideshowManager = { player.pauseVideo(); } } catch (e) { - console.warn("Error pausing/stopping YouTube player:", e); + console.warn("🎬 Media Bar:", "Error pausing/stopping YouTube player:", e); } }); } @@ -2897,7 +2897,7 @@ const SlideshowManager = { video.removeAttribute('src'); video.load(); } catch (e) { - console.warn("Error stopping HTML5 video:", e); + console.warn("🎬 Media Bar:", "Error stopping HTML5 video:", e); } }); } @@ -2938,7 +2938,7 @@ const SlideshowManager = { } html5Video.muted = STATE.slideshow.isMuted; if (!STATE.slideshow.isMuted) html5Video.volume = 0.4; - html5Video.play().catch(e => console.warn("Error resuming HTML5 video:", e)); + html5Video.play().catch(e => console.warn("🎬 Media Bar:", "Error resuming HTML5 video:", e)); } }, @@ -3140,14 +3140,14 @@ const SlideshowManager = { } if (isInRange) { - console.log(`Seasonal match found: ${section.Name}`); + console.log("🎬 Media Bar:", `Seasonal match found: ${section.Name}`); idsString = section.MediaIds; usingSeasonal = true; break; // Use first matching season } } } catch (e) { - console.error("Error parsing seasonal sections in JS:", e); + console.error("🎬 Media Bar:", "Error parsing seasonal sections in JS:", e); } } @@ -3205,14 +3205,14 @@ const SlideshowManager = { if (guidMatch) { id = guidMatch[1]; } else { - console.log(`Input '${rawId}' is not a GUID, searching for Collection/Playlist by name...`); + console.log("🎬 Media Bar:", `Input '${rawId}' is not a GUID, searching for Collection/Playlist by name...`); const resolvedId = await ApiUtils.findCollectionOrPlaylistByName(rawId); if (resolvedId) { - console.log(`Resolved name '${rawId}' to ID: ${resolvedId}`); + console.log("🎬 Media Bar:", `Resolved name '${rawId}' to ID: ${resolvedId}`); id = resolvedId; } else { - console.warn(`Could not find Collection or Playlist with name: '${rawId}'`); + console.warn("🎬 Media Bar:", `Could not find Collection or Playlist with name: '${rawId}'`); continue; // Skip if resolution failed } } @@ -3220,14 +3220,14 @@ const SlideshowManager = { const item = await ApiUtils.fetchItemDetails(id); if (item && (item.Type === 'BoxSet' || item.Type === 'Playlist')) { - console.log(`Found Collection/Playlist: ${id} (${item.Type}), fetching children...`); + console.log("🎬 Media Bar:", `Found Collection/Playlist: ${id} (${item.Type}), fetching children...`); const children = await ApiUtils.fetchCollectionItems(id); finalIds.push(...children); } else if (item) { finalIds.push({ Id: item.Id, Type: item.Type }); } } catch (e) { - console.warn(`Error resolving item ${rawId}:`, e); + console.warn("🎬 Media Bar:", `Error resolving item ${rawId}:`, e); } } return finalIds; @@ -3243,7 +3243,7 @@ const SlideshowManager = { // 1. Try Custom Media/Collection IDs from Config & seasonal content if (CONFIG.enableCustomMediaIds || CONFIG.enableSeasonalContent) { - console.log("Using Custom Media IDs from configuration"); + console.log("🎬 Media Bar:", "Using Custom Media IDs from configuration"); const rawIds = this.parseCustomIds(); const resolvedItems = await this.resolveCollectionsAndItems(rawIds); @@ -3273,7 +3273,7 @@ const SlideshowManager = { } } itemIds = keptItems.map(i => i.Id); - console.log(`Applied limits to custom IDs: ${itemIds.length} items (Movies: ${movieCount}, Shows: ${showCount})`); + console.log("🎬 Media Bar:", `Applied limits to custom IDs: ${itemIds.length} items (Movies: ${movieCount}, Shows: ${showCount})`); } else { itemIds = resolvedItems.map(i => i.Id); } @@ -3286,7 +3286,7 @@ const SlideshowManager = { // 3. Fallback to server query (Random) if (itemIds.length === 0) { - console.log("No custom list found, fetching random items from server..."); + console.log("🎬 Media Bar:", "No custom list found, fetching random items from server..."); itemIds = await ApiUtils.fetchItemIdsFromServer(); if (CONFIG.sortBy === 'Random') { @@ -3298,7 +3298,7 @@ const SlideshowManager = { itemIds = SlideUtils.shuffleArray(itemIds); } else if (CONFIG.sortBy !== 'Original') { // Client-side sort required... - console.log(`Sorting ${itemIds.length} custom items by ${CONFIG.sortBy} ${CONFIG.sortOrder}`); + console.log("🎬 Media Bar:", `Sorting ${itemIds.length} custom items by ${CONFIG.sortBy} ${CONFIG.sortOrder}`); const itemsWithDetails = []; for (const id of itemIds) { const item = await ApiUtils.fetchItemDetails(id); @@ -3340,7 +3340,7 @@ const SlideshowManager = { } } } catch (error) { - console.error("Error loading slideshow data:", error); + console.error("🎬 Media Bar:", "Error loading slideshow data:", error); } finally { STATE.slideshow.isLoading = false; } @@ -3486,7 +3486,7 @@ const MediaBarEnhancedSettingsManager = { this.initialized = true; this.injectSettingsIcon(); - console.log("MediaBarEnhanced: Client-Side Settings Manager initialized."); + console.log("🎬 Media Bar:", "Client-Side Settings Manager initialized."); }, getSetting(key, defaultValue) { @@ -3660,7 +3660,7 @@ const initPageVisibilityHandler = () => { document.addEventListener("visibilitychange", () => { if (document.hidden) { - console.log("Tab inactive - pausing slideshow and videos"); + console.log("🎬 Media Bar:", "Tab inactive - pausing slideshow and videos"); wasVideoPlayingBeforeHide = STATE.slideshow.isVideoPlaying; if (STATE.slideshow.slideInterval) { @@ -3678,7 +3678,7 @@ const initPageVisibilityHandler = () => { player.pauseVideo(); STATE.slideshow.isVideoPlaying = false; } catch (e) { - console.warn("Error pausing video on tab hide:", e); + console.warn("🎬 Media Bar:", "Error pausing video on tab hide:", e); } } else if (player.tagName === 'VIDEO') { // HTML5 Video player.pause(); @@ -3687,7 +3687,7 @@ const initPageVisibilityHandler = () => { } } } else { - console.log("Tab active - resuming slideshow"); + console.log("🎬 Media Bar:", "Tab active - resuming slideshow"); if (!STATE.slideshow.isPaused) { const currentItemId = STATE.slideshow.itemIds[STATE.slideshow.currentSlideIndex]; @@ -3700,16 +3700,16 @@ const initPageVisibilityHandler = () => { player.playVideo(); STATE.slideshow.isVideoPlaying = true; } catch (e) { - console.warn("Error resuming video on tab show:", e); + console.warn("🎬 Media Bar:", "Error resuming video on tab show:", e); if (STATE.slideshow.slideInterval) { STATE.slideshow.slideInterval.start(); } } } else if (player.tagName === 'VIDEO') { // HTML5 Video try { - player.play().catch(e => console.warn("Error resuming HTML5 video:", e)); + player.play().catch(e => console.warn("🎬 Media Bar:", "Error resuming HTML5 video:", e)); STATE.slideshow.isVideoPlaying = true; - } catch(e) { console.warn(e); } + } catch(e) { console.warn("🎬 Media Bar:", e); } } } else { // No video was playing, just restart interval @@ -3735,7 +3735,7 @@ const initPageVisibilityHandler = () => { */ const slidesInit = async () => { if (STATE.slideshow.hasInitialized) { - console.log("⚠️ Slideshow already initialized, skipping"); + console.log("🎬 Media Bar:", "⚠️ Slideshow already initialized, skipping"); return; } @@ -3743,7 +3743,7 @@ const slidesInit = async () => { MediaBarEnhancedSettingsManager.init(); const isClientSideEnabled = MediaBarEnhancedSettingsManager.getSetting('enabled', true); if (!isClientSideEnabled) { - console.log("MediaBarEnhanced: Disabled by client-side setting."); + console.log("🎬 Media Bar:", "Disabled by client-side setting."); const homeSections = document.querySelector('.homeSectionsContainer'); if (homeSections) { homeSections.style.top = '0'; @@ -3833,7 +3833,7 @@ const slidesInit = async () => { const lazyLoadObserver = initLazyLoading(); try { - console.log("🌟 Initializing Enhanced Jellyfin Slideshow"); + console.log("🎬 Media Bar:", "🌟 Initializing Enhanced Jellyfin Slideshow"); initArrowNavigation(); @@ -3847,9 +3847,9 @@ const slidesInit = async () => { VisibilityObserver.init(); - console.log("✅ Enhanced Jellyfin Slideshow initialized successfully"); + console.log("🎬 Media Bar:", "✅ Enhanced Jellyfin Slideshow initialized successfully"); } catch (error) { - console.error("Error initializing slideshow:", error); + console.error("🎬 Media Bar:", "Error initializing slideshow:", error); STATE.slideshow.hasInitialized = false; } };