Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d9afa762f | ||
|
|
2f88587dab | ||
|
|
360a959b69 | ||
|
|
36fba545cf | ||
|
|
7faa2cc766 | ||
|
|
aa832e93aa | ||
|
|
86bbeb583d | ||
|
|
7a642b34b8 | ||
|
|
926b30b8ce | ||
|
|
5b672cef42 | ||
|
|
ceccbf4ded | ||
|
|
9cba2a0755 | ||
|
|
af036a9aa4 | ||
|
|
cfefd2d2d3 | ||
|
|
8e7299508b | ||
|
|
fc7aa36f41 | ||
|
|
fc9896048f | ||
|
|
572c4d9ace | ||
|
|
2572e085f6 | ||
|
|
8297f989fd | ||
|
|
636aaa2a4a | ||
|
|
5e70621e93 | ||
|
|
0b4434c51c | ||
|
|
dd6583c055 | ||
|
|
a0b0514159 | ||
|
|
e977c83e8f | ||
|
|
e281f5c579 | ||
|
|
e6b646e478 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,4 +5,5 @@ obj/
|
|||||||
artifacts
|
artifacts
|
||||||
|
|
||||||
test-site.html
|
test-site.html
|
||||||
|
test-site-new.html
|
||||||
RELEASE_GUIDE.md
|
RELEASE_GUIDE.md
|
||||||
@@ -62,6 +62,7 @@ public class SeasonalsController : ControllerBase
|
|||||||
if (path.EndsWith(".png", StringComparison.OrdinalIgnoreCase)) return "image/png";
|
if (path.EndsWith(".png", StringComparison.OrdinalIgnoreCase)) return "image/png";
|
||||||
if (path.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase)) return "image/jpeg";
|
if (path.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase)) return "image/jpeg";
|
||||||
if (path.EndsWith(".gif", StringComparison.OrdinalIgnoreCase)) return "image/gif";
|
if (path.EndsWith(".gif", StringComparison.OrdinalIgnoreCase)) return "image/gif";
|
||||||
|
if (path.EndsWith(".svg", StringComparison.OrdinalIgnoreCase)) return "image/svg+xml";
|
||||||
return "application/octet-stream";
|
return "application/octet-stream";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,18 +38,9 @@
|
|||||||
</label>
|
</label>
|
||||||
<div class="fieldDescription">Automatically select the season based on the date.</div>
|
<div class="fieldDescription">Automatically select the season based on the date.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
|
||||||
<label class="emby-checkbox-label">
|
|
||||||
<input id="EnableClientSideToggle" name="EnableClientSideToggle" type="checkbox"
|
|
||||||
is="emby-checkbox" />
|
|
||||||
<span>Allow Client-Side Toggle</span>
|
|
||||||
</label>
|
|
||||||
<div class="fieldDescription">If enabled, users will see a settings icon in the header to toggle
|
|
||||||
animations for their browser.</div>
|
|
||||||
</div>
|
|
||||||
<div class="selectContainer">
|
<div class="selectContainer">
|
||||||
<label class="selectLabel" for="SelectedSeason">Selected Season</label>
|
<label class="selectLabel" for="SelectedSeason">Selected Season</label>
|
||||||
<select is="emby-select" id="SelectedSeason" name="SelectedSeason" class="emby-select-withcolor emby-select">
|
<select id="SelectedSeason" name="SelectedSeason" class="emby-select">
|
||||||
<option value="none">None</option>
|
<option value="none">None</option>
|
||||||
<option value="snowflakes">Snowflakes</option>
|
<option value="snowflakes">Snowflakes</option>
|
||||||
<option value="snowfall">Snowfall</option>
|
<option value="snowfall">Snowfall</option>
|
||||||
@@ -72,6 +63,15 @@
|
|||||||
</select>
|
</select>
|
||||||
<div class="fieldDescription">The season to display if automation is disabled.</div>
|
<div class="fieldDescription">The season to display if automation is disabled.</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||||
|
<label class="emby-checkbox-label">
|
||||||
|
<input id="EnableClientSideToggle" name="EnableClientSideToggle" type="checkbox"
|
||||||
|
is="emby-checkbox" />
|
||||||
|
<span>Allow Client-Side Toggle</span>
|
||||||
|
</label>
|
||||||
|
<div class="fieldDescription">If enabled, users will see a settings icon in the header to toggle
|
||||||
|
animations for their browser.</div>
|
||||||
|
</div>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<!-- <TreatWarningsAsErrors>false</TreatWarningsAsErrors> -->
|
<!-- <TreatWarningsAsErrors>false</TreatWarningsAsErrors> -->
|
||||||
<Title>Jellyfin Seasonals Plugin</Title>
|
<Title>Jellyfin Seasonals Plugin</Title>
|
||||||
<Authors>CodeDevMLH</Authors>
|
<Authors>CodeDevMLH</Authors>
|
||||||
<Version>1.6.0.0</Version>
|
<Version>1.6.10.0</Version>
|
||||||
<RepositoryUrl>https://github.com/CodeDevMLH/Jellyfin-Seasonals</RepositoryUrl>
|
<RepositoryUrl>https://github.com/CodeDevMLH/Jellyfin-Seasonals</RepositoryUrl>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|||||||
1343
Jellyfin.Plugin.Seasonals/Web/assets/logo_SW.svg
Normal file
1343
Jellyfin.Plugin.Seasonals/Web/assets/logo_SW.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 250 KiB |
BIN
Jellyfin.Plugin.Seasonals/Web/assets/logo_SW_192x192.png
Normal file
BIN
Jellyfin.Plugin.Seasonals/Web/assets/logo_SW_192x192.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
BIN
Jellyfin.Plugin.Seasonals/Web/assets/logo_SW_96x96.png
Normal file
BIN
Jellyfin.Plugin.Seasonals/Web/assets/logo_SW_96x96.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
@@ -243,7 +243,8 @@ function createSettingsIcon() {
|
|||||||
button.type = 'button';
|
button.type = 'button';
|
||||||
button.className = 'paper-icon-button-light headerButton seasonal-settings-button';
|
button.className = 'paper-icon-button-light headerButton seasonal-settings-button';
|
||||||
button.title = 'Seasonal Settings';
|
button.title = 'Seasonal Settings';
|
||||||
button.innerHTML = '<span class="material-icons">ac_unit</span>';
|
// button.innerHTML = '<span class="material-icons">ac_unit</span>';
|
||||||
|
button.innerHTML = '<img src="/Seasonals/Resources/assets/logo_SW.svg" style="width: 24px; height: 24px; vertical-align: middle;">';
|
||||||
button.style.verticalAlign = 'middle';
|
button.style.verticalAlign = 'middle';
|
||||||
|
|
||||||
button.addEventListener('click', (e) => {
|
button.addEventListener('click', (e) => {
|
||||||
@@ -266,62 +267,44 @@ function createSettingsPopup(anchorElement) {
|
|||||||
zIndex: '10000',
|
zIndex: '10000',
|
||||||
backgroundColor: '#202020',
|
backgroundColor: '#202020',
|
||||||
padding: '1em',
|
padding: '1em',
|
||||||
borderRadius: '4px',
|
borderRadius: '0.3em',
|
||||||
boxShadow: '0 0 20px rgba(0,0,0,0.5)',
|
boxShadow: '0 0 20px rgba(0,0,0,0.5)',
|
||||||
minWidth: '200px',
|
minWidth: '200px',
|
||||||
color: '#fff'
|
color: '#fff',
|
||||||
|
maxWidth: '250px'
|
||||||
});
|
});
|
||||||
|
|
||||||
const rect = anchorElement.getBoundingClientRect();
|
const rect = anchorElement.getBoundingClientRect();
|
||||||
|
|
||||||
|
let rightPos = window.innerWidth - rect.right;
|
||||||
|
if (window.innerWidth < 450 || (window.innerWidth - rightPos) < 260) {
|
||||||
|
popup.style.right = '1rem';
|
||||||
|
popup.style.left = 'auto';
|
||||||
|
} else {
|
||||||
|
popup.style.right = `${rightPos}px`;
|
||||||
|
popup.style.left = 'auto';
|
||||||
|
}
|
||||||
|
|
||||||
popup.style.top = `${rect.bottom + 10}px`;
|
popup.style.top = `${rect.bottom + 10}px`;
|
||||||
popup.style.right = `${window.innerWidth - rect.right}px`;
|
|
||||||
|
|
||||||
const enabledContainer = document.createElement('div');
|
popup.innerHTML = `
|
||||||
enabledContainer.style.marginBottom = '1em';
|
<div class="checkboxContainer checkboxContainer-withDescription" style="margin-bottom: 0.5em;">
|
||||||
enabledContainer.style.display = 'flex';
|
<label class="emby-checkbox-label">
|
||||||
enabledContainer.style.alignItems = 'center';
|
<input id="seasonal-enable-toggle" type="checkbox" is="emby-checkbox" class="emby-checkbox" />
|
||||||
enabledContainer.style.justifyContent = 'space-between';
|
<span class="checkboxLabel">Enable Seasonals</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
const enabledLabel = document.createElement('label');
|
<div class="selectContainer" style="margin-bottom: 0.5em;">
|
||||||
enabledLabel.textContent = 'Enable Seasonals';
|
<label class="selectLabel" for="seasonal-theme-select" style="margin-bottom: 0.5em; display: block; color: inherit;">Force Theme</label>
|
||||||
enabledLabel.style.marginRight = '10px';
|
<select id="seasonal-theme-select" class="emby-select" style="width: 100%; padding: 0.5em; background-color: #333; border: 1px solid #444; color: #fff; border-radius: 4px;">
|
||||||
|
<option value="auto">Auto (Date Based)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
const enabledCheckbox = document.createElement('input');
|
// Populate Select Options
|
||||||
enabledCheckbox.type = 'checkbox';
|
const themeSelect = popup.querySelector('#seasonal-theme-select');
|
||||||
enabledCheckbox.checked = getSavedSetting('seasonals-enabled', 'true') === 'true';
|
|
||||||
enabledCheckbox.addEventListener('change', (e) => {
|
|
||||||
setSavedSetting('seasonals-enabled', e.target.checked);
|
|
||||||
location.reload();
|
|
||||||
});
|
|
||||||
|
|
||||||
enabledContainer.appendChild(enabledLabel);
|
|
||||||
enabledContainer.appendChild(enabledCheckbox);
|
|
||||||
popup.appendChild(enabledContainer);
|
|
||||||
|
|
||||||
// Theme Selector
|
|
||||||
const themeContainer = document.createElement('div');
|
|
||||||
themeContainer.style.display = 'flex';
|
|
||||||
themeContainer.style.flexDirection = 'column';
|
|
||||||
|
|
||||||
const themeLabel = document.createElement('label');
|
|
||||||
themeLabel.textContent = 'Force Theme';
|
|
||||||
themeLabel.style.marginBottom = '0.5em';
|
|
||||||
|
|
||||||
const themeSelect = document.createElement('select');
|
|
||||||
themeSelect.style.width = '100%';
|
|
||||||
themeSelect.style.padding = '0.5em';
|
|
||||||
themeSelect.style.backgroundColor = '#333';
|
|
||||||
themeSelect.style.color = '#fff';
|
|
||||||
themeSelect.style.border = '1px solid #444';
|
|
||||||
themeSelect.style.borderRadius = '4px';
|
|
||||||
|
|
||||||
// Add Auto option
|
|
||||||
const autoOption = document.createElement('option');
|
|
||||||
autoOption.value = 'auto';
|
|
||||||
autoOption.textContent = 'Auto (Date Based)';
|
|
||||||
themeSelect.appendChild(autoOption);
|
|
||||||
|
|
||||||
// Add available themes
|
|
||||||
Object.keys(themeConfigs).forEach(key => {
|
Object.keys(themeConfigs).forEach(key => {
|
||||||
if (key === 'none') return;
|
if (key === 'none') return;
|
||||||
const option = document.createElement('option');
|
const option = document.createElement('option');
|
||||||
@@ -331,19 +314,22 @@ function createSettingsPopup(anchorElement) {
|
|||||||
themeSelect.appendChild(option);
|
themeSelect.appendChild(option);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Set current value
|
// Set Initial Values
|
||||||
|
const enabledCheckbox = popup.querySelector('#seasonal-enable-toggle');
|
||||||
|
enabledCheckbox.checked = getSavedSetting('seasonals-enabled', 'true') === 'true';
|
||||||
|
|
||||||
themeSelect.value = getSavedSetting('seasonals-theme', 'auto');
|
themeSelect.value = getSavedSetting('seasonals-theme', 'auto');
|
||||||
|
|
||||||
|
enabledCheckbox.addEventListener('change', (e) => {
|
||||||
|
setSavedSetting('seasonals-enabled', e.target.checked);
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
|
||||||
themeSelect.addEventListener('change', (e) => {
|
themeSelect.addEventListener('change', (e) => {
|
||||||
setSavedSetting('seasonals-theme', e.target.value);
|
setSavedSetting('seasonals-theme', e.target.value);
|
||||||
location.reload();
|
location.reload();
|
||||||
});
|
});
|
||||||
|
|
||||||
themeContainer.appendChild(themeLabel);
|
|
||||||
themeContainer.appendChild(themeSelect);
|
|
||||||
popup.appendChild(themeContainer);
|
|
||||||
|
|
||||||
// Close on click outside
|
|
||||||
const closeHandler = (e) => {
|
const closeHandler = (e) => {
|
||||||
if (!popup.contains(e.target) && e.target !== anchorElement && !anchorElement.contains(e.target)) {
|
if (!popup.contains(e.target) && e.target !== anchorElement && !anchorElement.contains(e.target)) {
|
||||||
popup.remove();
|
popup.remove();
|
||||||
|
|||||||
@@ -9,12 +9,12 @@
|
|||||||
"imageUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/Jellyfin-Seasonals-Plugin/raw/branch/main/logo.png",
|
"imageUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/Jellyfin-Seasonals-Plugin/raw/branch/main/logo.png",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"version": "1.6.0.0",
|
"version": "1.6.10.0",
|
||||||
"changelog": "- feat: Add client-side toggle option for seasonal settings",
|
"changelog": "- feat: Add client-side toggle option for seasonal settings",
|
||||||
"targetAbi": "10.11.0.0",
|
"targetAbi": "10.11.0.0",
|
||||||
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/Jellyfin-Seasonals-Plugin/releases/download/v1.6.0.0/Jellyfin.Plugin.Seasonals.zip",
|
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/Jellyfin-Seasonals-Plugin/releases/download/v1.6.10.0/Jellyfin.Plugin.Seasonals.zip",
|
||||||
"checksum": "9b66d6f1c03b284ac9fe7e87540f7759",
|
"checksum": "3a56b23e0adf64e1e85f0aa1ac93e1b2",
|
||||||
"timestamp": "2026-02-03T17:49:05Z"
|
"timestamp": "2026-02-03T21:03:40Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"version": "1.5.1.0",
|
"version": "1.5.1.0",
|
||||||
|
|||||||
Reference in New Issue
Block a user