Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3a90605112 | ||
|
|
5772d670ff | ||
|
|
e558594c52 | ||
|
|
343436ac56 | ||
|
|
6075e20a11 | ||
|
|
8b7def809b | ||
|
|
43950eac60 | ||
|
|
c09f265b26 | ||
|
|
379c370b4a | ||
|
|
b567307003 | ||
|
|
ff9ea9eff0 | ||
|
|
9427e3e535 | ||
|
|
19318a916d | ||
|
|
5d85284df8 | ||
|
|
2382f850b6 | ||
|
|
22041293f6 | ||
|
|
5595158f9d | ||
|
|
39f85e0c9b | ||
|
|
18a9980a0a | ||
|
|
deb426833d | ||
|
|
bf4b6da0f0 |
@@ -51,7 +51,31 @@ jobs:
|
|||||||
echo "$CHANGELOG" >> $GITHUB_ENV
|
echo "$CHANGELOG" >> $GITHUB_ENV
|
||||||
echo "EOF" >> $GITHUB_ENV
|
echo "EOF" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Check if Release Already Exists
|
||||||
|
id: check_release
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
REPO_OWNER="${{ github.repository_owner }}"
|
||||||
|
REPO_NAME="${{ github.event.repository.name }}"
|
||||||
|
VERSION="${{ env.VERSION }}"
|
||||||
|
TAG="v$VERSION"
|
||||||
|
SERVER_URL="https://git.mahom03-spacecloud.de"
|
||||||
|
|
||||||
|
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" "$SERVER_URL/api/v1/repos/$REPO_OWNER/$REPO_NAME/releases/tags/$TAG")
|
||||||
|
|
||||||
|
if [ "$HTTP_STATUS" -eq 200 ]; then
|
||||||
|
echo "Release $TAG already exists. Skipping release-related steps."
|
||||||
|
echo "release_exists=true" >> $GITHUB_OUTPUT
|
||||||
|
elif [ "$HTTP_STATUS" -eq 404 ]; then
|
||||||
|
echo "No existing release for $TAG. Continuing."
|
||||||
|
echo "release_exists=false" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "Unexpected response when checking release: $HTTP_STATUS"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Build and Zip
|
- name: Build and Zip
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Inject version from manifest into the build
|
# Inject version from manifest into the build
|
||||||
@@ -71,6 +95,7 @@ jobs:
|
|||||||
echo "ZIP_PATH=bin/Publish/Jellyfin.Plugin.MediaBarEnhanced.zip" >> $GITHUB_ENV
|
echo "ZIP_PATH=bin/Publish/Jellyfin.Plugin.MediaBarEnhanced.zip" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Update manifest.json
|
- name: Update manifest.json
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
REPO_OWNER="${{ github.repository_owner }}"
|
REPO_OWNER="${{ github.repository_owner }}"
|
||||||
@@ -90,12 +115,14 @@ jobs:
|
|||||||
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
|
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
|
||||||
|
|
||||||
- name: Commit manifest.json
|
- name: Commit manifest.json
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
uses: stefanzweifel/git-auto-commit-action@v7
|
uses: stefanzweifel/git-auto-commit-action@v7
|
||||||
with:
|
with:
|
||||||
commit_message: "Update manifest.json for release v${{ env.VERSION }} [skip ci]"
|
commit_message: "Update manifest.json for release v${{ env.VERSION }} [skip ci]"
|
||||||
file_pattern: manifest.json
|
file_pattern: manifest.json
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
uses: akkuman/gitea-release-action@v1
|
uses: akkuman/gitea-release-action@v1
|
||||||
with:
|
with:
|
||||||
server_url: "https://git.mahom03-spacecloud.de"
|
server_url: "https://git.mahom03-spacecloud.de"
|
||||||
@@ -109,6 +136,7 @@ jobs:
|
|||||||
|
|
||||||
# Update Message in Remote Repository
|
# Update Message in Remote Repository
|
||||||
- name: Checkout Central Manifest Repo
|
- name: Checkout Central Manifest Repo
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
repository: ${{ github.repository_owner }}/jellyfin-plugin-manifest
|
repository: ${{ github.repository_owner }}/jellyfin-plugin-manifest
|
||||||
@@ -116,6 +144,7 @@ jobs:
|
|||||||
token: ${{ secrets.JELLYFIN_PLUGIN_MANIFEST_UPDATER_PAT }}
|
token: ${{ secrets.JELLYFIN_PLUGIN_MANIFEST_UPDATER_PAT }}
|
||||||
|
|
||||||
- name: Update Central Manifest
|
- name: Update Central Manifest
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
cd central-manifest
|
cd central-manifest
|
||||||
@@ -171,6 +200,7 @@ jobs:
|
|||||||
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
|
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
|
||||||
|
|
||||||
- name: Commit and Push Central Manifest
|
- name: Commit and Push Central Manifest
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
run: |
|
run: |
|
||||||
cd central-manifest
|
cd central-manifest
|
||||||
git config user.name "CodeDevMLH"
|
git config user.name "CodeDevMLH"
|
||||||
|
|||||||
33
.github/workflows/release_automation.yml
vendored
33
.github/workflows/release_automation.yml
vendored
@@ -52,7 +52,32 @@ jobs:
|
|||||||
echo "$CHANGELOG" >> $GITHUB_ENV
|
echo "$CHANGELOG" >> $GITHUB_ENV
|
||||||
echo "EOF" >> $GITHUB_ENV
|
echo "EOF" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Check if Release Already Exists
|
||||||
|
id: check_release
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
REPO_OWNER="${{ github.repository_owner }}"
|
||||||
|
REPO_NAME="${{ github.event.repository.name }}"
|
||||||
|
VERSION="${{ env.VERSION }}"
|
||||||
|
TAG="v$VERSION"
|
||||||
|
API_URL="https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/releases/tags/$TAG"
|
||||||
|
|
||||||
|
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" "$API_URL")
|
||||||
|
|
||||||
|
if [ "$HTTP_STATUS" -eq 200 ]; then
|
||||||
|
echo "Release $TAG already exists. Skipping release-related steps."
|
||||||
|
echo "release_exists=true" >> $GITHUB_OUTPUT
|
||||||
|
elif [ "$HTTP_STATUS" -eq 404 ]; then
|
||||||
|
echo "No existing release for $TAG. Continuing."
|
||||||
|
echo "release_exists=false" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "Unexpected response when checking release: $HTTP_STATUS"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
- name: Build and Zip
|
- name: Build and Zip
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Inject version from manifest into the build
|
# Inject version from manifest into the build
|
||||||
@@ -72,6 +97,7 @@ jobs:
|
|||||||
echo "ZIP_PATH=bin/Publish/Jellyfin.Plugin.MediaBarEnhanced.zip" >> $GITHUB_ENV
|
echo "ZIP_PATH=bin/Publish/Jellyfin.Plugin.MediaBarEnhanced.zip" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Update manifest.json
|
- name: Update manifest.json
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
REPO_OWNER="${{ github.repository_owner }}"
|
REPO_OWNER="${{ github.repository_owner }}"
|
||||||
@@ -91,13 +117,14 @@ jobs:
|
|||||||
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
|
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
|
||||||
|
|
||||||
- name: Commit manifest.json
|
- name: Commit manifest.json
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
uses: stefanzweifel/git-auto-commit-action@v7
|
uses: stefanzweifel/git-auto-commit-action@v7
|
||||||
with:
|
with:
|
||||||
commit_message: "Update manifest.json for release v${{ env.VERSION }} [skip ci]"
|
commit_message: "Update manifest.json for release v${{ env.VERSION }} [skip ci]"
|
||||||
file_pattern: manifest.json
|
file_pattern: manifest.json
|
||||||
|
|
||||||
- name: Generate Commit Log
|
- name: Generate Commit Log
|
||||||
if: success()
|
if: success() && steps.check_release.outputs.release_exists == 'false'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
echo "Generating commit log since last tag..."
|
echo "Generating commit log since last tag..."
|
||||||
@@ -131,6 +158,7 @@ jobs:
|
|||||||
cat release_body.txt
|
cat release_body.txt
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
tag_name: "v${{ env.VERSION }}"
|
tag_name: "v${{ env.VERSION }}"
|
||||||
@@ -145,6 +173,7 @@ jobs:
|
|||||||
|
|
||||||
# Update Message in Remote Repository
|
# Update Message in Remote Repository
|
||||||
- name: Checkout Central Manifest Repo
|
- name: Checkout Central Manifest Repo
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
repository: ${{ github.repository_owner }}/jellyfin-plugin-manifest
|
repository: ${{ github.repository_owner }}/jellyfin-plugin-manifest
|
||||||
@@ -152,6 +181,7 @@ jobs:
|
|||||||
token: ${{ secrets.JELLYFIN_PLUGIN_MANIFEST_UPDATER_PAT }}
|
token: ${{ secrets.JELLYFIN_PLUGIN_MANIFEST_UPDATER_PAT }}
|
||||||
|
|
||||||
- name: Update Central Manifest
|
- name: Update Central Manifest
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
cd central-manifest
|
cd central-manifest
|
||||||
@@ -207,6 +237,7 @@ jobs:
|
|||||||
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
|
manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
|
||||||
|
|
||||||
- name: Commit and Push Central Manifest
|
- name: Commit and Push Central Manifest
|
||||||
|
if: steps.check_release.outputs.release_exists == 'false'
|
||||||
run: |
|
run: |
|
||||||
cd central-manifest
|
cd central-manifest
|
||||||
git config user.name "CodeDevMLH"
|
git config user.name "CodeDevMLH"
|
||||||
|
|||||||
@@ -22,15 +22,15 @@
|
|||||||
<hr style="max-width: 800px; margin: 1em 0;">
|
<hr style="max-width: 800px; margin: 1em 0;">
|
||||||
|
|
||||||
<div style="margin-bottom: 1.5em;">
|
<div style="margin-bottom: 1.5em;">
|
||||||
<button class="jellyfin-tab-button active" onclick="showTab('basic', this)"
|
<button class="jellyfin-tab-button active" onclick="showTab('media-bar-enhanced-basic', this)"
|
||||||
style="background: none; border: none; color: #fff; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid #00a4dc;">
|
style="background: none; border: none; color: #fff; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid #00a4dc;">
|
||||||
<h3>General Settings</h3>
|
<h3>General Settings</h3>
|
||||||
</button>
|
</button>
|
||||||
<button class="jellyfin-tab-button" onclick="showTab('custom', this)"
|
<button class="jellyfin-tab-button" onclick="showTab('media-bar-enhanced-custom', this)"
|
||||||
style="background: none; border: none; color: #ccc; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid transparent;">
|
style="background: none; border: none; color: #ccc; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid transparent;">
|
||||||
<h3>Custom Content</h3>
|
<h3>Custom Content</h3>
|
||||||
</button>
|
</button>
|
||||||
<button class="jellyfin-tab-button" onclick="showTab('advanced', this)"
|
<button class="jellyfin-tab-button" onclick="showTab('media-bar-enhanced-advanced', this)"
|
||||||
style="background: none; border: none; color: #ccc; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid transparent;">
|
style="background: none; border: none; color: #ccc; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid transparent;">
|
||||||
<h3>Advanced Settings</h3>
|
<h3>Advanced Settings</h3>
|
||||||
</button>
|
</button>
|
||||||
@@ -39,11 +39,11 @@
|
|||||||
<form id="mediaBarEnhancedConfigForm">
|
<form id="mediaBarEnhancedConfigForm">
|
||||||
|
|
||||||
<!-- BASIC TAB -->
|
<!-- BASIC TAB -->
|
||||||
<div id="basic" class="tab-content">
|
<div id="media-bar-enhanced-basic" class="tab-content">
|
||||||
<h2 class="sectionTitle">Main Plugin Settings</h2>
|
<h2 class="sectionTitle">Main Plugin Settings</h2>
|
||||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||||
<label>
|
<label>
|
||||||
<input is="emby-checkbox" type="checkbox" id="IsEnabled" name="IsEnabled" />
|
<input is="emby-checkbox" type="checkbox" id="MediaBarIsEnabled" name="MediaBarIsEnabled" />
|
||||||
<span>Enable Media Bar Enhanced Plugin</span>
|
<span>Enable Media Bar Enhanced Plugin</span>
|
||||||
</label>
|
</label>
|
||||||
<div class="fieldDescription">Enable or disable the entire plugin functionality.</div>
|
<div class="fieldDescription">Enable or disable the entire plugin functionality.</div>
|
||||||
@@ -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>
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- CUSTOM CONTENT TAB -->
|
<!-- CUSTOM CONTENT TAB -->
|
||||||
<div id="custom" class="tab-content" style="display:none;">
|
<div id="media-bar-enhanced-custom" class="tab-content" style="display:none;">
|
||||||
<!-- Default Custom Media IDs -->
|
<!-- Default Custom Media IDs -->
|
||||||
<h2 class="sectionTitle">Custom Media IDs</h2>
|
<h2 class="sectionTitle">Custom Media IDs</h2>
|
||||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||||
@@ -164,6 +164,12 @@
|
|||||||
during their active date ranges. If no season matches the current date, the default Custom Media IDs above or random selection are used as fallback.</div>
|
during their active date ranges. If no season matches the current date, the default Custom Media IDs above or random selection are used as fallback.</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="seasonalContentContainer" style="display: none;">
|
<div id="seasonalContentContainer" style="display: none;">
|
||||||
|
|
||||||
|
<div style="background-color: rgba(255, 255, 255, 0.05); border-left: 4px solid #00a4dc; border-radius: 4px; padding: 1em 1.5em; margin: 1.5em 0; display: flex; align-items: center; gap: 1em;">
|
||||||
|
<i class="material-icons" style="color: #00a4dc; font-size: 24px;">info</i>
|
||||||
|
<div>Define rules to automatically select a seasonal selection of items based on the date. Rules are evaluated from top to bottom. The first matching rule wins.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="seasonalSectionsList"></div>
|
<div id="seasonalSectionsList"></div>
|
||||||
<button is="emby-button" type="button" id="addSeasonBtn" class="raised emby-button"
|
<button is="emby-button" type="button" id="addSeasonBtn" class="raised emby-button"
|
||||||
style="margin-top: 1em; display: inline-flex; align-items: center; gap: 0.4em;">
|
style="margin-top: 1em; display: inline-flex; align-items: center; gap: 0.4em;">
|
||||||
@@ -175,7 +181,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ADVANCED TAB -->
|
<!-- ADVANCED TAB -->
|
||||||
<div id="advanced" class="tab-content" style="display:none;">
|
<div id="media-bar-enhanced-advanced" class="tab-content" style="display:none;">
|
||||||
<h2 class="sectionTitle">Features</h2>
|
<h2 class="sectionTitle">Features</h2>
|
||||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||||
<label>
|
<label>
|
||||||
@@ -443,7 +449,7 @@
|
|||||||
ApiClient.getPluginConfiguration(MediaBarEnhancedConfigurationPage.pluginId).then(function (config) {
|
ApiClient.getPluginConfiguration(MediaBarEnhancedConfigurationPage.pluginId).then(function (config) {
|
||||||
|
|
||||||
var keys = [
|
var keys = [
|
||||||
'IsEnabled', 'ShuffleInterval', 'RetryInterval', 'MinSwipeDistance',
|
'MediaBarIsEnabled', 'ShuffleInterval', 'RetryInterval', 'MinSwipeDistance',
|
||||||
'LoadingCheckInterval', 'MaxPlotLength', 'MaxMovies', 'MaxTvShows',
|
'LoadingCheckInterval', 'MaxPlotLength', 'MaxMovies', 'MaxTvShows',
|
||||||
'MaxItems', 'PreloadCount', 'FadeTransitionDuration', 'MaxPaginationDots',
|
'MaxItems', 'PreloadCount', 'FadeTransitionDuration', 'MaxPaginationDots',
|
||||||
'SlideAnimationEnabled', 'EnableVideoBackdrop', 'UseSponsorBlock',
|
'SlideAnimationEnabled', 'EnableVideoBackdrop', 'UseSponsorBlock',
|
||||||
@@ -534,7 +540,7 @@
|
|||||||
|
|
||||||
var config = {};
|
var config = {};
|
||||||
var keys = [
|
var keys = [
|
||||||
'IsEnabled', 'ShuffleInterval', 'RetryInterval', 'MinSwipeDistance',
|
'MediaBarIsEnabled', 'ShuffleInterval', 'RetryInterval', 'MinSwipeDistance',
|
||||||
'LoadingCheckInterval', 'MaxPlotLength', 'MaxMovies', 'MaxTvShows',
|
'LoadingCheckInterval', 'MaxPlotLength', 'MaxMovies', 'MaxTvShows',
|
||||||
'MaxItems', 'PreloadCount', 'FadeTransitionDuration', 'MaxPaginationDots',
|
'MaxItems', 'PreloadCount', 'FadeTransitionDuration', 'MaxPaginationDots',
|
||||||
'SlideAnimationEnabled', 'EnableVideoBackdrop', 'UseSponsorBlock',
|
'SlideAnimationEnabled', 'EnableVideoBackdrop', 'UseSponsorBlock',
|
||||||
@@ -612,14 +618,18 @@
|
|||||||
|
|
||||||
div.innerHTML =
|
div.innerHTML =
|
||||||
'<div class="inputContainer" style="margin-bottom: 0.5em;">' +
|
'<div class="inputContainer" style="margin-bottom: 0.5em;">' +
|
||||||
' <label class="inputLabel" style="font-size: 1.2em; font-weight: bold; margin-bottom:0.5em; display:block;">' + labelText + '</label>' +
|
' <div style="display: flex; align-items: center; justify-content: space-between;">' +
|
||||||
' <div style="display: flex; align-items: center;">' +
|
' <label class="inputLabel section-title" style="font-size: 1.2em; font-weight: bold; margin-bottom:0.5em; display:block;">' + labelText + '</label>' +
|
||||||
' <div style="flex-grow:1;">' +
|
' <div style="display: flex; gap: 0.5em;">' +
|
||||||
' <input is="emby-input" type="text" class="emby-input section-name" value="' + (data.Name || '') + '" />' +
|
' <button type="button" is="paper-icon-button-light" class="btn-move-up" title="Move Up"><i class="material-icons">arrow_upward</i></button>' +
|
||||||
|
' <button type="button" is="paper-icon-button-light" class="btn-move-down" title="Move Down"><i class="material-icons">arrow_downward</i></button>' +
|
||||||
|
' <button type="button" is="paper-icon-button-light" class="btn-remove" title="Remove" style="color: #a94442;"><i class="material-icons">delete</i></button>' +
|
||||||
' </div>' +
|
' </div>' +
|
||||||
' <button type="button" class="raised emby-button remove-section" style="background: #a94442; min-width: unset; margin-left: 1em;">Remove</button>' +
|
|
||||||
' </div>' +
|
' </div>' +
|
||||||
' <div class="fieldDescription">Name of the season</div>' +
|
' <div class="inputContainer">' +
|
||||||
|
' <input is="emby-input" type="text" class="emby-input section-name" style="width: 60%;" value="' + (data.Name || '') + '" />' +
|
||||||
|
' <div class="fieldDescription">Name of the season</div>' +
|
||||||
|
' </div>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'<div class="inputContainer" style="margin-bottom: 1em;">' +
|
'<div class="inputContainer" style="margin-bottom: 1em;">' +
|
||||||
' <label class="inputLabel" style="margin-bottom:0.5em; display:block;">Active Period</label>' +
|
' <label class="inputLabel" style="margin-bottom:0.5em; display:block;">Active Period</label>' +
|
||||||
@@ -639,13 +649,38 @@
|
|||||||
' <div class="fieldDescription">Comma-separated or Newline separated list of Movie/Series/Collection IDs to show during this season.<br>Same options available as for the default media IDs.</div>' +
|
' <div class="fieldDescription">Comma-separated or Newline separated list of Movie/Series/Collection IDs to show during this season.<br>Same options available as for the default media IDs.</div>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
|
|
||||||
div.querySelector('.remove-section').addEventListener('click', function() {
|
div.querySelector('.btn-remove').addEventListener('click', function() {
|
||||||
div.remove();
|
div.remove();
|
||||||
|
MediaBarEnhancedConfigurationPage.updateSectionTitles(container);
|
||||||
|
});
|
||||||
|
|
||||||
|
div.querySelector('.btn-move-up').addEventListener('click', function() {
|
||||||
|
if (div.previousElementSibling) {
|
||||||
|
container.insertBefore(div, div.previousElementSibling);
|
||||||
|
MediaBarEnhancedConfigurationPage.updateSectionTitles(container);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
div.querySelector('.btn-move-down').addEventListener('click', function() {
|
||||||
|
if (div.nextElementSibling) {
|
||||||
|
container.insertBefore(div.nextElementSibling, div);
|
||||||
|
MediaBarEnhancedConfigurationPage.updateSectionTitles(container);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
container.appendChild(div);
|
container.appendChild(div);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
updateSectionTitles: function(container) {
|
||||||
|
var sections = container.querySelectorAll('.seasonal-section');
|
||||||
|
sections.forEach(function(section, index) {
|
||||||
|
var title = section.querySelector('.section-title');
|
||||||
|
if (title) {
|
||||||
|
title.innerText = 'Season list #' + (index + 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
getSeasonalSectionsFromUI: function(page) {
|
getSeasonalSectionsFromUI: function(page) {
|
||||||
var sections = [];
|
var sections = [];
|
||||||
var els = page.querySelectorAll('.seasonal-section');
|
var els = page.querySelectorAll('.seasonal-section');
|
||||||
|
|||||||
@@ -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.3</Version>
|
<Version>1.6.5.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>
|
||||||
|
|
||||||
|
|||||||
@@ -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>";
|
||||||
|
|
||||||
|
|||||||
@@ -437,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) {
|
||||||
@@ -1833,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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1860,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;"
|
||||||
};
|
};
|
||||||
@@ -1887,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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -8,6 +8,30 @@
|
|||||||
"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.5.1",
|
||||||
|
"changelog": "- refactored seasonal UI settings",
|
||||||
|
"targetAbi": "10.11.0.0",
|
||||||
|
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.6.5.1/Jellyfin.Plugin.MediaBarEnhanced.zip",
|
||||||
|
"checksum": "da69f622c18d73cc245fe17364cc9fdd",
|
||||||
|
"timestamp": "2026-02-16T21:49:25Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "1.6.4.1",
|
||||||
|
"changelog": "- fix slide transition when using local/backdrop videos",
|
||||||
|
"targetAbi": "10.11.0.0",
|
||||||
|
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/jellyfin-plugin-media-bar-enhanced/releases/download/v1.6.4.1/Jellyfin.Plugin.MediaBarEnhanced.zip",
|
||||||
|
"checksum": "a9c5a863427de84639eca082483936da",
|
||||||
|
"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",
|
"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",
|
"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",
|
||||||
|
|||||||
Reference in New Issue
Block a user