Compare commits

...

3 Commits

Author SHA1 Message Date
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
3 changed files with 52 additions and 16 deletions

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.3</Version> <Version>1.6.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

@@ -737,12 +737,14 @@ const SlideUtils = {
width: '100%', width: '100%',
videoId: videoId, videoId: videoId,
playerVars: { playerVars: {
autoplay: 1, autoplay: 0,
controls: 1, controls: 1,
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();
SlideUtils.openVideoModal(url);
if (localTrailerId) {
// Play local trailer using native player
ApiUtils.playItem(localTrailerId);
} else {
SlideUtils.openVideoModal(url);
}
}, },
}); });
}, },

View File

@@ -8,6 +8,14 @@
"category": "General", "category": "General",
"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.0.0",
"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.0/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "d16997010900e2b18c1a8b33d4ecb9be",
"timestamp": "2026-02-10T21:18:25Z"
},
{ {
"version": "1.5.1.3", "version": "1.5.1.3",
"changelog": "- fix: iOS/MacOS playback issue?", "changelog": "- fix: iOS/MacOS playback issue?",