Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cfebccc289 | ||
|
|
2613fd7acf | ||
|
|
bb10b9c15e | ||
|
|
a9ad8d65e4 | ||
|
|
e7232da38b | ||
|
|
53bd1d23c7 | ||
|
|
5643ebfd28 | ||
|
|
bed2fbaa76 | ||
|
|
05f64bc3d7 | ||
|
|
277433581c | ||
|
|
44f0b1cb38 | ||
|
|
d31dcbabdc | ||
|
|
4ed6509505 | ||
|
|
6427b8422a | ||
|
|
ebfbe1d563 | ||
|
|
67e5d8e4d2 | ||
|
|
d68ba7e846 | ||
|
|
0444cf333d | ||
|
|
10279e97d9 | ||
|
|
f6ccd0ea5f | ||
|
|
47827df047 | ||
|
|
7fd781c9d0 | ||
|
|
6faa8f1a4c | ||
|
|
3e05ff1dc9 | ||
|
|
fa06179cd3 | ||
|
|
d8327fc5c9 | ||
|
|
9ffe03f0df | ||
|
|
37e99d7fed |
42
.github/workflows/release_automation.yml
vendored
42
.github/workflows/release_automation.yml
vendored
@@ -24,6 +24,8 @@ jobs:
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v5
|
||||
@@ -94,16 +96,52 @@ jobs:
|
||||
commit_message: "Update manifest.json for release v${{ env.VERSION }} [skip ci]"
|
||||
file_pattern: manifest.json
|
||||
|
||||
- name: Generate Commit Log
|
||||
if: success()
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Generating commit log since last tag..."
|
||||
|
||||
# Get the previous tag
|
||||
PREV_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
||||
|
||||
if [ -z "$PREV_TAG" ]; then
|
||||
echo "No previous tag found. Getting all commits."
|
||||
start_range=""
|
||||
else
|
||||
echo "Previous tag: $PREV_TAG"
|
||||
start_range="$PREV_TAG.."
|
||||
fi
|
||||
|
||||
echo "### What's Changed" > commit_log.md
|
||||
echo "" >> commit_log.md
|
||||
git log --pretty=format:"- %s (%h) by @%an" $start_range >> commit_log.md
|
||||
|
||||
# Combine Changelog from manifest (if exists) and commit log
|
||||
if [ -n "${{ env.CHANGELOG }}" ]; then
|
||||
echo "${{ env.CHANGELOG }}" > release_body.txt
|
||||
echo "" >> release_body.txt
|
||||
echo "" >> release_body.txt
|
||||
cat commit_log.md >> release_body.txt
|
||||
else
|
||||
cat commit_log.md > release_body.txt
|
||||
fi
|
||||
|
||||
# Debug output
|
||||
cat release_body.txt
|
||||
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: "v${{ env.VERSION }}"
|
||||
name: "v${{ env.VERSION }}"
|
||||
body: ${{ env.CHANGELOG }}
|
||||
# body: ${{ env.CHANGELOG }}
|
||||
files: ${{ env.ZIP_PATH }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
generate_release_notes: true
|
||||
generate_release_notes: false
|
||||
body_path: release_body.txt
|
||||
|
||||
|
||||
# Update Message in Remote Repository
|
||||
- name: Checkout Central Manifest Repo
|
||||
|
||||
@@ -31,6 +31,7 @@ namespace Jellyfin.Plugin.MediaBarEnhanced.Configuration
|
||||
public bool AlwaysShowArrows { get; set; } = false;
|
||||
public string CustomMediaIds { get; set; } = "";
|
||||
public bool EnableCustomMediaIds { get; set; } = true;
|
||||
public string PreferredVideoQuality { get; set; } = "Auto";
|
||||
public bool EnableSeasonalContent { get; set; } = false;
|
||||
public bool IsEnabled { get; set; } = true;
|
||||
}
|
||||
|
||||
@@ -156,6 +156,18 @@
|
||||
</label>
|
||||
<div class="fieldDescription">Skip intro/outro segments in YouTube trailers.</div>
|
||||
</div>
|
||||
<div class="selectContainer">
|
||||
<label class="selectLabel" for="PreferredVideoQuality">Preferred YouTube Quality</label>
|
||||
<select is="emby-select" id="PreferredVideoQuality" name="PreferredVideoQuality"
|
||||
class="emby-select-withcolor emby-select">
|
||||
<option value="Auto">Auto (Smart)</option>
|
||||
<option value="Maximum">Maximum (4K+)</option>
|
||||
<option value="1080p">1080p</option>
|
||||
<option value="720p">720p</option>
|
||||
</select>
|
||||
<div class="fieldDescription">"Auto" selects Maximum if screen width > 1920px, otherwise
|
||||
1080p.</div>
|
||||
</div>
|
||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||
<label>
|
||||
<input is="emby-checkbox" type="checkbox" id="StartMuted" name="StartMuted" />
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<!-- <TreatWarningsAsErrors>false</TreatWarningsAsErrors> -->
|
||||
<Title>Jellyfin Media Bar Enhanced Plugin</Title>
|
||||
<Authors>CodeDevMLH</Authors>
|
||||
<Version>1.1.2.0</Version>
|
||||
<Version>1.2.3.5</Version>
|
||||
<RepositoryUrl>https://github.com/CodeDevMLH/jellyfin-plugin-media-bar-enhanced</RepositoryUrl>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Jellyfin Slideshow by M0RPH3US v3.0.6
|
||||
* Jellyfin Slideshow by M0RPH3US v3.0.8
|
||||
* Modified by CodeDevMLH v1.1.0.0
|
||||
*
|
||||
* New features:
|
||||
@@ -41,11 +41,11 @@
|
||||
|
||||
@keyframes kenBurnsZoomIn {
|
||||
from {
|
||||
transform: scale(1);
|
||||
transform: scale3d(1, 1, 0);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: scale(1.1);
|
||||
transform: scale3d(1.1, 1.1, 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,6 +128,10 @@
|
||||
transition: width 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.layout-mobile .splashLogo {
|
||||
height: 12%;
|
||||
}
|
||||
|
||||
.backdrop.low-quality {
|
||||
filter: blur(0.5px);
|
||||
transform: scale(1.01);
|
||||
@@ -166,6 +170,12 @@
|
||||
height: 90%;
|
||||
overflow: hidden;
|
||||
margin: 0 auto;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
#slides-container[style*="display: none"],
|
||||
#slides-container[style*="visibility: hidden"] {
|
||||
pointer-events: none !important;
|
||||
}
|
||||
|
||||
.arrow {
|
||||
@@ -780,6 +790,41 @@
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
@media (max-width: 400px) {
|
||||
.button-container {
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.play-button,
|
||||
.trailer-button {
|
||||
padding: 8px 14px;
|
||||
}
|
||||
|
||||
.misc-info {
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
gap: 0px 10px;
|
||||
}
|
||||
|
||||
.runTime {
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.misc-info .separator-icon:last-of-type {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.genre {
|
||||
top: calc(50% + 16vh);
|
||||
}
|
||||
|
||||
.button-container {
|
||||
top: calc(50% + 27vh);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*Landscape Mode Phones*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Jellyfin Slideshow by M0RPH3US v3.0.6
|
||||
* Jellyfin Slideshow by M0RPH3US v3.0.8
|
||||
* Modified by CodeDevMLH v1.1.0.0
|
||||
*
|
||||
* New features:
|
||||
@@ -42,6 +42,7 @@ const CONFIG = {
|
||||
fullWidthVideo: true,
|
||||
enableMobileVideo: false,
|
||||
showTrailerButton: true,
|
||||
preferredVideoQuality: "Auto",
|
||||
enableKeyboardControls: true,
|
||||
alwaysShowArrows: false,
|
||||
enableCustomMediaIds: true,
|
||||
@@ -252,31 +253,53 @@ const initLoadingScreen = () => {
|
||||
|
||||
const checkInterval = setInterval(() => {
|
||||
const loginFormLoaded = document.querySelector(".manualLoginForm");
|
||||
const homePageLoaded =
|
||||
document.querySelector(".homeSectionsContainer") &&
|
||||
document.querySelector("#slides-container");
|
||||
const activeTab = document.querySelector(".pageTabContent.is-active");
|
||||
|
||||
if (loginFormLoaded || homePageLoaded) {
|
||||
clearInterval(progressInterval);
|
||||
clearInterval(checkInterval);
|
||||
if (loginFormLoaded) {
|
||||
finishLoading();
|
||||
return;
|
||||
}
|
||||
|
||||
progressBar.style.transition = "width 300ms ease-in-out";
|
||||
progressBar.style.width = "100%";
|
||||
unfilledBar.style.width = "0%";
|
||||
if (activeTab) {
|
||||
const tabIndex = activeTab.getAttribute("data-index");
|
||||
|
||||
progressBar.addEventListener('transitionend', () => {
|
||||
requestAnimationFrame(() => {
|
||||
const loader = document.querySelector(".bar-loading");
|
||||
if (loader) {
|
||||
loader.style.opacity = '0';
|
||||
setTimeout(() => {
|
||||
loader.remove();
|
||||
}, 300);
|
||||
}
|
||||
});
|
||||
})
|
||||
if (tabIndex === "0") {
|
||||
const homeSections = document.querySelector(".homeSectionsContainer");
|
||||
const slidesContainer = document.querySelector("#slides-container");
|
||||
|
||||
if (homeSections && slidesContainer) {
|
||||
finishLoading();
|
||||
}
|
||||
} else {
|
||||
if (
|
||||
activeTab.children.length > 0 ||
|
||||
activeTab.innerText.trim().length > 0
|
||||
) {
|
||||
finishLoading();
|
||||
}
|
||||
}
|
||||
}
|
||||
}, CONFIG.loadingCheckInterval);
|
||||
|
||||
const finishLoading = () => {
|
||||
clearInterval(progressInterval);
|
||||
clearInterval(checkInterval);
|
||||
progressBar.style.transition = "width 300ms ease-in-out";
|
||||
progressBar.style.width = "100%";
|
||||
unfilledBar.style.width = "0%";
|
||||
|
||||
progressBar.addEventListener("transitionend", () => {
|
||||
requestAnimationFrame(() => {
|
||||
const loader = document.querySelector(".bar-loading");
|
||||
if (loader) {
|
||||
loader.style.opacity = "0";
|
||||
setTimeout(() => {
|
||||
loader.remove();
|
||||
}, 300);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1252,9 +1275,12 @@ const VisibilityObserver = {
|
||||
const isVisible =
|
||||
(window.location.hash === "#/home.html" ||
|
||||
window.location.hash === "#/home") &&
|
||||
activeTab &&
|
||||
activeTab.getAttribute("data-index") === "0";
|
||||
|
||||
container.style.display = isVisible ? "block" : "none";
|
||||
container.style.visibility = isVisible ? "visible" : "hidden";
|
||||
container.style.pointerEvents = isVisible ? "auto" : "none";
|
||||
|
||||
if (isVisible) {
|
||||
if (STATE.slideshow.slideInterval && !STATE.slideshow.isPaused) {
|
||||
@@ -1273,11 +1299,11 @@ const VisibilityObserver = {
|
||||
* Initializes visibility observer
|
||||
*/
|
||||
init() {
|
||||
const observer = new MutationObserver(this.updateVisibility);
|
||||
const observer = new MutationObserver(() => this.updateVisibility());
|
||||
observer.observe(document.body, { childList: true, subtree: true });
|
||||
|
||||
document.body.addEventListener("click", this.updateVisibility);
|
||||
window.addEventListener("hashchange", this.updateVisibility);
|
||||
document.body.addEventListener("click", () => this.updateVisibility());
|
||||
window.addEventListener("hashchange", () => this.updateVisibility());
|
||||
|
||||
this.updateVisibility();
|
||||
},
|
||||
@@ -1417,6 +1443,21 @@ const SlideCreator = {
|
||||
loop: 0
|
||||
};
|
||||
|
||||
// Determine video quality
|
||||
let quality = 'hd1080';
|
||||
if (CONFIG.preferredVideoQuality === 'Maximum') {
|
||||
quality = 'highres';
|
||||
} else if (CONFIG.preferredVideoQuality === '720p') {
|
||||
quality = 'hd720';
|
||||
} else if (CONFIG.preferredVideoQuality === '1080p') {
|
||||
quality = 'hd1080';
|
||||
} else { // Auto or fallback
|
||||
// If screen is wider than 1920, prefer highres, otherwise 1080p
|
||||
quality = window.screen.width > 1920 ? 'highres' : 'hd1080';
|
||||
}
|
||||
|
||||
playerVars.suggestedQuality = quality;
|
||||
|
||||
// Apply SponsorBlock start/end times
|
||||
if (segments.intro) {
|
||||
playerVars.start = Math.ceil(segments.intro[1]);
|
||||
@@ -1446,6 +1487,10 @@ const SlideCreator = {
|
||||
event.target.setVolume(40);
|
||||
}
|
||||
|
||||
if (typeof event.target.setPlaybackQuality === 'function') {
|
||||
event.target.setPlaybackQuality(quality);
|
||||
}
|
||||
|
||||
// Only play if this is the active slide
|
||||
const slide = document.querySelector(`.slide[data-item-id="${itemId}"]`);
|
||||
if (slide && slide.classList.contains('active')) {
|
||||
@@ -1494,6 +1539,7 @@ const SlideCreator = {
|
||||
className: "backdrop video-backdrop",
|
||||
src: trailerUrl,
|
||||
autoplay: false,
|
||||
preload: "auto",
|
||||
loop: false,
|
||||
style: "object-fit: cover; width: 100%; height: 100%; pointer-events: none;"
|
||||
};
|
||||
|
||||
@@ -27,7 +27,8 @@ Setzt deine Commits neu auf die Spitze eines anderen Branches. Die Commit-IDs we
|
||||
|
||||
```bash
|
||||
git checkout dev
|
||||
git rebase main
|
||||
git fetch origin
|
||||
git rebase origin/main
|
||||
```
|
||||
|
||||
| Details | |
|
||||
|
||||
@@ -2,12 +2,44 @@
|
||||
{
|
||||
"guid": "d7e11d57-819b-4bdd-a88d-53c5f5560225",
|
||||
"name": "Media Bar Enhanced",
|
||||
"description": "A jellyfin plugin to display a media bar (featured content) for jellyfin web.",
|
||||
"overview": "Media Bar for Jellyfin",
|
||||
"description": "A feature-rich fork of the original Media Bar script by MakD that brings your home screen to life.\n\n-> 100% Configurable via Web UI: Manage all features, lists, and settings effortlessly through the plugin configuration page.\n\nKey Highlights:\n- Cinematic Video Backdrops: Supports local & YouTube trailers (incl. SponsorBlock)\n- Custom Content: Curate your slideshow with specific Collections, Playlists, or seasonal events\n\nAdditional Features:\n- Full-width immersive mode\n- Smart resolution handling (up to 4K)\n- Full keyboard navigation & playback control\n- Wait-for-trailer options\n- Customizable pagination & animations\n\nIf you do not have write permissions to the web folder, please also install the file-transformation plugin.",
|
||||
"overview": "Transforms your Jellyfin home screen with an immersive, fully configurable media slideshow featuring video backdrops.",
|
||||
"owner": "CodeDevMLH",
|
||||
"category": "General",
|
||||
"imageUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/raw/branch/main/logo.png",
|
||||
"versions": [
|
||||
{
|
||||
"version": "1.2.3.5",
|
||||
"changelog": "- Fixes the issue where buttons were cut off on smaller screens such as on S24/S25.",
|
||||
"targetAbi": "10.11.0.0",
|
||||
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.2.3.5/Jellyfin.Plugin.MediaBarEnhanced.zip",
|
||||
"checksum": "b5efea79ec465522dad31e4ee5f1710c",
|
||||
"timestamp": "2026-01-28T20:21:20Z"
|
||||
},
|
||||
{
|
||||
"version": "1.2.2.0",
|
||||
"changelog": "- Fixes issues with persistent slides-container visibility",
|
||||
"targetAbi": "10.11.0.0",
|
||||
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.2.2.0/Jellyfin.Plugin.MediaBarEnhanced.zip",
|
||||
"checksum": "3362f93815845c4e85b66b31bcd0f52c",
|
||||
"timestamp": "2026-01-24T22:53:55Z"
|
||||
},
|
||||
{
|
||||
"version": "1.2.1.0",
|
||||
"changelog": "- Update mediaBarEnhanced.js and mediaBarEnhanced.css with version 3.0.8 from original repo",
|
||||
"targetAbi": "10.11.0.0",
|
||||
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.2.1.0/Jellyfin.Plugin.MediaBarEnhanced.zip",
|
||||
"checksum": "70defc1fb29a17ff4c9362bf7bdc53b5",
|
||||
"timestamp": "2026-01-22T23:50:56Z"
|
||||
},
|
||||
{
|
||||
"version": "1.2.0.0",
|
||||
"changelog": "- Add video quality preference setting (Auto / 1080p / Highres)\n- Set preferred video quality on YouTube player based on setting",
|
||||
"targetAbi": "10.11.0.0",
|
||||
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.2.0.0/Jellyfin.Plugin.MediaBarEnhanced.zip",
|
||||
"checksum": "0b6379f68990026240d97fe8f77fbef1",
|
||||
"timestamp": "2026-01-08T23:30:58Z"
|
||||
},
|
||||
{
|
||||
"version": "1.1.2.0",
|
||||
"changelog": "- Add method to resume video playback when slideshow is active",
|
||||
|
||||
Reference in New Issue
Block a user