Compare commits

...

10 Commits

Author SHA1 Message Date
CodeDevMLH
4e0c74614a Update manifest.json for release v1.6.0.1 [skip ci] 2026-02-10 21:27:25 +00:00
CodeDevMLH
b61bf92437 Bump version to 1.6.0.1 in project files and manifest
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 53s
2026-02-10 22:26:32 +01:00
CodeDevMLH
dfbd6ce964 Enable autoplay for video playback in SlideUtils 2026-02-10 22:26:28 +01:00
CodeDevMLH
f1cbcad177 Update manifest.json for release v1.6.0.0 [skip ci] 2026-02-10 21:18:26 +00:00
CodeDevMLH
feedd5d95f Bump version to 1.6.0.0
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 50s
2026-02-10 22:17:36 +01:00
CodeDevMLH
87d82cca15 Enhance trailer handling: support object format for trailer URLs and add widget referrer for YouTube embeds 2026-02-10 22:17:24 +01:00
CodeDevMLH
a70746e095 Update manifest.json for release v1.5.1.3 [skip ci] 2026-02-10 20:12:59 +00:00
CodeDevMLH
f32283e0bf Bump version to 1.5.1.3 and update changelog for release
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 54s
2026-02-10 21:12:05 +01:00
CodeDevMLH
8f3985f307 Update manifest.json for release v1.5.1.2 [skip ci] 2026-02-10 17:39:23 +00:00
CodeDevMLH
0b2817ecff Bump version to 1.5.1.2 and update changelog for release
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 52s
2026-02-10 18:38:31 +01:00
5 changed files with 59 additions and 24 deletions

View File

@@ -182,8 +182,7 @@
</div> </div>
<div class="selectContainer"> <div class="selectContainer">
<label class="selectLabel" for="PreferredVideoQuality">Preferred YouTube Quality</label> <label class="selectLabel" for="PreferredVideoQuality">Preferred YouTube Quality</label>
<select is="emby-select" id="PreferredVideoQuality" name="PreferredVideoQuality" <select is="emby-select" id="PreferredVideoQuality" name="PreferredVideoQuality" class="selectLayout emby-select-withcolor emby-select">
class="emby-select-withcolor emby-select">
<option value="Auto">Auto (Smart)</option> <option value="Auto">Auto (Smart)</option>
<option value="Maximum">Maximum (4K+)</option> <option value="Maximum">Maximum (4K+)</option>
<option value="1080p">1080p</option> <option value="1080p">1080p</option>
@@ -285,7 +284,7 @@
<h2 class="sectionTitle">Content Sorting</h2> <h2 class="sectionTitle">Content Sorting</h2>
<div class="selectContainer"> <div class="selectContainer">
<label class="selectLabel" for="SortBy">Sort By</label> <label class="selectLabel" for="SortBy">Sort By</label>
<select is="emby-select" id="SortBy" name="SortBy" class="emby-select-withcolor emby-select"> <select is="emby-select" id="SortBy" name="SortBy" class="selectLayout emby-select-withcolor emby-select">
<option value="Random">Random</option> <option value="Random">Random</option>
<option value="Original">Original (Custom List Order)</option> <option value="Original">Original (Custom List Order)</option>
<option value="PremiereDate">Premiere Date</option> <option value="PremiereDate">Premiere Date</option>
@@ -299,7 +298,7 @@
</div> </div>
<div class="selectContainer"> <div class="selectContainer">
<label class="selectLabel" for="SortOrder">Sort Order</label> <label class="selectLabel" for="SortOrder">Sort Order</label>
<select is="emby-select" id="SortOrder" name="SortOrder" class="emby-select-withcolor emby-select"> <select is="emby-select" id="SortOrder" name="SortOrder" class="selectLayout emby-select-withcolor emby-select">
<option value="Ascending">Ascending</option> <option value="Ascending">Ascending</option>
<option value="Descending">Descending</option> <option value="Descending">Descending</option>
</select> </select>

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.5.1.1</Version> <Version>1.6.0.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

@@ -164,7 +164,7 @@
.homeSectionsContainer { .homeSectionsContainer {
position: relative; position: relative;
margin-top: 65vh; top: 65vh;
z-index: 6; z-index: 6;
} }

View File

@@ -742,7 +742,9 @@ const SlideUtils = {
iv_load_policy: 3, iv_load_policy: 3,
rel: 0, rel: 0,
playsinline: 1, playsinline: 1,
origin: window.location.origin origin: window.location.origin,
widget_referrer: window.location.href,
enablejsapi: 1
} }
}); });
}); });
@@ -1338,7 +1340,7 @@ const ApiUtils = {
/** /**
* Fetches the first local trailer for an item * Fetches the first local trailer for an item
* @param {string} itemId - Item ID * @param {string} itemId - Item ID
* @returns {Promise<string|null>} Stream URL or null * @returns {Promise<Object|null>} Trailer data object {id, url} or null
*/ */
async fetchLocalTrailer(itemId) { async fetchLocalTrailer(itemId) {
try { try {
@@ -1358,8 +1360,11 @@ const ApiUtils = {
const trailer = trailers[0]; const trailer = trailers[0];
const mediaSourceId = trailer.MediaSources && trailer.MediaSources[0] ? trailer.MediaSources[0].Id : trailer.Id; const mediaSourceId = trailer.MediaSources && trailer.MediaSources[0] ? trailer.MediaSources[0].Id : trailer.Id;
// Construct stream URL // Return object with ID and URL
return `${STATE.jellyfinData.serverAddress}/Videos/${trailer.Id}/stream.mp4?Static=true&mediaSourceId=${mediaSourceId}&api_key=${STATE.jellyfinData.accessToken}`; return {
id: trailer.Id,
url: `${STATE.jellyfinData.serverAddress}/Videos/${trailer.Id}/stream.mp4?Static=true&mediaSourceId=${mediaSourceId}&api_key=${STATE.jellyfinData.accessToken}`
};
} }
return null; return null;
} catch (error) { } catch (error) {
@@ -1597,12 +1602,17 @@ const SlideCreator = {
let videoId = null; let videoId = null;
try { try {
const urlObj = new URL(trailerUrl); let urlToCheck = trailerUrl;
if (urlObj.hostname.includes('youtube.com') || urlObj.hostname.includes('youtu.be')) { if (typeof trailerUrl === 'object' && trailerUrl.url) {
urlToCheck = trailerUrl.url;
}
const urlObjChecked = new URL(urlToCheck);
if (urlObjChecked.hostname.includes('youtube.com') || urlObjChecked.hostname.includes('youtu.be')) {
isYoutube = true; isYoutube = true;
videoId = urlObj.searchParams.get('v'); videoId = urlObjChecked.searchParams.get('v');
if (!videoId && urlObj.hostname.includes('youtu.be')) { if (!videoId && urlObjChecked.hostname.includes('youtu.be')) {
videoId = urlObj.pathname.substring(1); videoId = urlObjChecked.pathname.substring(1);
} }
} }
} catch (e) { } catch (e) {
@@ -1633,7 +1643,9 @@ const SlideCreator = {
rel: 0, rel: 0,
loop: 0, loop: 0,
playsinline: 1, playsinline: 1,
origin: window.location.origin origin: window.location.origin,
widget_referrer: window.location.href,
enablejsapi: 1
}; };
// Determine video quality // Determine video quality
@@ -1746,7 +1758,8 @@ const SlideCreator = {
const videoAttributes = { const videoAttributes = {
className: "backdrop video-backdrop", className: "backdrop video-backdrop",
src: trailerUrl, className: "backdrop video-backdrop",
src: (typeof trailerUrl === 'object' ? trailerUrl.url : trailerUrl),
autoplay: false, autoplay: false,
preload: "auto", preload: "auto",
loop: false, loop: false,
@@ -2037,11 +2050,20 @@ const SlideCreator = {
/** /**
* Creates a trailer button * Creates a trailer button
* @param {string} url - Trailer URL * @param {string|Object} trailerInfo - Trailer URL string or object {id, url}
* @returns {HTMLElement} Trailer button element * @returns {HTMLElement} Trailer button element
*/ */
createTrailerButton(url) { createTrailerButton(trailerInfo) {
const trailerText = LocalizationUtils.getLocalizedString('Trailer', 'Trailer'); const trailerText = LocalizationUtils.getLocalizedString('Trailer', 'Trailer');
let url = trailerInfo;
let localTrailerId = null;
if (typeof trailerInfo === 'object' && trailerInfo !== null) {
url = trailerInfo.url;
localTrailerId = trailerInfo.id;
}
return SlideUtils.createElement("button", { return SlideUtils.createElement("button", {
className: "detailButton trailer-button", className: "detailButton trailer-button",
innerHTML: `<span class="material-icons">movie</span> <span class="trailer-text">${trailerText}</span>`, innerHTML: `<span class="material-icons">movie</span> <span class="trailer-text">${trailerText}</span>`,
@@ -2049,7 +2071,13 @@ const SlideCreator = {
onclick: (e) => { onclick: (e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
if (localTrailerId) {
// Play local trailer using native player
ApiUtils.playItem(localTrailerId);
} else {
SlideUtils.openVideoModal(url); SlideUtils.openVideoModal(url);
}
}, },
}); });
}, },

View File

@@ -9,12 +9,20 @@
"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.5.1.1", "version": "1.6.0.1",
"changelog": "- add local trailer support on trailer button\nfix: iOS/MacOS playback issue?",
"targetAbi": "10.11.0.0",
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.6.0.1/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "ec876a05d68fe2720781c483ebcd1e9e",
"timestamp": "2026-02-10T21:27:24Z"
},
{
"version": "1.5.1.3",
"changelog": "- fix: iOS/MacOS playback issue?", "changelog": "- fix: iOS/MacOS playback issue?",
"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.5.1.1/Jellyfin.Plugin.MediaBarEnhanced.zip", "sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.5.1.3/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "7e18f03c28730c266e6acebebb2efffa", "checksum": "9d9dbed453673d4b78acf2adaaaee126",
"timestamp": "2026-02-10T16:58:48Z" "timestamp": "2026-02-10T20:12:59Z"
}, },
{ {
"version": "1.5.0.28", "version": "1.5.0.28",