Compare commits

..

24 Commits

Author SHA1 Message Date
CodeDevMLH
c09f265b26 Update manifest.json for release v1.6.4.1 [skip ci] 2026-02-15 22:56:18 +00:00
CodeDevMLH
379c370b4a ..
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 50s
2026-02-15 23:55:28 +01:00
CodeDevMLH
b567307003 Update manifest.json for release v1.6.4.0 [skip ci] 2026-02-15 22:53:31 +00:00
CodeDevMLH
ff9ea9eff0 Bump version to 1.6.4.1
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 51s
2026-02-15 23:52:41 +01:00
CodeDevMLH
9427e3e535 Remove autoplay and loop attributes from video backdrop configuration 2026-02-15 23:52:34 +01:00
CodeDevMLH
19318a916d Update manifest.json for release v1.6.4.0 [skip ci] 2026-02-15 22:39:48 +00:00
CodeDevMLH
5d85284df8 Merge branch 'main' of ssh://git.mahom03-spacecloud.de:44322/CodeDevMLH/jellyfin-plugin-media-bar-enhanced
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 50s
2026-02-15 23:38:58 +01:00
CodeDevMLH
2382f850b6 Bump version to 1.6.4.0 2026-02-15 23:38:56 +01:00
CodeDevMLH
22041293f6 Update manifest.json for release v1.6.3.0 [skip ci] 2026-02-15 22:38:19 +00:00
CodeDevMLH
5595158f9d Update field description for Prefer Local Backdrops setting
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 52s
2026-02-15 23:25:01 +01:00
CodeDevMLH
39f85e0c9b fix backdrop issue? 2026-02-15 23:24:56 +01:00
CodeDevMLH
18a9980a0a Update manifest.json for release v1.6.3.0 [skip ci] 2026-02-15 01:21:08 +00:00
CodeDevMLH
deb426833d Bump version to 1.6.3.0
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 51s
2026-02-15 02:19:47 +01:00
CodeDevMLH
bf4b6da0f0 fix path issue on subpath installations 2026-02-15 02:19:37 +01:00
CodeDevMLH
2bc7d90254 Update manifest.json for release v1.6.2.3 [skip ci] 2026-02-15 00:38:08 +00:00
CodeDevMLH
3f302d4c64 Bump version to 1.6.2.3
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 50s
2026-02-15 01:37:17 +01:00
CodeDevMLH
13a1cc7885 Add option to include watched content in the Media Bar configuration 2026-02-15 01:37:05 +01:00
CodeDevMLH
a62900f96e Add options for theme video support, randomization, and including watched content in the Media Bar 2026-02-15 01:36:56 +01:00
CodeDevMLH
9d90a29a40 Update build command in RELEASE_GUIDE.md for enhanced plugin structure 2026-02-15 01:36:52 +01:00
CodeDevMLH
cd3973088e [skip ci] 2026-02-15 01:08:21 +01:00
CodeDevMLH
4112cfad4a Update manifest.json for release v1.6.2.1 [skip ci] 2026-02-14 23:52:43 +00:00
CodeDevMLH
2618b18df1 Bump version to 1.6.2.1
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 50s
2026-02-15 00:51:54 +01:00
CodeDevMLH
ef378c5e87 Add option to include watched content in random selection 2026-02-15 00:51:00 +01:00
CodeDevMLH
b8d0dd9f1a Update description for random backdrop video option in configPage.html [skip ci] 2026-02-15 00:36:42 +01:00
8 changed files with 61 additions and 27 deletions

View File

@@ -41,6 +41,7 @@ namespace Jellyfin.Plugin.MediaBarEnhanced.Configuration
public bool IsEnabled { get; set; } = true; public bool IsEnabled { get; set; } = true;
public bool EnableClientSideSettings { get; set; } = false; public bool EnableClientSideSettings { get; set; } = false;
public bool ApplyLimitsToCustomIds { get; set; } = false; public bool ApplyLimitsToCustomIds { get; set; } = false;
public bool IncludeWatchedContent { get; set; } = false;
public string SortBy { get; set; } = "Random"; public string SortBy { get; set; } = "Random";
public string SortOrder { get; set; } = "Ascending"; public string SortOrder { get; set; } = "Ascending";
} }

View File

@@ -71,7 +71,7 @@
name="PreferLocalBackdrops" /> name="PreferLocalBackdrops" />
<span>Prefer Local Backdrops / Theme Videos</span> <span>Prefer Local Backdrops / Theme Videos</span>
</label> </label>
<div class="fieldDescription">If enabled, local backdrop videos (Theme Videos) will be preferred over trailers.</div> <div class="fieldDescription">If enabled, local backdrop videos (Theme Videos) will be preferred over remote and local trailers.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label> <label>
@@ -201,7 +201,7 @@
name="RandomizeThemeVideos" /> name="RandomizeThemeVideos" />
<span>Randomize Backdrop Video</span> <span>Randomize Backdrop Video</span>
</label> </label>
<div class="fieldDescription">If enabled, a random video from the backdrops/theme videos will be selected instead of the first one.</div> <div class="fieldDescription">If enabled, a random video from the backdrops/theme videos will be selected instead of the first one (if multiple exist).</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label> <label>
@@ -385,6 +385,14 @@
<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.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input is="emby-checkbox" type="checkbox" id="IncludeWatchedContent"
name="IncludeWatchedContent" />
<span>Include Watched Content</span>
</label>
<div class="fieldDescription">If enabled, watched content will be included in the random selection results.</div>
</div>
</div> </div>
<div <div
@@ -444,7 +452,8 @@
'EnableCustomMediaIds', 'CustomMediaIds', 'EnableLoadingScreen', 'EnableCustomMediaIds', 'CustomMediaIds', 'EnableLoadingScreen',
'EnableSeasonalContent', 'EnableClientSideSettings', 'SortBy', 'SortOrder', 'EnableSeasonalContent', 'EnableClientSideSettings', 'SortBy', 'SortOrder',
'PreferLocalTrailers', 'ApplyLimitsToCustomIds', 'SeasonalSections', 'PreferLocalTrailers', 'ApplyLimitsToCustomIds', 'SeasonalSections',
'PreferLocalBackdrops', 'RandomizeThemeVideos', 'RandomizeLocalTrailers' 'PreferLocalBackdrops', 'RandomizeThemeVideos', 'RandomizeLocalTrailers',
'IncludeWatchedContent'
]; ];
keys.forEach(function (key) { keys.forEach(function (key) {
@@ -534,7 +543,8 @@
'EnableCustomMediaIds', 'CustomMediaIds', 'EnableLoadingScreen', 'EnableCustomMediaIds', 'CustomMediaIds', 'EnableLoadingScreen',
'EnableSeasonalContent', 'EnableClientSideSettings', 'SortBy', 'SortOrder', 'EnableSeasonalContent', 'EnableClientSideSettings', 'SortBy', 'SortOrder',
'PreferLocalTrailers', 'ApplyLimitsToCustomIds', 'SeasonalSections', 'PreferLocalTrailers', 'ApplyLimitsToCustomIds', 'SeasonalSections',
'PreferLocalBackdrops', 'RandomizeThemeVideos', 'RandomizeLocalTrailers' 'PreferLocalBackdrops', 'RandomizeThemeVideos', 'RandomizeLocalTrailers',
'IncludeWatchedContent'
]; ];
keys.forEach(function (key) { keys.forEach(function (key) {

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.6.2.0</Version> <Version>1.6.4.1</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

@@ -18,8 +18,8 @@ namespace Jellyfin.Plugin.MediaBarEnhanced
{ {
private readonly IApplicationPaths _appPaths; private readonly IApplicationPaths _appPaths;
private readonly ILogger<ScriptInjector> _logger; private readonly ILogger<ScriptInjector> _logger;
public const string ScriptTag = "<script src=\"/MediaBarEnhanced/Resources/mediaBarEnhanced.js\" defer></script>"; public const string ScriptTag = "<script src=\"../MediaBarEnhanced/Resources/mediaBarEnhanced.js\" defer></script>";
public const string CssTag = "<link rel=\"stylesheet\" href=\"/MediaBarEnhanced/Resources/mediaBarEnhanced.css\" />"; public const string CssTag = "<link rel=\"stylesheet\" href=\"../MediaBarEnhanced/Resources/mediaBarEnhanced.css\" />";
public const string ScriptMarker = "</body>"; public const string ScriptMarker = "</body>";
public const string CssMarker = "</head>"; public const string CssMarker = "</head>";

View File

@@ -45,6 +45,7 @@ const CONFIG = {
randomizeLocalTrailers: false, randomizeLocalTrailers: false,
preferLocalBackdrops: false, preferLocalBackdrops: false,
randomizeThemeVideos: false, randomizeThemeVideos: false,
includeWatchedContent: false,
waitForTrailerToEnd: true, waitForTrailerToEnd: true,
startMuted: true, startMuted: true,
fullWidthVideo: true, fullWidthVideo: true,
@@ -436,7 +437,7 @@ const waitForApiClientAndInitialize = () => {
const fetchPluginConfig = async () => { const fetchPluginConfig = async () => {
try { try {
const response = await fetch('/MediaBarEnhanced/Config'); const response = await fetch('../MediaBarEnhanced/Config');
if (response.ok) { if (response.ok) {
const pluginConfig = await response.json(); const pluginConfig = await response.json();
if (pluginConfig) { if (pluginConfig) {
@@ -1121,8 +1122,11 @@ const ApiUtils = {
sortParams += `&sortOrder=${CONFIG.sortOrder}`; sortParams += `&sortOrder=${CONFIG.sortOrder}`;
} }
// Filter by isPlayed=False unless IncludeWatchedContent is enabled
const playedFilter = CONFIG.includeWatchedContent ? '' : '&isPlayed=False';
const response = await fetch( const response = await fetch(
`${STATE.jellyfinData.serverAddress}/Items?IncludeItemTypes=Movie,Series&Recursive=true&hasOverview=true&imageTypes=Logo,Backdrop&${sortParams}&isPlayed=False&enableUserData=true&Limit=${CONFIG.maxItems}&fields=Id`, `${STATE.jellyfinData.serverAddress}/Items?IncludeItemTypes=Movie,Series&Recursive=true&hasOverview=true&imageTypes=Logo,Backdrop&${sortParams}${playedFilter}&enableUserData=true&Limit=${CONFIG.maxItems}&fields=Id`,
{ {
headers: this.getAuthHeaders(), headers: this.getAuthHeaders(),
} }
@@ -1829,11 +1833,7 @@ const SlideCreator = {
if (event.data === YT.PlayerState.ENDED) { if (event.data === YT.PlayerState.ENDED) {
const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`); const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`);
if (slide && slide.classList.contains('active')) { if (slide && slide.classList.contains('active')) {
if (CONFIG.waitForTrailerToEnd) { SlideshowManager.nextSlide();
SlideshowManager.nextSlide();
} else {
event.target.playVideo(); // Loop if trailer is shorter than slide duration
}
} }
} }
}, },
@@ -1856,9 +1856,7 @@ const SlideCreator = {
const videoAttributes = { const videoAttributes = {
className: "backdrop video-backdrop", className: "backdrop video-backdrop",
src: (typeof trailerUrl === 'object' ? trailerUrl.url : trailerUrl), src: (typeof trailerUrl === 'object' ? trailerUrl.url : trailerUrl),
autoplay: false,
preload: "auto", preload: "auto",
loop: false,
disablePictureInPicture: true, disablePictureInPicture: true,
style: "object-fit: cover; object-position: center center; width: 100%; height: 100%; position: absolute; top: 0; left: 0; pointer-events: none;" style: "object-fit: cover; object-position: center center; width: 100%; height: 100%; position: absolute; top: 0; left: 0; pointer-events: none;"
}; };
@@ -1883,16 +1881,17 @@ const SlideCreator = {
} }
}); });
backdrop.addEventListener('ended', () => { backdrop.addEventListener('ended', (event) => {
const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`); const slide = event.target.closest('.slide');
if (slide && slide.classList.contains('active')) { if (slide && slide.classList.contains('active')) {
SlideshowManager.nextSlide(); SlideshowManager.nextSlide();
} }
}); });
backdrop.addEventListener('error', () => { backdrop.addEventListener('error', (event) => {
const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`); console.warn(`Local video error for item ${itemId}`);
if (CONFIG.waitForTrailerToEnd && slide && slide.classList.contains('active')) { const slide = event.target.closest('.slide');
if (slide && slide.classList.contains('active')) {
SlideshowManager.nextSlide(); SlideshowManager.nextSlide();
} }
}); });

View File

@@ -101,6 +101,9 @@ This plugin builds upon the original Media Bar with new capabilities and improve
<img width="513" height="575" alt="Client-Settings" src="https://github.com/user-attachments/assets/3e29a84f-f8ea-4b7b-b561-80493cb1535b" /> <img width="513" height="575" alt="Client-Settings" src="https://github.com/user-attachments/assets/3e29a84f-f8ea-4b7b-b561-80493cb1535b" />
</details> </details>
* **Local Trailers Preference**: Option to prefer local trailers (from the media item) over online sources. * **Local Trailers Preference**: Option to prefer local trailers (from the media item) over online sources.
* **Theme Video Support**: Option to prefer local theme videos (backdrops) over trailers.
* **Randomization**: Options to randomize theme videos and local trailers if multiple versions exist.
* **Include Watched Content**: Option to include watched items in the random slideshow.
* **Content Sorting Options**: Sort content by various criteria such as PremiereDate, ProductionYear, Random, or Original order. * **Content Sorting Options**: Sort content by various criteria such as PremiereDate, ProductionYear, Random, or Original order.
* **Client-Side Settings**: Allow users to override settings locally on their device. * **Client-Side Settings**: Allow users to override settings locally on their device.
@@ -157,6 +160,8 @@ Configure the plugin via **Dashboard** > **Plugins** > **Media Bar Enhanced**.
* **Wait For Trailer To End**: Prevents slide transition until the video finishes. * **Wait For Trailer To End**: Prevents slide transition until the video finishes.
* **Enable Mobile Video**: specific setting to allow video playback on mobile devices (disabled by default to save data/battery). * **Enable Mobile Video**: specific setting to allow video playback on mobile devices (disabled by default to save data/battery).
* **Show Trailer Button**: Adds a button to open the trailer in a popup modal if video backdrops are disabled (e.g. on mobile if trailers are disabled there) * **Show Trailer Button**: Adds a button to open the trailer in a popup modal if video backdrops are disabled (e.g. on mobile if trailers are disabled there)
* **Prefer Local Trailers**: If enabled, local trailers will be preferred over remote (YouTube) trailers.
* **Prefer Local Backdrops / Theme Videos**: If enabled, local backdrop videos (Theme Videos) will be preferred over trailers.
### Custom Content ### Custom Content
Define exactly what shows up in your bar. Define exactly what shows up in your bar.
@@ -194,6 +199,7 @@ Customize the order of slides in the Media Bar.
Fine-tune performance by limiting the number of items fetched from the server. Fine-tune performance by limiting the number of items fetched from the server.
* **Total Max Items**: Maximum total items to fetch (combined). * **Total Max Items**: Maximum total items to fetch (combined).
* **Include Watched Content**: If enabled, the random slideshow will also include items that you have already watched.
* **Max Movies**: Maximum movies to include (for random selection). * **Max Movies**: Maximum movies to include (for random selection).
* **Max Tv Shows**: Maximum TV shows to include (for random selection). * **Max Tv Shows**: Maximum TV shows to include (for random selection).
* **Preload Count**: Number of slides to preload for smooth transitions. * **Preload Count**: Number of slides to preload for smooth transitions.
@@ -208,6 +214,8 @@ Fine-tune performance by limiting the number of items fetched from the server.
* **Full Width Video**: Stretches video to cover the entire width (good for desktop, crop on mobile). * **Full Width Video**: Stretches video to cover the entire width (good for desktop, crop on mobile).
* **Enable Loading Screen**: Enable/disable the loading indicator while the bar initializes. * **Enable Loading Screen**: Enable/disable the loading indicator while the bar initializes.
* **Always Show Arrows**: Keeps navigation arrows visible instead of hiding them on mouse leave. * **Always Show Arrows**: Keeps navigation arrows visible instead of hiding them on mouse leave.
* **Randomize Backdrop Video**: If enabled, a random video from the backdrops/theme videos will be selected instead of the first one.
* **Randomize Local Trailer**: If enabled, a random local trailer will be selected instead of the first one.
* **Enable Keyboard Controls**: * **Enable Keyboard Controls**:
* `Left`/`Right`: Change slide * `Left`/`Right`: Change slide
* `Space`: Pause/Play slideshow * `Space`: Pause/Play slideshow

View File

@@ -43,7 +43,7 @@ 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 ```powershell
dotnet build Jellyfin.Plugin.MediaBar/Jellyfin.Plugin.MediaBar.csproj --configuration Release --output bin/Publish; Compress-Archive -Path bin/Publish/* -DestinationPath bin/Publish/Jellyfin.Plugin.MediaBar.zip -Force; $hash = (Get-FileHash -Algorithm MD5 bin/Publish/Jellyfin.Plugin.MediaBar.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"
``` ```
## 3. Manifest aktualisieren ## 3. Manifest aktualisieren

View File

@@ -9,12 +9,28 @@
"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.6.2.0", "version": "1.6.4.1",
"changelog": "- feat: add options for local backdrops (theme videos) support and randomization features for local trailer/backdrops if more than 1 is available", "changelog": "- fix slide transition when using local/backdrop videos",
"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.6.2.0/Jellyfin.Plugin.MediaBarEnhanced.zip", "sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.6.4.1/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "ccc738317994a37d75db528ef03f9e25", "checksum": "a9c5a863427de84639eca082483936da",
"timestamp": "2026-02-14T23:34:46Z" "timestamp": "2026-02-15T22:56:17Z"
},
{
"version": "1.6.3.1",
"changelog": "- fix path issue on subpath installations",
"targetAbi": "10.11.0.0",
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.6.3.0/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "6a952445bfb80ba4603017358e48da91",
"timestamp": "2026-02-15T22:38:19Z"
},
{
"version": "1.6.2.3",
"changelog": "- feat: add options for local backdrops (theme videos) support and randomization features for local trailer/backdrops if more than one is available\n- feat: add option to include watched content in the random selection",
"targetAbi": "10.11.0.0",
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.6.2.3/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "c7ff2d783889c25b5a53783bfbe30b11",
"timestamp": "2026-02-15T00:38:07Z"
}, },
{ {
"version": "1.6.1.32", "version": "1.6.1.32",