Compare commits

...

9 Commits

Author SHA1 Message Date
CodeDevMLH
6c131aef58 Update manifest.json for release v1.0.0.3 [skip ci] 2026-01-06 21:33:22 +00:00
CodeDevMLH
0747f63d11 renamed slidshowpure to mediaBarEnhanced
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 52s
2026-01-06 22:32:31 +01:00
CodeDevMLH
12f6f23314 Update manifest.json for release v1.0.0.2 [skip ci] 2026-01-06 21:21:38 +00:00
CodeDevMLH
a27488366b fixes
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 54s
2026-01-06 22:20:45 +01:00
CodeDevMLH
dd4c71c3bf Update manifest.json for release v1.0.0.1 [skip ci] 2026-01-06 21:18:34 +00:00
CodeDevMLH
715cd1a663 test
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 58s
2026-01-06 22:17:38 +01:00
CodeDevMLH
9371ed9a33 Add seasonal manifest update step to release automation 2026-01-06 22:16:57 +01:00
CodeDevMLH
c21b2d3ede Update manifest.json for release v1.0.0.1 [skip ci] 2026-01-06 21:09:36 +00:00
CodeDevMLH
8ac0b9c003 add readme
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 51s
2026-01-06 22:08:46 +01:00
10 changed files with 370 additions and 12 deletions

View File

@@ -181,3 +181,78 @@ jobs:
else else
echo "No changes to central manifest." echo "No changes to central manifest."
fi fi
# Update Message in Seasonals Repository
- name: Checkout Seasonal Manifest Repo
uses: actions/checkout@v6
with:
repository: ${{ github.repository_owner }}/jellyfin-plugin-manifest
path: seasonal-manifest
token: ${{ secrets.JELLYFIN_PLUGIN_MANIFEST_UPDATER_PAT }}
- name: Update Central Manifest
shell: bash
run: |
cd seasonal-manifest
# 1. Get info from previous steps
VERSION="${{ env.VERSION }}"
HASH="${{ env.ZIP_HASH }}"
TIME="${{ env.BUILD_TIME }}"
DOWNLOAD_URL="https://git.mahom03-spacecloud.de/${{ github.repository }}/releases/download/v$VERSION/Jellyfin.Plugin.MediaBarEnhanced.zip"
# 2. Get info from env
PLUGIN_GUID="${{ env.PLUGIN_GUID }}"
CHANGELOG="${{ env.CHANGELOG }}"
TARGET_ABI="${{ env.TARGET_ABI }}"
echo "Updating Seasonal Manifest for Plugin GUID: $PLUGIN_GUID"
# 3. Update/Prepend entry in seasonal manifest.json
# Logic:
# - If array is empty or new version != old version: PREPEND new entry
# - If new version == old version: OVERWRITE (update) existing entry (re-release)
jq --arg guid "$PLUGIN_GUID" \
--arg hash "$HASH" \
--arg time "$TIME" \
--arg url "$DOWNLOAD_URL" \
--arg ver "$VERSION" \
--arg changelog "$CHANGELOG" \
--arg abi "$TARGET_ABI" \
'map(if .guid == $guid then
if .versions[0].version != $ver then
# New Version -> Prepend
.versions = [{
"version": $ver,
"changelog": $changelog,
"targetAbi": $abi,
"sourceUrl": $url,
"checksum": $hash,
"timestamp": $time
}] + .versions
else
# Same Version -> Update existing (overwrite top)
.versions[0].changelog = $changelog |
.versions[0].targetAbi = $abi |
.versions[0].sourceUrl = $url |
.versions[0].checksum = $hash |
.versions[0].timestamp = $time
end
else . end)' \
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
- name: Commit and Push Seasonal Manifest
run: |
cd seasonal-manifest
git config user.name "CodeDevMLH"
git config user.email "145071728+CodeDevMLH@users.noreply.github.com"
# Check if there are changes
if [[ -n $(git status -s) ]]; then
git add manifest.json
git commit -m "Auto-Update MediaBar Enhanced to v${{ env.VERSION }}"
git push
else
echo "No changes to seasonal manifest."
fi

View File

@@ -179,3 +179,78 @@ jobs:
else else
echo "No changes to central manifest." echo "No changes to central manifest."
fi fi
# Update Message in Seasonals Repository
- name: Checkout Seasonal Manifest Repo
uses: actions/checkout@v6
with:
repository: ${{ github.repository_owner }}/jellyfin-plugin-manifest
path: seasonal-manifest
token: ${{ secrets.JELLYFIN_PLUGIN_MANIFEST_UPDATER_PAT }}
- name: Update Central Manifest
shell: bash
run: |
cd seasonal-manifest
# 1. Get info from previous steps
VERSION="${{ env.VERSION }}"
HASH="${{ env.ZIP_HASH }}"
TIME="${{ env.BUILD_TIME }}"
DOWNLOAD_URL="https://github.com/$REPO_OWNER/$REPO_NAME/releases/download/v$VERSION/Jellyfin.Plugin.MediaBarEnhanced.zip"
# 2. Get info from env
PLUGIN_GUID="${{ env.PLUGIN_GUID }}"
CHANGELOG="${{ env.CHANGELOG }}"
TARGET_ABI="${{ env.TARGET_ABI }}"
echo "Updating Seasonal Manifest for Plugin GUID: $PLUGIN_GUID"
# 3. Update/Prepend entry in seasonal manifest.json
# Logic:
# - If array is empty or new version != old version: PREPEND new entry
# - If new version == old version: OVERWRITE (update) existing entry (re-release)
jq --arg guid "$PLUGIN_GUID" \
--arg hash "$HASH" \
--arg time "$TIME" \
--arg url "$DOWNLOAD_URL" \
--arg ver "$VERSION" \
--arg changelog "$CHANGELOG" \
--arg abi "$TARGET_ABI" \
'map(if .guid == $guid then
if .versions[0].version != $ver then
# New Version -> Prepend
.versions = [{
"version": $ver,
"changelog": $changelog,
"targetAbi": $abi,
"sourceUrl": $url,
"checksum": $hash,
"timestamp": $time
}] + .versions
else
# Same Version -> Update existing (overwrite top)
.versions[0].changelog = $changelog |
.versions[0].targetAbi = $abi |
.versions[0].sourceUrl = $url |
.versions[0].checksum = $hash |
.versions[0].timestamp = $time
end
else . end)' \
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
- name: Commit and Push Seasonal Manifest
run: |
cd seasonal-manifest
git config user.name "CodeDevMLH"
git config user.email "145071728+CodeDevMLH@users.noreply.github.com"
# Check if there are changes
if [[ -n $(git status -s) ]]; then
git add manifest.json
git commit -m "Auto-Update MediaBar Enhanced to v${{ env.VERSION }}"
git push
else
echo "No changes to seasonal manifest."
fi

View File

@@ -14,7 +14,7 @@
<div class="sectionTitleContainer"> <div class="sectionTitleContainer">
<h2 class="sectionTitle">Media Bar Enhanced</h2> <h2 class="sectionTitle">Media Bar Enhanced</h2>
<a is="emby-linkbutton" class="raised raised-mini emby-button" style="margin-left: 2em;" <a is="emby-linkbutton" class="raised raised-mini emby-button" style="margin-left: 2em;"
target="_blank" href="https://github.com/CodeDevMLH/Jellyfin-Seasonals"> target="_blank" href="https://github.com/CodeDevMLH/jellyfin-plugin-media-bar-enhanced">
<i class="md-icon button-icon button-icon-left secondaryText"></i> <i class="md-icon button-icon button-icon-left secondaryText"></i>
<span>Help</span> <span>Help</span>
</a> </a>

View File

@@ -12,8 +12,8 @@
<!-- <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.0.0.1</Version> <Version>1.0.0.3</Version>
<RepositoryUrl>https://git.mahom03-spacecloud.de/CodeDevMLH/Media-Bar-Plugin</RepositoryUrl> <RepositoryUrl>https://github.com/CodeDevMLH/jellyfin-plugin-media-bar-enhanced</RepositoryUrl>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@@ -18,10 +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/slideshowpure.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/slideshowpure.css\" />"; public const string CssTag = "<link rel=\"stylesheet\" href=\"/MediaBarEnhanced/Resources/mediaBarEnhanced.css\" />";
// private const string ScriptTag = "<script src=\"/MediaBarEnhanced/Resources/media-bar.js\" defer></script>";
// private const string CssTag = "<link rel=\"stylesheet\" href=\"/MediaBarEnhanced/Resources/media-bar.css\">";
public const string ScriptMarker = "</body>"; public const string ScriptMarker = "</body>";
public const string CssMarker = "</head>"; public const string CssMarker = "</head>";

196
README.md
View File

@@ -1 +1,195 @@
# jellyfin-plugin-media-bar-enhanced # Jellyfin Media Bar Enhanced Plugin
Media Bar Enhanced is a plugin for Jellyfin that introduces a customizable and interactive media bar to your dashboard view on Jellyfin web.
This plugin is a fork and enhancement of the original [Media Bar by MakD](https://github.com/MakD/Jellyfin-Media-Bar) media bar, but can be installed as plugin for easier installation and management/configuration.
![logo](https://raw.githubusercontent.com/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/main/logo.png)
---
## Table of Contents
- [Jellyfin Media Bar Enhanced Plugin](#jellyfin-media-bar-enhanced-plugin)
- [Table of Contents](#table-of-contents)
- [Features](#features)
- [New Features \& Enhancements](#new-features--enhancements)
- [Core Features](#core-features)
- [Installation](#installation)
- [Client Compatibility](#client-compatibility)
- [Configuration](#configuration)
- [General Settings](#general-settings)
- [Custom Content](#custom-content)
- [Advanced Settings](#advanced-settings)
- [Build The Plugin By Yourself](#build-the-plugin-by-yourself)
- [Troubleshooting](#troubleshooting)
- [Effects Not Showing](#effects-not-showing)
- [Docker Permission Issues](#docker-permission-issues)
- [Contributing](#contributing)
---
## Features
This plugin builds upon the original Media Bar with new capabilities and improvements:
### New Features & Enhancements
* **Video Backdrop Support**: Play trailer as background video directly in the slideshow
* **SponsorBlock Integration**: Automatically skip intro/outro segments in YouTube trailers
* **Enhanced Controls**:
* Keyboard shortcuts (Arrow keys to navigate, Space to pause, M to mute)
* Option to always show navigation arrows
* Standalone "Trailer" button (opens in a modal) if video backdrops are disabled
* **Smarter Playback**:
* Option to wait for the trailer to end before advancing the slide.
* Mute/Unmute controls
* **Customization**:
* **Custom Media IDs**: Manually specify which items (Movies, Series, Collections/Boxsets) to display. Easily configurable via the plugin settings
* **Seasonal Content Mode**: Define date-based lists for holidays and seasons (e.g., Halloween, Christmas)
* Pagination dots turn into a counter (e.g., 1/20) if the limit is exceeded
* Option to disable the loading screen
### Core Features
* **Immersive Slideshow**: Rotates through your media library
* **Metadata Display**: Shows title, rating, year, and plot summary
* **Direct Play**: Click "Play" to start watching immediately
* **Details View**: Click "Info" to jump to the item's detail page
* **Add To Favorites**: Click the heart to add the item to your favorites
## Installation
This plugin is based on Jellyfin Version `10.11.x`
1. Open your **Jellyfin Dashboard**.
2. Navigate to **Plugins** > **Repositories**.
3. Click the **+** button to add a new repository.
4. Enter a name for the repo and paste the following URL:
```
https://raw.githubusercontent.com/CodeDevMLH/jellyfin-plugin-manifest/refs/heads/main/manifest.json
```
5. Click **Save**.
6. Go to the **Catalog** tab.
7. Find **Media Bar Enhanced** (Under **General**) and install it.
8. **Restart your Jellyfin server.**
9. **Refresh your browser** (Ctrl+F5) to load the new interface elements.
## Client Compatibility
Because this plugin relies on injecting JavaScript and CSS into the web interface, it works best on clients that use the web wrapper.
| Client Platform | Status | Notes |
| :--- | :---: | :--- |
| **Web Browsers** (Chrome, Firefox, Edge, etc.) | ✅ | Fully supported. |
| **Jellyfin Media Player** (Windows/Linux/macOS) | ✅ | Fully supported. |
| **Android App** | ✅ | Works (Web wrapper). |
| **iOS App** | ✅ | Works (Web wrapper). |
| **Android TV / Fire TV** | ❌ | **Not supported** (Native UI). |
| **Roku** | ❌ | **Not supported** (Native UI). |
| **Swiftfin** | ❌ | **Not supported** (Native UI). |
## Configuration
Configure the plugin via **Dashboard** > **Plugins** > **Media Bar Enhanced**.
> [!NOTE]
> You must refresh your browser window (F5 or Ctrl+R) after saving changes for them to take effect.
### General Settings
* **Enable Media Bar Enhanced Plugin**: Master switch to toggle the plugin.
* **Enable Video Backdrops**: Dynamically plays trailers in the background.
* **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).
* **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)
### Custom Content
Define exactly what shows up in your bar.
* **Enable Custom Media IDs**: Restrict the slideshow to a specific list of IDs.
* **Enable Seasonal Content Mode**: Advanced date-based scheduling.
* Format: `DD.MM-DD.MM | Name | ID1, ID2, ID3`
* Example: `20.10-31.10 | Halloween | <ID_OF_HALLOWEEN_COLLECTION>`
* If the current date matches a range, those IDs are used. Otherwise, it defaults to standard behavior or the Custom Media IDs list.
**How to get IDs:**
Check the URL of an item in the web interface:
`.../web/#/details?id=YOUR_ITEM_ID_HERE&...`
### Advanced Settings
* **Slide Animations**: Enable/disable the "Zoom In" effect.
* **Use SponsorBlock**: Skips non-content segments in YouTube trailers (if the data exists).
* **Start Muted**: Videos start without sound (user can unmute).
* **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.
* **Always Show Arrows**: Keeps navigation arrows visible instead of hiding them on mouse leave.
* **Enable Keyboard Controls**:
* `Left`/`Right`: Change slide
* `Space`: Pause/Play slideshow
* `M`: Mute/Unmute video
* **Content Limits**: Fine-tune performance by limiting the number of items (Movies, TV Shows) fetched.
## Build The Plugin By Yourself
If you want to build the plugin yourself:
1. Clone the repository.
2. Ensure you have the .NET SDK installed (NET 8 or 9 depending on your Jellyfin version).
3. Run the build command:
```powershell
dotnet build Jellyfin.Plugin.MediaBarEnhanced/Jellyfin.Plugin.MediaBarEnhanced.csproj --configuration Release --output bin/Publish
```
4. The compiled DLL and resources will be in bin/Publish.
## Troubleshooting
### Effects Not Showing
1. **Verify plugin installation**:
- Check that the plugin appears in the jellyfin admin panel
- Ensure that the plugin is enabled and active
2. **Clear browser cache**:
- Force refresh browser (Ctrl+F5)
- Clear jellyfin web client cache (--> mostly you have to clear the whole browser cache)
### Docker Permission Issues
If you encounter the message `Access was denied when attempting to inject script into index.html. Automatic direct injection failed. Automatic direct insertion failed. The system will now attempt to use the File Transformation plugin.` in the log or similar permission errors in Docker:
**Option 1: Use File Transformation Plugin (Recommended)**
Media Bar Enhanced now automatically detects and uses the [File Transformation](https://github.com/IAmParadox27/jellyfin-plugin-file-transformation) plugin (v2.5.0.0+) if it's installed. This eliminates permission issues by transforming content at runtime without modifying files on disk.
**Installation Steps:**
1. Install the File Transformation plugin from the Jellyfin plugin catalog
2. Restart Jellyfin
3. Media Bar Enhanced will automatically detect and use it (no configuration needed)
4. Check logs to confirm: Look for "Successfully registered transformation with File Transformation plugin"
**Benefits:**
- No file permission issues in Docker environments
- Works with read-only web directories
- Survives Jellyfin updates without re-injection
- No manual file modifications required
**Option 2: Fix File Permissions**
```bash
# Find the actual index.html location
docker exec -it jellyfin find / -name index.html
# Fix ownership (replace 'jellyfin' with your container name and adjust user:group if needed)
docker exec -it --user root jellyfin chown jellyfin:jellyfin /jellyfin/jellyfin-web/index.html
# Restart container
docker restart jellyfin
```
**Option 3: Manual Volume Mapping**
```bash
# Extract index.html from container
docker cp jellyfin:/jellyfin/jellyfin-web/index.html /path/to/jellyfin/config/index.html
# Add to docker-compose.yml volumes section:
volumes:
- /path/to/jellyfin/config/index.html:/jellyfin/jellyfin-web/index.html
```
## Contributing
Feel free to contribute to this project by creating pull requests or reporting issues.

View File

@@ -8,13 +8,29 @@
"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.0.0.3",
"changelog": "fixes",
"targetAbi": "10.11.0.0",
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.0.0.3/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "d22b9b355892db2da04a1620bf7ee64d",
"timestamp": "2026-01-06T21:33:22Z"
},
{
"version": "1.0.0.2",
"changelog": "fixes",
"targetAbi": "10.11.0.0",
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.0.0.2/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "1041b403ec0193c2172a6fe15501afd3",
"timestamp": "2026-01-06T21:21:37Z"
},
{ {
"version": "1.0.0.1", "version": "1.0.0.1",
"changelog": "Initial release", "changelog": "fixes",
"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.0.0.1/Jellyfin.Plugin.MediaBarEnhanced.zip", "sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.0.0.1/Jellyfin.Plugin.MediaBarEnhanced.zip",
"checksum": "da9766deb7b81b2b41000ac139fa4d5b", "checksum": "f4e6194a9cc72fdda7436161c73832de",
"timestamp": "2026-01-06T19:05:24Z" "timestamp": "2026-01-06T21:18:33Z"
}, },
{ {
"version": "1.0.0.0", "version": "1.0.0.0",