Compare commits

...

15 Commits

Author SHA1 Message Date
CodeDevMLH
f437a546d2 Update manifest.json for release v1.9.0.0 [skip ci] 2026-03-24 01:27:06 +00:00
CodeDevMLH
15520fdff8 Bump version to 1.9.0.0 in project file and manifest
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 49s
2026-03-24 02:26:17 +01:00
CodeDevMLH
3093e88ffb Update Max Plot Length field description to clarify character limits
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 33s
2026-03-24 02:04:00 +01:00
CodeDevMLH
e4ba5130fa Enhance video playback control by adding pause functionality for inactive slides 2026-03-24 01:53:04 +01:00
CodeDevMLH
de57f1c20b Add missing PowerShell command block for building the plugin 2026-03-24 01:53:00 +01:00
CodeDevMLH
a5e98bdd93 Update manifest.json for release v1.8.1.6 [skip ci] 2026-03-24 00:04:24 +00:00
CodeDevMLH
ed5c0ab696 Bump version to 1.8.1.6
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 46s
2026-03-24 01:03:37 +01:00
CodeDevMLH
ffcbd21eb6 Update YouTube iframe source to include autoplay, controls, and mute options 2026-03-24 01:03:24 +01:00
CodeDevMLH
4ddd83ba4d Update manifest.json for release v1.8.1.5 [skip ci] 2026-03-23 23:44:24 +00:00
CodeDevMLH
b08a93718e Bump version to 1.8.1.5
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 47s
2026-03-24 00:43:37 +01:00
CodeDevMLH
eecb81d59a Implement play signal management for slideshow video playback 2026-03-24 00:43:17 +01:00
CodeDevMLH
664eecf779 Enhance video playback logic by introducing a play signal check for active slides 2026-03-24 00:38:04 +01:00
CodeDevMLH
c833a94c3f Update manifest.json for release v1.8.1.4 [skip ci] 2026-03-23 23:18:11 +00:00
CodeDevMLH
b1c39b4b38 Bump version to 1.8.1.4
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 45s
2026-03-24 00:17:24 +01:00
CodeDevMLH
5e398d06a8 Add backdrop video delay and plot width constraint options; improve autoplay handling 2026-03-24 00:17:05 +01:00
5 changed files with 60 additions and 32 deletions

View File

@@ -606,10 +606,10 @@
enable counter style directly.</div> enable counter style directly.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="MaxPlotLength">Max Plot <label class="inputLabel inputLabelUnfocused" for="MaxPlotLength">Max Plot Length</label>
Length</label>
<input is="emby-input" type="number" id="MaxPlotLength" name="MaxPlotLength" /> <input is="emby-input" type="number" id="MaxPlotLength" name="MaxPlotLength" />
<div class="fieldDescription">Maximum characters for the plot summary.</div> <div class="fieldDescription">Maximum characters for the plot summary. Limited to max 2 lines
(or 3 if 'Constrain Plot Width' is enabled).</div>
</div> </div>
</div> </div>

View File

@@ -12,7 +12,7 @@
<!-- <TreatWarningsAsErrors>false</TreatWarningsAsErrors> --> <!-- <TreatWarningsAsErrors>false</TreatWarningsAsErrors> -->
<Title>Jellyfin Media Bar Enhanced Plugin</Title> <Title>Jellyfin Media Bar Enhanced Plugin</Title>
<Authors>CodeDevMLH</Authors> <Authors>CodeDevMLH</Authors>
<Version>1.8.1.3</Version> <Version>1.9.0.0</Version>
<RepositoryUrl>https://github.com/CodeDevMLH/jellyfin-plugin-media-bar-enhanced</RepositoryUrl> <RepositoryUrl>https://github.com/CodeDevMLH/jellyfin-plugin-media-bar-enhanced</RepositoryUrl>
</PropertyGroup> </PropertyGroup>

View File

@@ -1,4 +1,4 @@
/* /*
* Jellyfin Slideshow by M0RPH3US v4.0.1 * Jellyfin Slideshow by M0RPH3US v4.0.1
* Modified by CodeDevMLH * Modified by CodeDevMLH
* *
@@ -67,6 +67,8 @@ const CONFIG = {
customOverlayPositionX: 0, customOverlayPositionX: 0,
customOverlayPositionY: 0, customOverlayPositionY: 0,
customOverlayScale: 100, customOverlayScale: 100,
backdropVideoDelay: 0,
constrainPlotWidth: false,
enableCustomMediaIds: true, enableCustomMediaIds: true,
enableSeasonalContent: false, enableSeasonalContent: false,
customMediaIds: "", customMediaIds: "",
@@ -110,6 +112,7 @@ const STATE = {
customTrailerUrls: {}, customTrailerUrls: {},
ytPromise: null, ytPromise: null,
autoplayTimeouts: [], autoplayTimeouts: [],
playSignals: {},
}, },
}; };
@@ -396,6 +399,7 @@ const resetSlideshowState = () => {
STATE.slideshow.customTrailerUrls = {}; STATE.slideshow.customTrailerUrls = {};
STATE.slideshow.totalItems = 0; STATE.slideshow.totalItems = 0;
STATE.slideshow.isLoading = false; STATE.slideshow.isLoading = false;
STATE.slideshow.playSignals = {};
}; };
/** /**
@@ -1802,7 +1806,7 @@ const SlideCreator = {
// Create an iframe upfront // Create an iframe upfront
const ytPlayerIframe = SlideUtils.createElement("iframe", { const ytPlayerIframe = SlideUtils.createElement("iframe", {
id: `youtube-player-${itemId}`, id: `youtube-player-${itemId}`,
src: `https://www.youtube-nocookie.com/embed/${videoId}?enablejsapi=1&origin=${encodeURIComponent(window.location.origin)}`, src: `https://www.youtube-nocookie.com/embed/${videoId}?enablejsapi=1&autoplay=0&controls=0&playsinline=1&mute=${STATE.slideshow.isMuted ? 1 : 0}&origin=${encodeURIComponent(window.location.origin)}`,
style: "width: 100%; height: 100%; border: none;", style: "width: 100%; height: 100%; border: none;",
allow: "autoplay; encrypted-media", allow: "autoplay; encrypted-media",
referrerpolicy: "strict-origin-when-cross-origin", referrerpolicy: "strict-origin-when-cross-origin",
@@ -1877,11 +1881,11 @@ const SlideCreator = {
event.target.setPlaybackQuality(quality); event.target.setPlaybackQuality(quality);
} }
// Only play if this is the active slide // Only play if this is the active slide and the play signal has been issued (delay finished)
const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`); const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`);
const isVideoPlayerOpen = document.querySelector('.videoPlayerContainer') || document.querySelector('.youtubePlayerContainer'); const isVideoPlayerOpen = document.querySelector('.videoPlayerContainer') || document.querySelector('.youtubePlayerContainer');
if (slide && slide.classList.contains('active') && !document.hidden && (!isVideoPlayerOpen || isVideoPlayerOpen.classList.contains('hide'))) { if (slide && slide.classList.contains('active') && STATE.slideshow.playSignals[itemId] === true && !document.hidden && (!isVideoPlayerOpen || isVideoPlayerOpen.classList.contains('hide'))) {
event.target.playVideo(); event.target.playVideo();
// Check if it actually started playing after a short delay (handling autoplay blocks) // Check if it actually started playing after a short delay (handling autoplay blocks)
@@ -1914,8 +1918,14 @@ const SlideCreator = {
} }
}, },
'onStateChange': (event) => { 'onStateChange': (event) => {
// Fade in when playing
if (event.data === YT.PlayerState.PLAYING) { if (event.data === YT.PlayerState.PLAYING) {
const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`);
if (slide && STATE.slideshow.playSignals[itemId] === false) {
event.target.pauseVideo();
return;
}
// Fade in when legitimately playing
if (event.target._wrapperDiv) { if (event.target._wrapperDiv) {
event.target._wrapperDiv.style.opacity = "1"; event.target._wrapperDiv.style.opacity = "1";
} }
@@ -1970,6 +1980,11 @@ const SlideCreator = {
return; return;
} }
if (STATE.slideshow.playSignals[itemId] === false) {
event.target.pause();
return;
}
// Fade in // Fade in
event.target.style.opacity = "1"; event.target.style.opacity = "1";
@@ -2479,6 +2494,7 @@ const SlideshowManager = {
void currentSlide.offsetWidth; void currentSlide.offsetWidth;
currentSlide.classList.add("active"); currentSlide.classList.add("active");
STATE.slideshow.playSignals[currentItemId] = false;
// Manage Video Playback: Stop others, Play current // Manage Video Playback: Stop others, Play current
// 1. Stop all other YouTube players and local video elements, release connections // 1. Stop all other YouTube players and local video elements, release connections
@@ -2580,8 +2596,11 @@ const SlideshowManager = {
const playVideoLogic = () => { const playVideoLogic = () => {
if (!currentSlide.classList.contains('active')) return; if (!currentSlide.classList.contains('active')) return;
STATE.slideshow.playSignals[currentItemId] = true;
if (videoBackdrop.tagName === 'VIDEO') { if (videoBackdrop.tagName === 'VIDEO') {
videoBackdrop.play().catch(e => { videoBackdrop.play().catch(e => {
if (!STATE.slideshow.isMuted) {
// Check if it actually started playing after a short delay (handling autoplay blocks) // Check if it actually started playing after a short delay (handling autoplay blocks)
setTimeout(() => { setTimeout(() => {
if (videoBackdrop.paused && currentSlide.classList.contains('active')) { if (videoBackdrop.paused && currentSlide.classList.contains('active')) {
@@ -2590,12 +2609,16 @@ const SlideshowManager = {
videoBackdrop.play().catch(err => console.error("🎬 Media Bar:", "Muted fallback failed", err)); videoBackdrop.play().catch(err => console.error("🎬 Media Bar:", "Muted fallback failed", err));
} }
}, 1000); }, 1000);
} else {
console.error("🎬 Media Bar:", "Playback failed despite being muted", e);
}
}); });
} else if (STATE.slideshow.videoPlayers && STATE.slideshow.videoPlayers[currentItemId]) { } else if (STATE.slideshow.videoPlayers && STATE.slideshow.videoPlayers[currentItemId]) {
const player = STATE.slideshow.videoPlayers[currentItemId]; const player = STATE.slideshow.videoPlayers[currentItemId];
if (player && typeof player.playVideo === 'function') { if (player && typeof player.playVideo === 'function') {
player.playVideo(); player.playVideo();
if (!STATE.slideshow.isMuted) {
// Check if playback successfully started, otherwise fallback to muted // Check if playback successfully started, otherwise fallback to muted
setTimeout(() => { setTimeout(() => {
if (!currentSlide.classList.contains('active')) return; if (!currentSlide.classList.contains('active')) return;
@@ -2609,6 +2632,7 @@ const SlideshowManager = {
}, 1000); }, 1000);
} }
} }
}
}; };
if (CONFIG.backdropVideoDelay > 0) { if (CONFIG.backdropVideoDelay > 0) {

View File

@@ -42,6 +42,10 @@ Bevor du baust, musst du die Versionsnummer in den folgenden Dateien aktualisier
Führe den folgenden Befehl im Terminal (PowerShell) im Hauptverzeichnis aus. Wir nutzen hier `dotnet build` statt `publish`, um unnötige Dateien zu vermeiden. Führe den folgenden Befehl im Terminal (PowerShell) im Hauptverzeichnis aus. Wir nutzen hier `dotnet build` statt `publish`, um unnötige Dateien zu vermeiden.
```powershell
dotnet build Jellyfin.Plugin.MediaBarEnhanced/Jellyfin.Plugin.MediaBarEnhanced.csproj --configuration Release --output bin/Publish;
```
```powershell ```powershell
dotnet build Jellyfin.Plugin.MediaBarEnhanced/Jellyfin.Plugin.MediaBarEnhanced.csproj --configuration Release --output bin/Publish; Compress-Archive -Path bin/Publish/* -DestinationPath bin/Publish/Jellyfin.Plugin.MediaBarEnhanced.zip -Force; $hash = (Get-FileHash -Algorithm MD5 bin/Publish/Jellyfin.Plugin.MediaBarEnhanced.zip).Hash.ToLower(); $time = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"); Write-Output "`n----------------------------------------"; Write-Output "NEUE CHECKSUMME (MD5): $hash"; Write-Output "ZEITSTEMPEL: $time"; Write-Output "----------------------------------------`n" dotnet build Jellyfin.Plugin.MediaBarEnhanced/Jellyfin.Plugin.MediaBarEnhanced.csproj --configuration Release --output bin/Publish; Compress-Archive -Path bin/Publish/* -DestinationPath bin/Publish/Jellyfin.Plugin.MediaBarEnhanced.zip -Force; $hash = (Get-FileHash -Algorithm MD5 bin/Publish/Jellyfin.Plugin.MediaBarEnhanced.zip).Hash.ToLower(); $time = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"); Write-Output "`n----------------------------------------"; Write-Output "NEUE CHECKSUMME (MD5): $hash"; Write-Output "ZEITSTEMPEL: $time"; Write-Output "----------------------------------------`n"
``` ```

View File

@@ -9,12 +9,12 @@
"imageUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/raw/branch/main/logo.png", "imageUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/raw/branch/main/logo.png",
"versions": [ "versions": [
{ {
"version": "1.8.1.3", "version": "1.9.0.0",
"changelog": "- fix pagination dot issue on mobile when showing more than 10 dots (should now dynamically adjust the max dots threshold based on screen size)\n- add option to delay trailer playback\n- add option to limit the plot width", "changelog": "- fix pagination dot issue on mobile when showing more than 10 dots (should now dynamically adjust the max dots threshold based on screen size)\n- add option to delay trailer playback\n- add option to limit the plot width",
"targetAbi": "10.11.0.0", "targetAbi": "10.11.0.0",
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.8.1.3/Jellyfin.Plugin.MediaBarEnhanced.zip", "sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.9.0.0/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "9be63bf948fc4a41d643afbed301dd8a", "checksum": "de2c736f754788eeb881aaa4fafa692f",
"timestamp": "2026-03-23T22:47:55Z" "timestamp": "2026-03-24T01:27:06Z"
}, },
{ {
"version": "1.8.0.0", "version": "1.8.0.0",