From 1f655ed7b6f4cff5c32f5c3d93ef939df75ffba3 Mon Sep 17 00:00:00 2001
From: CodeDevMLH <145071728+CodeDevMLH@users.noreply.github.com>
Date: Sat, 14 Feb 2026 16:03:14 +0100
Subject: [PATCH] Enhance SponsorBlock data fetching with caching and improve
slide transition logic
---
.../Web/mediaBarEnhanced.js | 53 ++++++++++++-------
1 file changed, 35 insertions(+), 18 deletions(-)
diff --git a/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js b/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js
index 9d99188..3bdc565 100644
--- a/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js
+++ b/Jellyfin.Plugin.MediaBarEnhanced/Web/mediaBarEnhanced.js
@@ -1258,9 +1258,20 @@ const ApiUtils = {
*/
async fetchSponsorBlockData(videoId) {
if (!CONFIG.useSponsorBlock) return { intro: null, outro: null };
+
+ // Return cached result if available
+ if (!this._sponsorBlockCache) this._sponsorBlockCache = {};
+ if (this._sponsorBlockCache[videoId]) {
+ return this._sponsorBlockCache[videoId];
+ }
+
try {
const response = await fetch(`https://sponsor.ajay.app/api/skipSegments?videoID=${videoId}&categories=["intro","outro"]`);
- if (!response.ok) return { intro: null, outro: null };
+ if (!response.ok) {
+ const result = { intro: null, outro: null };
+ this._sponsorBlockCache[videoId] = result;
+ return result;
+ }
const segments = await response.json();
let intro = null;
@@ -1274,7 +1285,9 @@ const ApiUtils = {
}
});
- return { intro, outro };
+ const result = { intro, outro };
+ this._sponsorBlockCache[videoId] = result;
+ return result;
} catch (error) {
console.warn('Error fetching SponsorBlock data:', error);
return { intro: null, outro: null };
@@ -1763,7 +1776,11 @@ const SlideCreator = {
if (event.data === YT.PlayerState.ENDED) {
const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`);
if (slide && slide.classList.contains('active')) {
- SlideshowManager.nextSlide();
+ if (CONFIG.waitForTrailerToEnd) {
+ SlideshowManager.nextSlide();
+ } else {
+ event.target.playVideo(); // Loop if trailer is shorter than slide duration
+ }
}
}
},
@@ -2281,25 +2298,25 @@ const SlideshowManager = {
if (previousVisibleSlide) {
previousVisibleSlide.classList.remove("active");
- previousVisibleSlide.setAttribute("inert", "");
- previousVisibleSlide.setAttribute("tabindex", "-1");
+ // previousVisibleSlide.setAttribute("inert", "");
+ // previousVisibleSlide.setAttribute("tabindex", "-1");
}
currentSlide.classList.add("active");
- currentSlide.removeAttribute("inert");
- currentSlide.setAttribute("tabindex", "0");
+ // currentSlide.removeAttribute("inert");
+ // currentSlide.setAttribute("tabindex", "0");
- // Update Play/Pause Button State if it was paused
- if (STATE.slideshow.isPaused) {
- STATE.slideshow.isPaused = false;
- const pauseButton = document.querySelector('.pause-button');
- if (pauseButton) {
- pauseButton.innerHTML = 'pause';
- const pauseLabel = LocalizationUtils.getLocalizedString('ButtonPause', 'Pause');
- pauseButton.setAttribute("aria-label", pauseLabel);
- pauseButton.setAttribute("title", pauseLabel);
- }
- }
+ // // Update Play/Pause Button State if it was paused
+ // if (STATE.slideshow.isPaused) {
+ // STATE.slideshow.isPaused = false;
+ // const pauseButton = document.querySelector('.pause-button');
+ // if (pauseButton) {
+ // pauseButton.innerHTML = 'pause';
+ // const pauseLabel = LocalizationUtils.getLocalizedString('ButtonPause', 'Pause');
+ // pauseButton.setAttribute("aria-label", pauseLabel);
+ // pauseButton.setAttribute("title", pauseLabel);
+ // }
+ // }
// Manage Video Playback: Stop others, Play current