diff --git a/Jellyfin.Plugin.Seasonals/Api/SeasonalsController.cs b/Jellyfin.Plugin.Seasonals/Api/SeasonalsController.cs index 591e408..0c401fa 100644 --- a/Jellyfin.Plugin.Seasonals/Api/SeasonalsController.cs +++ b/Jellyfin.Plugin.Seasonals/Api/SeasonalsController.cs @@ -21,12 +21,7 @@ public class SeasonalsController : ControllerBase [Produces("application/json")] public ActionResult GetConfig() { - var config = Plugin.Instance?.Configuration; - return new - { - selectedSeason = config?.SelectedSeason ?? "none", - automateSeasonSelection = config?.AutomateSeasonSelection ?? true - }; + return Plugin.Instance?.Configuration ?? new object(); } /// diff --git a/Jellyfin.Plugin.Seasonals/Configuration/PluginConfiguration.cs b/Jellyfin.Plugin.Seasonals/Configuration/PluginConfiguration.cs index 193aaed..d2d6657 100644 --- a/Jellyfin.Plugin.Seasonals/Configuration/PluginConfiguration.cs +++ b/Jellyfin.Plugin.Seasonals/Configuration/PluginConfiguration.cs @@ -14,6 +14,17 @@ public class PluginConfiguration : BasePluginConfiguration { SelectedSeason = "none"; AutomateSeasonSelection = true; + + Autumn = new AutumnOptions(); + Snowflakes = new SnowflakesOptions(); + Snowfall = new SnowfallOptions(); + Snowstorm = new SnowstormOptions(); + Fireworks = new FireworksOptions(); + Halloween = new HalloweenOptions(); + Hearts = new HeartsOptions(); + Christmas = new ChristmasOptions(); + Santa = new SantaOptions(); + Easter = new EasterOptions(); } /// @@ -25,4 +36,118 @@ public class PluginConfiguration : BasePluginConfiguration /// Gets or sets a value indicating whether to automate season selection. /// public bool AutomateSeasonSelection { get; set; } + + public AutumnOptions Autumn { get; set; } + public SnowflakesOptions Snowflakes { get; set; } + public SnowfallOptions Snowfall { get; set; } + public SnowstormOptions Snowstorm { get; set; } + public FireworksOptions Fireworks { get; set; } + public HalloweenOptions Halloween { get; set; } + public HeartsOptions Hearts { get; set; } + public ChristmasOptions Christmas { get; set; } + public SantaOptions Santa { get; set; } + public EasterOptions Easter { get; set; } +} + +public class AutumnOptions +{ + public int LeafCount { get; set; } = 25; + public bool EnableAutumn { get; set; } = true; + public bool EnableRandomLeaves { get; set; } = true; + public bool EnableRandomLeavesMobile { get; set; } = false; + public bool EnableDifferentDuration { get; set; } = true; + public bool EnableRotation { get; set; } = false; +} + +public class SnowflakesOptions +{ + public int SnowflakeCount { get; set; } = 25; + public bool EnableSnowflakes { get; set; } = true; + public bool EnableRandomSnowflakes { get; set; } = true; + public bool EnableRandomSnowflakesMobile { get; set; } = false; + public bool EnableColoredSnowflakes { get; set; } = true; + public bool EnableDifferentDuration { get; set; } = true; +} + +public class SnowfallOptions +{ + public int SnowflakesCount { get; set; } = 500; + public int SnowflakesCountMobile { get; set; } = 250; + public double Speed { get; set; } = 3; + public bool EnableSnowfall { get; set; } = true; +} + +public class SnowstormOptions +{ + public int SnowflakesCount { get; set; } = 500; + public int SnowflakesCountMobile { get; set; } = 250; + public double Speed { get; set; } = 6; + public bool EnableSnowstorm { get; set; } = true; + public double HorizontalWind { get; set; } = 4; + public double VerticalVariation { get; set; } = 2; +} + +public class FireworksOptions +{ + public int ParticleCount { get; set; } = 50; + public int LaunchInterval { get; set; } = 3200; + public bool EnableFireworks { get; set; } = true; + public bool ScrollFireworks { get; set; } = true; + public int MinFireworks { get; set; } = 3; + public int MaxFireworks { get; set; } = 6; +} + +public class HalloweenOptions +{ + public int SymbolCount { get; set; } = 25; + public bool EnableHalloween { get; set; } = true; + public bool EnableRandomSymbols { get; set; } = true; + public bool EnableRandomSymbolsMobile { get; set; } = false; + public bool EnableDifferentDuration { get; set; } = true; +} + +public class HeartsOptions +{ + public int SymbolCount { get; set; } = 25; + public bool EnableHearts { get; set; } = true; + public bool EnableRandomSymbols { get; set; } = true; + public bool EnableRandomSymbolsMobile { get; set; } = false; + public bool EnableDifferentDuration { get; set; } = true; +} + +public class ChristmasOptions +{ + public int SymbolCount { get; set; } = 25; + public bool EnableChristmas { get; set; } = true; + public bool EnableRandomChristmas { get; set; } = true; + public bool EnableRandomChristmasMobile { get; set; } = false; + public bool EnableDifferentDuration { get; set; } = true; +} + +public class SantaOptions +{ + public int SnowflakesCount { get; set; } = 500; + public int SnowflakesCountMobile { get; set; } = 250; + public double SantaSpeed { get; set; } = 10; + public double SantaSpeedMobile { get; set; } = 8; + public bool EnableSanta { get; set; } = true; + public double SnowFallSpeed { get; set; } = 3; + public double MaxSantaRestTime { get; set; } = 8; + public double MinSantaRestTime { get; set; } = 3; + public double MaxPresentFallSpeed { get; set; } = 5; + public double MinPresentFallSpeed { get; set; } = 2; +} + +public class EasterOptions +{ + public int EggCount { get; set; } = 20; + public bool EnableEaster { get; set; } = true; + public bool EnableRandomEaster { get; set; } = true; + public bool EnableRandomEasterMobile { get; set; } = false; + public bool EnableDifferentDuration { get; set; } = true; + public bool EnableBunny { get; set; } = true; + public int BunnyDuration { get; set; } = 12000; + public int HopHeight { get; set; } = 12; + public int MinBunnyRestTime { get; set; } = 2000; + public int MaxBunnyRestTime { get; set; } = 5000; } diff --git a/Jellyfin.Plugin.Seasonals/Configuration/configPage.html b/Jellyfin.Plugin.Seasonals/Configuration/configPage.html index d6be848..07dacfd 100644 --- a/Jellyfin.Plugin.Seasonals/Configuration/configPage.html +++ b/Jellyfin.Plugin.Seasonals/Configuration/configPage.html @@ -33,9 +33,357 @@
The season to display if automation is disabled.
+ +
+
+

Autumn

+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+ +

Snowflakes

+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+ +

Snowfall

+
+ +
+
+ + +
+
+ + +
Warning: High values may affect performance
+
+
+ + +
+ +

Snowstorm

+
+ +
+
+ + +
+
+ + +
Warning: High values may affect performance
+
+
+ + +
+
+ + +
+
+ + +
+ +

Fireworks

+
+ +
+
+ + +
Warning: High values may affect performance
+
+
+ + +
+
+ +
+
+ + +
+
+ + +
+ +

Halloween

+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+ +

Hearts

+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+ +

Christmas

+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+ +

Santa

+
+ +
+
+ + +
+
+ + +
Warning: High values may affect performance
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +

Easter

+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
Please reload the page (F5) after saving for changes to take effect.
@@ -53,6 +401,91 @@ ApiClient.getPluginConfiguration(SeasonalsConfig.pluginUniqueId).then(function (config) { document.querySelector('#SelectedSeason').value = config.SelectedSeason; document.querySelector('#AutomateSeasonSelection').checked = config.AutomateSeasonSelection; + + // Advanced Config + // Autumn + document.querySelector('#EnableAutumn').checked = config.Autumn.EnableAutumn; + document.querySelector('#AutumnLeafCount').value = config.Autumn.LeafCount; + document.querySelector('#EnableRandomLeaves').checked = config.Autumn.EnableRandomLeaves; + document.querySelector('#EnableRandomLeavesMobile').checked = config.Autumn.EnableRandomLeavesMobile; + document.querySelector('#EnableDifferentDurationAutumn').checked = config.Autumn.EnableDifferentDuration; + document.querySelector('#EnableRotation').checked = config.Autumn.EnableRotation; + + // Snowflakes + document.querySelector('#SnowflakesCount').value = config.Snowflakes.SnowflakeCount; + document.querySelector('#EnableSnowflakes').checked = config.Snowflakes.EnableSnowflakes; + document.querySelector('#EnableRandomSnowflakes').checked = config.Snowflakes.EnableRandomSnowflakes; + document.querySelector('#EnableRandomSnowflakesMobile').checked = config.Snowflakes.EnableRandomSnowflakesMobile; + document.querySelector('#EnableColoredSnowflakes').checked = config.Snowflakes.EnableColoredSnowflakes; + document.querySelector('#EnableDifferentDurationSnowflakes').checked = config.Snowflakes.EnableDifferentDuration; + + // Snowfall + document.querySelector('#EnableSnowfall').checked = config.Snowfall.EnableSnowfall; + document.querySelector('#SnowfallCount').value = config.Snowfall.SnowflakesCount; + document.querySelector('#SnowfallCountMobile').value = config.Snowfall.SnowflakesCountMobile; + document.querySelector('#SnowfallSpeed').value = config.Snowfall.Speed; + + // Snowstorm + document.querySelector('#EnableSnowstorm').checked = config.Snowstorm.EnableSnowstorm; + document.querySelector('#SnowstormCount').value = config.Snowstorm.SnowflakesCount; + document.querySelector('#SnowstormCountMobile').value = config.Snowstorm.SnowflakesCountMobile; + document.querySelector('#SnowstormSpeed').value = config.Snowstorm.Speed; + document.querySelector('#SnowstormHorizontalWind').value = config.Snowstorm.HorizontalWind; + document.querySelector('#SnowstormVerticalVariation').value = config.Snowstorm.VerticalVariation; + + // Fireworks + document.querySelector('#EnableFireworks').checked = config.Fireworks.EnableFireworks; + document.querySelector('#FireworksParticles').value = config.Fireworks.ParticleCount; + document.querySelector('#FireworksInterval').value = config.Fireworks.LaunchInterval; + document.querySelector('#ScrollFireworks').checked = config.Fireworks.ScrollFireworks; + document.querySelector('#MinFireworks').value = config.Fireworks.MinFireworks; + document.querySelector('#MaxFireworks').value = config.Fireworks.MaxFireworks; + + // Halloween + document.querySelector('#EnableHalloween').checked = config.Halloween.EnableHalloween; + document.querySelector('#HalloweenCount').value = config.Halloween.SymbolCount; + document.querySelector('#EnableRandomHalloween').checked = config.Halloween.EnableRandomSymbols; + document.querySelector('#EnableRandomHalloweenMobile').checked = config.Halloween.EnableRandomSymbolsMobile; + document.querySelector('#EnableDifferentDurationHalloween').checked = config.Halloween.EnableDifferentDuration; + + // Hearts + document.querySelector('#EnableHearts').checked = config.Hearts.EnableHearts; + document.querySelector('#HeartsCount').value = config.Hearts.SymbolCount; + document.querySelector('#EnableRandomHearts').checked = config.Hearts.EnableRandomSymbols; + document.querySelector('#EnableRandomHeartsMobile').checked = config.Hearts.EnableRandomSymbolsMobile; + document.querySelector('#EnableDifferentDurationHearts').checked = config.Hearts.EnableDifferentDuration; + + // Christmas + document.querySelector('#EnableChristmas').checked = config.Christmas.EnableChristmas; + document.querySelector('#ChristmasCount').value = config.Christmas.SymbolCount; + document.querySelector('#EnableRandomChristmas').checked = config.Christmas.EnableRandomChristmas; + document.querySelector('#EnableRandomChristmasMobile').checked = config.Christmas.EnableRandomChristmasMobile; + document.querySelector('#EnableDifferentDurationChristmas').checked = config.Christmas.EnableDifferentDuration; + + // Santa + document.querySelector('#EnableSanta').checked = config.Santa.EnableSanta; + document.querySelector('#SantaSnowflakes').value = config.Santa.SnowflakesCount; + document.querySelector('#SantaSnowflakesMobile').value = config.Santa.SnowflakesCountMobile; + document.querySelector('#SantaSpeed').value = config.Santa.SantaSpeed; + document.querySelector('#SantaSpeedMobile').value = config.Santa.SantaSpeedMobile; + document.querySelector('#SantaSnowFallSpeed').value = config.Santa.SnowFallSpeed; + document.querySelector('#MaxSantaRestTime').value = config.Santa.MaxSantaRestTime; + document.querySelector('#MinSantaRestTime').value = config.Santa.MinSantaRestTime; + document.querySelector('#MaxPresentFallSpeed').value = config.Santa.MaxPresentFallSpeed; + document.querySelector('#MinPresentFallSpeed').value = config.Santa.MinPresentFallSpeed; + + // Easter + document.querySelector('#EnableEaster').checked = config.Easter.EnableEaster; + document.querySelector('#EasterEggCount').value = config.Easter.EggCount; + document.querySelector('#EnableRandomEaster').checked = config.Easter.EnableRandomEaster; + document.querySelector('#EnableRandomEasterMobile').checked = config.Easter.EnableRandomEasterMobile; + document.querySelector('#EnableDifferentDurationEaster').checked = config.Easter.EnableDifferentDuration; + document.querySelector('#EasterBunny').checked = config.Easter.EnableBunny; + document.querySelector('#BunnyDuration').value = config.Easter.BunnyDuration; + document.querySelector('#HopHeight').value = config.Easter.HopHeight; + document.querySelector('#MinBunnyRestTime').value = config.Easter.MinBunnyRestTime; + document.querySelector('#MaxBunnyRestTime').value = config.Easter.MaxBunnyRestTime; + Dashboard.hideLoadingMsg(); }); }); @@ -63,6 +496,91 @@ ApiClient.getPluginConfiguration(SeasonalsConfig.pluginUniqueId).then(function (config) { config.SelectedSeason = document.querySelector('#SelectedSeason').value; config.AutomateSeasonSelection = document.querySelector('#AutomateSeasonSelection').checked; + + // Advanced Config + // Autumn + config.Autumn.EnableAutumn = document.querySelector('#EnableAutumn').checked; + config.Autumn.LeafCount = parseInt(document.querySelector('#AutumnLeafCount').value); + config.Autumn.EnableRandomLeaves = document.querySelector('#EnableRandomLeaves').checked; + config.Autumn.EnableRandomLeavesMobile = document.querySelector('#EnableRandomLeavesMobile').checked; + config.Autumn.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationAutumn').checked; + config.Autumn.EnableRotation = document.querySelector('#EnableRotation').checked; + + // Snowflakes + config.Snowflakes.SnowflakeCount = parseInt(document.querySelector('#SnowflakesCount').value); + config.Snowflakes.EnableSnowflakes = document.querySelector('#EnableSnowflakes').checked; + config.Snowflakes.EnableRandomSnowflakes = document.querySelector('#EnableRandomSnowflakes').checked; + config.Snowflakes.EnableRandomSnowflakesMobile = document.querySelector('#EnableRandomSnowflakesMobile').checked; + config.Snowflakes.EnableColoredSnowflakes = document.querySelector('#EnableColoredSnowflakes').checked; + config.Snowflakes.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationSnowflakes').checked; + + // Snowfall + config.Snowfall.EnableSnowfall = document.querySelector('#EnableSnowfall').checked; + config.Snowfall.SnowflakesCount = parseInt(document.querySelector('#SnowfallCount').value); + config.Snowfall.SnowflakesCountMobile = parseInt(document.querySelector('#SnowfallCountMobile').value); + config.Snowfall.Speed = parseFloat(document.querySelector('#SnowfallSpeed').value); + + // Snowstorm + config.Snowstorm.EnableSnowstorm = document.querySelector('#EnableSnowstorm').checked; + config.Snowstorm.SnowflakesCount = parseInt(document.querySelector('#SnowstormCount').value); + config.Snowstorm.SnowflakesCountMobile = parseInt(document.querySelector('#SnowstormCountMobile').value); + config.Snowstorm.Speed = parseFloat(document.querySelector('#SnowstormSpeed').value); + config.Snowstorm.HorizontalWind = parseFloat(document.querySelector('#SnowstormHorizontalWind').value); + config.Snowstorm.VerticalVariation = parseFloat(document.querySelector('#SnowstormVerticalVariation').value); + + // Fireworks + config.Fireworks.EnableFireworks = document.querySelector('#EnableFireworks').checked; + config.Fireworks.ParticleCount = parseInt(document.querySelector('#FireworksParticles').value); + config.Fireworks.LaunchInterval = parseInt(document.querySelector('#FireworksInterval').value); + config.Fireworks.ScrollFireworks = document.querySelector('#ScrollFireworks').checked; + config.Fireworks.MinFireworks = parseInt(document.querySelector('#MinFireworks').value); + config.Fireworks.MaxFireworks = parseInt(document.querySelector('#MaxFireworks').value); + + // Halloween + config.Halloween.EnableHalloween = document.querySelector('#EnableHalloween').checked; + config.Halloween.SymbolCount = parseInt(document.querySelector('#HalloweenCount').value); + config.Halloween.EnableRandomSymbols = document.querySelector('#EnableRandomHalloween').checked; + config.Halloween.EnableRandomSymbolsMobile = document.querySelector('#EnableRandomHalloweenMobile').checked; + config.Halloween.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationHalloween').checked; + + // Hearts + config.Hearts.EnableHearts = document.querySelector('#EnableHearts').checked; + config.Hearts.SymbolCount = parseInt(document.querySelector('#HeartsCount').value); + config.Hearts.EnableRandomSymbols = document.querySelector('#EnableRandomHearts').checked; + config.Hearts.EnableRandomSymbolsMobile = document.querySelector('#EnableRandomHeartsMobile').checked; + config.Hearts.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationHearts').checked; + + // Christmas + config.Christmas.EnableChristmas = document.querySelector('#EnableChristmas').checked; + config.Christmas.SymbolCount = parseInt(document.querySelector('#ChristmasCount').value); + config.Christmas.EnableRandomChristmas = document.querySelector('#EnableRandomChristmas').checked; + config.Christmas.EnableRandomChristmasMobile = document.querySelector('#EnableRandomChristmasMobile').checked; + config.Christmas.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationChristmas').checked; + + // Santa + config.Santa.EnableSanta = document.querySelector('#EnableSanta').checked; + config.Santa.SnowflakesCount = parseInt(document.querySelector('#SantaSnowflakes').value); + config.Santa.SnowflakesCountMobile = parseInt(document.querySelector('#SantaSnowflakesMobile').value); + config.Santa.SantaSpeed = parseFloat(document.querySelector('#SantaSpeed').value); + config.Santa.SantaSpeedMobile = parseFloat(document.querySelector('#SantaSpeedMobile').value); + config.Santa.SnowFallSpeed = parseFloat(document.querySelector('#SantaSnowFallSpeed').value); + config.Santa.MaxSantaRestTime = parseFloat(document.querySelector('#MaxSantaRestTime').value); + config.Santa.MinSantaRestTime = parseFloat(document.querySelector('#MinSantaRestTime').value); + config.Santa.MaxPresentFallSpeed = parseFloat(document.querySelector('#MaxPresentFallSpeed').value); + config.Santa.MinPresentFallSpeed = parseFloat(document.querySelector('#MinPresentFallSpeed').value); + + // Easter + config.Easter.EnableEaster = document.querySelector('#EnableEaster').checked; + config.Easter.EggCount = parseInt(document.querySelector('#EasterEggCount').value); + config.Easter.EnableRandomEaster = document.querySelector('#EnableRandomEaster').checked; + config.Easter.EnableRandomEasterMobile = document.querySelector('#EnableRandomEasterMobile').checked; + config.Easter.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationEaster').checked; + config.Easter.EnableBunny = document.querySelector('#EasterBunny').checked; + config.Easter.BunnyDuration = parseInt(document.querySelector('#BunnyDuration').value); + config.Easter.HopHeight = parseInt(document.querySelector('#HopHeight').value); + config.Easter.MinBunnyRestTime = parseInt(document.querySelector('#MinBunnyRestTime').value); + config.Easter.MaxBunnyRestTime = parseInt(document.querySelector('#MaxBunnyRestTime').value); + ApiClient.updatePluginConfiguration(SeasonalsConfig.pluginUniqueId, config).then(function (result) { Dashboard.processPluginConfigurationUpdateResult(result); }); diff --git a/Jellyfin.Plugin.Seasonals/Jellyfin.Plugin.Seasonals.csproj b/Jellyfin.Plugin.Seasonals/Jellyfin.Plugin.Seasonals.csproj index 4c73cb8..a42bea4 100644 --- a/Jellyfin.Plugin.Seasonals/Jellyfin.Plugin.Seasonals.csproj +++ b/Jellyfin.Plugin.Seasonals/Jellyfin.Plugin.Seasonals.csproj @@ -12,7 +12,7 @@ Jellyfin Seasonals Plugin CodeDevMLH - 1.0.0.0 + 1.1.0.0 https://github.com/CodeDevMLH/jellyfin-plugin-seasonals diff --git a/Jellyfin.Plugin.Seasonals/Web/autumn.js b/Jellyfin.Plugin.Seasonals/Web/autumn.js index 336dbc6..f93dd95 100644 --- a/Jellyfin.Plugin.Seasonals/Web/autumn.js +++ b/Jellyfin.Plugin.Seasonals/Web/autumn.js @@ -1,9 +1,11 @@ -const leaves = true; // enable/disable leaves -const randomLeaves = true; // enable random leaves -const randomLeavesMobile = false; // enable random leaves on mobile devices -const enableDiffrentDuration = true; // enable different duration for the random leaves -const enableRotation = false; // enable/disable leaf rotation -const leafCount = 25; // count of random extra leaves +const config = window.SeasonalsPluginConfig?.autumn || {}; + +const leaves = config.enableAutumn !== undefined ? config.enableAutumn : true; // enable/disable leaves +const randomLeaves = config.enableRandomLeaves !== undefined ? config.enableRandomLeaves : true; // enable random leaves +const randomLeavesMobile = config.enableRandomLeavesMobile !== undefined ? config.enableRandomLeavesMobile : false; // enable random leaves on mobile devices (Warning: High values may affect performance) +const enableDiffrentDuration = config.enableDifferentDuration !== undefined ? config.enableDifferentDuration : true; // enable different duration for the random leaves +const enableRotation = config.enableRotation !== undefined ? config.enableRotation : false; // enable/disable leaf rotation +const leafCount = config.leafCount || 25; // count of random extra leaves let msgPrinted = false; // flag to prevent multiple console messages diff --git a/Jellyfin.Plugin.Seasonals/Web/christmas.js b/Jellyfin.Plugin.Seasonals/Web/christmas.js index 732ebc6..5286e9a 100644 --- a/Jellyfin.Plugin.Seasonals/Web/christmas.js +++ b/Jellyfin.Plugin.Seasonals/Web/christmas.js @@ -1,8 +1,10 @@ -const christmas = true; // enable/disable christmas -const randomChristmas = true; // enable random Christmas -const randomChristmasMobile = false; // enable random Christmas on mobile devices -const enableDiffrentDuration = true; // enable different duration for the random Christmas symbols -const christmasCount = 25; // count of random extra christmas +const config = window.SeasonalsPluginConfig?.christmas || {}; + +const christmas = config.enableChristmas !== undefined ? config.enableChristmas : true; // enable/disable christmas +const randomChristmas = config.enableRandomChristmas !== undefined ? config.enableRandomChristmas : true; // enable random Christmas +const randomChristmasMobile = config.enableRandomChristmasMobile !== undefined ? config.enableRandomChristmasMobile : false; // enable random Christmas on mobile devices (Warning: High values may affect performance) +const enableDiffrentDuration = config.enableDifferentDuration !== undefined ? config.enableDifferentDuration : true; // enable different duration for the random Christmas symbols +const christmasCount = config.symbolCount || 25; // count of random extra christmas let msgPrinted = false; // flag to prevent multiple console messages diff --git a/Jellyfin.Plugin.Seasonals/Web/easter.js b/Jellyfin.Plugin.Seasonals/Web/easter.js index b39ac19..0d82fca 100644 --- a/Jellyfin.Plugin.Seasonals/Web/easter.js +++ b/Jellyfin.Plugin.Seasonals/Web/easter.js @@ -1,14 +1,16 @@ -const easter = true; // enable/disable easter -const randomEaster = true; // enable random easter -const randomEasterMobile = false; // enable random easter on mobile devices -const enableDiffrentDuration = true; // enable different duration for the random easter -const easterEggCount = 20; // count of random extra easter +const config = window.SeasonalsPluginConfig?.easter || {}; -const bunny = true; // enable/disable hopping bunny -const bunnyDuration = 12000; // duration of the bunny animation in ms -const hopHeight = 12; // height of the bunny hops in px -const minBunnyRestTime = 2000; // minimum time the bunny rests in ms -const maxBunnyRestTime = 5000; // maximum time the bunny rests in ms +const easter = config.enableEaster !== undefined ? config.enableEaster : true; // enable/disable easter +const randomEaster = config.enableRandomEaster !== undefined ? config.enableRandomEaster : true; // enable random easter +const randomEasterMobile = config.enableRandomEasterMobile !== undefined ? config.enableRandomEasterMobile : false; // enable random easter on mobile devices (Warning: High values may affect performance) +const enableDiffrentDuration = config.enableDifferentDuration !== undefined ? config.enableDifferentDuration : true; // enable different duration for the random easter +const easterEggCount = config.eggCount || 20; // count of random extra easter + +const bunny = config.enableBunny !== undefined ? config.enableBunny : true; // enable/disable hopping bunny +const bunnyDuration = config.bunnyDuration || 12000; // duration of the bunny animation in ms +const hopHeight = config.hopHeight || 12; // height of the bunny hops in px +const minBunnyRestTime = config.minBunnyRestTime || 2000; // minimum time the bunny rests in ms +const maxBunnyRestTime = config.maxBunnyRestTime || 5000; // maximum time the bunny rests in ms let msgPrinted = false; // flag to prevent multiple console messages diff --git a/Jellyfin.Plugin.Seasonals/Web/fireworks.js b/Jellyfin.Plugin.Seasonals/Web/fireworks.js index 15332cd..6852c81 100644 --- a/Jellyfin.Plugin.Seasonals/Web/fireworks.js +++ b/Jellyfin.Plugin.Seasonals/Web/fireworks.js @@ -1,9 +1,11 @@ -const fireworks = true; // enable/disable fireworks -const scrollFireworks = true; // enable fireworks to scroll with page content -const particlesPerFirework = 50; // count of particles per firework -const minFireworks = 3; // minimum number of simultaneous fireworks -const maxFireworks = 6; // maximum number of simultaneous fireworks -const intervalOfFireworks = 3200; // interval for the fireworks in milliseconds +const config = window.SeasonalsPluginConfig?.fireworks || {}; + +const fireworks = config.enableFireworks !== undefined ? config.enableFireworks : true; // enable/disable fireworks +const scrollFireworks = config.scrollFireworks !== undefined ? config.scrollFireworks : true; // enable fireworks to scroll with page content +const particlesPerFirework = config.particleCount || 50; // count of particles per firework (Warning: High values may affect performance) +const minFireworks = config.minFireworks || 3; // minimum number of simultaneous fireworks +const maxFireworks = config.maxFireworks || 6; // maximum number of simultaneous fireworks +const intervalOfFireworks = config.launchInterval || 3200; // interval for the fireworks in milliseconds // array of color palettes for the fireworks const colorPalettes = [ diff --git a/Jellyfin.Plugin.Seasonals/Web/halloween.js b/Jellyfin.Plugin.Seasonals/Web/halloween.js index 19fb816..45050d6 100644 --- a/Jellyfin.Plugin.Seasonals/Web/halloween.js +++ b/Jellyfin.Plugin.Seasonals/Web/halloween.js @@ -1,8 +1,10 @@ -const halloween = true; // enable/disable halloween -const randomSymbols = true; // enable more random symbols -const randomSymbolsMobile = false; // enable random symbols on mobile devices -const enableDiffrentDuration = true; // enable different duration for the random halloween symbols -const halloweenCount = 25; // count of random extra symbols +const config = window.SeasonalsPluginConfig?.halloween || {}; + +const halloween = config.enableHalloween !== undefined ? config.enableHalloween : true; // enable/disable halloween +const randomSymbols = config.enableRandomSymbols !== undefined ? config.enableRandomSymbols : true; // enable more random symbols +const randomSymbolsMobile = config.enableRandomSymbolsMobile !== undefined ? config.enableRandomSymbolsMobile : false; // enable random symbols on mobile devices (Warning: High values may affect performance) +const enableDiffrentDuration = config.enableDifferentDuration !== undefined ? config.enableDifferentDuration : true; // enable different duration for the random halloween symbols +const halloweenCount = config.symbolCount || 25; // count of random extra symbols let msgPrinted = false; // flag to prevent multiple console messages diff --git a/Jellyfin.Plugin.Seasonals/Web/hearts.js b/Jellyfin.Plugin.Seasonals/Web/hearts.js index db5b7a0..26e3644 100644 --- a/Jellyfin.Plugin.Seasonals/Web/hearts.js +++ b/Jellyfin.Plugin.Seasonals/Web/hearts.js @@ -1,8 +1,10 @@ -const hearts = true; // enable/disable hearts -const randomSymbols = true; // enable more random symbols -const randomSymbolsMobile = false; // enable random symbols on mobile devices -const enableDiffrentDuration = true; // enable different animation duration for random symbols -const heartsCount = 25; // count of random extra symbols +const config = window.SeasonalsPluginConfig?.hearts || {}; + +const hearts = config.enableHearts !== undefined ? config.enableHearts : true; // enable/disable hearts +const randomSymbols = config.enableRandomSymbols !== undefined ? config.enableRandomSymbols : true; // enable more random symbols +const randomSymbolsMobile = config.enableRandomSymbolsMobile !== undefined ? config.enableRandomSymbolsMobile : false; // enable random symbols on mobile devices (Warning: High values may affect performance) +const enableDiffrentDuration = config.enableDifferentDuration !== undefined ? config.enableDifferentDuration : true; // enable different animation duration for random symbols +const heartsCount = config.symbolCount || 25; // count of random extra symbols let msgPrinted = false; // flag to prevent multiple console messages diff --git a/Jellyfin.Plugin.Seasonals/Web/santa.js b/Jellyfin.Plugin.Seasonals/Web/santa.js index 89591aa..d6577a7 100644 --- a/Jellyfin.Plugin.Seasonals/Web/santa.js +++ b/Jellyfin.Plugin.Seasonals/Web/santa.js @@ -1,13 +1,15 @@ -const santaIsFlying = true; // enable/disable santa -let snowflakesCount = 500; // count of snowflakes (recommended values: 300-600) -const snowflakesCountMobile = 250; // count of snowflakes on mobile devices -const snowFallSpeed = 3; // speed of snowfall (recommended values: 0-5) -const santaSpeed = 10; // speed of santa in seconds (recommended values: 5000-15000) -const santaSpeedMobile = 8; // speed of santa on mobile devices in seconds -const maxSantaRestTime = 8; // maximum time santa rests in seconds -const minSantaRestTime = 3; // minimum time santa rests in seconds -const maxPresentFallSpeed = 5; // maximum speed of falling presents in seconds -const minPresentFallSpeed = 2; // minimum speed of falling presents in seconds +const config = window.SeasonalsPluginConfig?.santa || {}; + +const santaIsFlying = config.enableSanta !== undefined ? config.enableSanta : true; // enable/disable santa +let snowflakesCount = config.snowflakesCount || 500; // count of snowflakes (recommended values: 300-600) +const snowflakesCountMobile = config.snowflakesCountMobile || 250; // count of snowflakes on mobile devices (Warning: High values may affect performance) +const snowFallSpeed = config.snowFallSpeed || 3; // speed of snowfall (recommended values: 0-5) +const santaSpeed = config.santaSpeed || 10; // speed of santa in seconds (recommended values: 5000-15000) +const santaSpeedMobile = config.santaSpeedMobile || 8; // speed of santa on mobile devices in seconds +const maxSantaRestTime = config.maxSantaRestTime || 8; // maximum time santa rests in seconds +const minSantaRestTime = config.minSantaRestTime || 3; // minimum time santa rests in seconds +const maxPresentFallSpeed = config.maxPresentFallSpeed || 5; // maximum speed of falling presents in seconds +const minPresentFallSpeed = config.minPresentFallSpeed || 2; // minimum speed of falling presents in seconds let msgPrinted = false; // flag to prevent multiple console messages let isMobile = false; // flag to detect mobile devices diff --git a/Jellyfin.Plugin.Seasonals/Web/seasonals.js b/Jellyfin.Plugin.Seasonals/Web/seasonals.js index e8217eb..d232124 100644 --- a/Jellyfin.Plugin.Seasonals/Web/seasonals.js +++ b/Jellyfin.Plugin.Seasonals/Web/seasonals.js @@ -161,6 +161,7 @@ async function initializeTheme() { const config = await response.json(); automateThemeSelection = config.automateSeasonSelection; defaultTheme = config.selectedSeason; + window.SeasonalsPluginConfig = config; } else { console.error('Failed to fetch Seasonals config'); } diff --git a/Jellyfin.Plugin.Seasonals/Web/snowfall.js b/Jellyfin.Plugin.Seasonals/Web/snowfall.js index bfc95c7..9c78638 100644 --- a/Jellyfin.Plugin.Seasonals/Web/snowfall.js +++ b/Jellyfin.Plugin.Seasonals/Web/snowfall.js @@ -1,7 +1,9 @@ -const snowfall = true; // enable/disable snowfall -let snowflakesCount = 500; // count of snowflakes (recommended values: 300-600) -const snowflakesCountMobile = 250; // count of snowflakes on mobile devices -const snowFallSpeed = 3; // speed of snowfall (recommended values: 0-5) +const config = window.SeasonalsPluginConfig?.snowfall || {}; + +const snowfall = config.enableSnowfall !== undefined ? config.enableSnowfall : true; // enable/disable snowfall +let snowflakesCount = config.snowflakesCount || 500; // count of snowflakes (recommended values: 300-600) +const snowflakesCountMobile = config.snowflakesCountMobile || 250; // count of snowflakes on mobile devices (Warning: High values may affect performance) +const snowFallSpeed = config.speed || 3; // speed of snowfall (recommended values: 0-5) let msgPrinted = false; // flag to prevent multiple console messages diff --git a/Jellyfin.Plugin.Seasonals/Web/snowflakes.js b/Jellyfin.Plugin.Seasonals/Web/snowflakes.js index 1ba0519..5c2bf30 100644 --- a/Jellyfin.Plugin.Seasonals/Web/snowflakes.js +++ b/Jellyfin.Plugin.Seasonals/Web/snowflakes.js @@ -1,9 +1,11 @@ -const snowflakes = true; // enable/disable snowflakes -const randomSnowflakes = true; // enable random Snowflakes -const randomSnowflakesMobile = false; // enable random Snowflakes on mobile devices -const enableColoredSnowflakes = true; // enable colored snowflakes on mobile devices -const enableDiffrentDuration = true; // enable different animation duration for random symbols -const snowflakeCount = 25; // count of random extra snowflakes +const config = window.SeasonalsPluginConfig?.snowflakes || {}; + +const snowflakes = config.enableSnowflakes !== undefined ? config.enableSnowflakes : true; // enable/disable snowflakes +const randomSnowflakes = config.enableRandomSnowflakes !== undefined ? config.enableRandomSnowflakes : true; // enable random Snowflakes +const randomSnowflakesMobile = config.enableRandomSnowflakesMobile !== undefined ? config.enableRandomSnowflakesMobile : false; // enable random Snowflakes on mobile devices (Warning: High values may affect performance) +const enableColoredSnowflakes = config.enableColoredSnowflakes !== undefined ? config.enableColoredSnowflakes : true; // enable colored snowflakes on mobile devices +const enableDiffrentDuration = config.enableDifferentDuration !== undefined ? config.enableDifferentDuration : true; // enable different animation duration for random symbols +const snowflakeCount = config.snowflakeCount || 25; // count of random extra snowflakes let msgPrinted = false; // flag to prevent multiple console messages diff --git a/Jellyfin.Plugin.Seasonals/Web/snowstorm.js b/Jellyfin.Plugin.Seasonals/Web/snowstorm.js index eddd6fc..254b364 100644 --- a/Jellyfin.Plugin.Seasonals/Web/snowstorm.js +++ b/Jellyfin.Plugin.Seasonals/Web/snowstorm.js @@ -1,9 +1,11 @@ -const snowstorm = true; // enable/disable snowstorm -let snowflakesCount = 500; // count of snowflakes (recommended values: 300-600) -const snowflakesCountMobile = 250; // count of snowflakes on mobile devices -const snowFallSpeed = 6; // speed of snowfall (recommended values: 4-8) -const horizontalWind = 4; // horizontal wind speed (recommended value: 4) -const verticalVariation = 2; // vertical variation (recommended value: 2) +const config = window.SeasonalsPluginConfig?.snowstorm || {}; + +const snowstorm = config.enableSnowstorm !== undefined ? config.enableSnowstorm : true; // enable/disable snowstorm +let snowflakesCount = config.snowflakesCount || 500; // count of snowflakes (recommended values: 300-600) +const snowflakesCountMobile = config.snowflakesCountMobile || 250; // count of snowflakes on mobile devices (Warning: High values may affect performance) +const snowFallSpeed = config.speed || 6; // speed of snowfall (recommended values: 4-8) +const horizontalWind = config.horizontalWind || 4; // horizontal wind speed (recommended value: 4) +const verticalVariation = config.verticalVariation || 2; // vertical variation (recommended value: 2) let msgPrinted = false; // flag to prevent multiple console messages diff --git a/README.md b/README.md index 2040d8f..31b07dc 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,13 @@ This plugin is based on my manual mod (see the `manual` branch), which builds up - [Overview](#overview) - [Installation](#installation) - [Usage](#usage) + - [Automatic Selection Dates](#automatic-selection-dates) - [Build Process](#build-process) - [Contributing](#contributing) - [Legacy Manual Installation](#legacy-manual-installation) - [Installation](#installation-1) - - [Theme Settings](#theme-settings) + - [Usage](#usage-1) - [Additional Directory: Separate Single Seasonals](#additional-directory-separate-single-seasonals) - - [Troubleshooting](#troubleshooting) --- @@ -91,6 +91,23 @@ After installation and restart: 4. **Save** your settings. 5. **Reload your browser page** (F5 or Ctrl+R) to see the changes. +## Automatic Theme Selection +If automatic selection is enabled, the following themes are applied based on the date. Specific holiday events take precedence over general seasonal themes.: + +| Theme | Active Period | Description | +| :--- | :--- | :--- | +| **`santa`** | Dec 22 – Dec 27 | Christmas theme | +| **`fireworks`** | Dec 28 – Jan 05 | New Year's celebration | +| **`hearts`** | Feb 10 – Feb 18 | Valentine's Day | +| **`easter`** | Mar 25 – Apr 25 | Easter theme | +| **`halloween`** | Oct 24 – Nov 05 | Halloween theme | +| **`snowflakes`** | December (Remainder) | General December winter theme | +| **`snowfall`** | January & February | General winter theme (outside of holidays) | +| **`autumn`** | Sep, Oct, Nov | Fall theme (when not Halloween) | +| **`none`** | All other dates | Default appearance | + +> **Note:** Holiday themes (like `santa` or `fireworks`) override monthly seasonal themes (like `snowflakes`). + ## Build Process If you want to build the plugin yourself: diff --git a/bin/Publish/Jellyfin.Plugin.Seasonals.deps.json b/bin/Publish/Jellyfin.Plugin.Seasonals.deps.json index 0936c1a..7ff4bb9 100644 --- a/bin/Publish/Jellyfin.Plugin.Seasonals.deps.json +++ b/bin/Publish/Jellyfin.Plugin.Seasonals.deps.json @@ -6,7 +6,7 @@ "compilationOptions": {}, "targets": { ".NETCoreApp,Version=v9.0": { - "Jellyfin.Plugin.Seasonals/1.0.0.0": { + "Jellyfin.Plugin.Seasonals/1.1.0.0": { "dependencies": { "Jellyfin.Controller": "10.11.0", "Jellyfin.Model": "10.11.0" @@ -363,7 +363,7 @@ } }, "libraries": { - "Jellyfin.Plugin.Seasonals/1.0.0.0": { + "Jellyfin.Plugin.Seasonals/1.1.0.0": { "type": "project", "serviceable": false, "sha512": "" diff --git a/bin/Publish/Jellyfin.Plugin.Seasonals.dll b/bin/Publish/Jellyfin.Plugin.Seasonals.dll index 75231f7..4e4d4f0 100644 Binary files a/bin/Publish/Jellyfin.Plugin.Seasonals.dll and b/bin/Publish/Jellyfin.Plugin.Seasonals.dll differ diff --git a/bin/Publish/Jellyfin.Plugin.Seasonals.pdb b/bin/Publish/Jellyfin.Plugin.Seasonals.pdb index 3ea46a4..e1474af 100644 Binary files a/bin/Publish/Jellyfin.Plugin.Seasonals.pdb and b/bin/Publish/Jellyfin.Plugin.Seasonals.pdb differ diff --git a/bin/Publish/Jellyfin.Plugin.Seasonals.zip b/bin/Publish/Jellyfin.Plugin.Seasonals.zip index 7168edb..6893df3 100644 Binary files a/bin/Publish/Jellyfin.Plugin.Seasonals.zip and b/bin/Publish/Jellyfin.Plugin.Seasonals.zip differ diff --git a/build.yaml b/build.yaml index d10a5c3..a19222e 100644 --- a/build.yaml +++ b/build.yaml @@ -1,7 +1,7 @@ --- name: "Seasonals" guid: "ef1e863f-cbb0-4e47-9f23-f0cbb1826ad4" -version: "1.0.0.0" +version: "1.1.0.0" targetAbi: "10.11.0.0" framework: "net9.0" overview: "Seasonal effects for Jellyfin" @@ -12,4 +12,4 @@ owner: "CodeDevMLH" artifacts: - "Jellyfin.Plugin.Seasonals.dll" changelog: > - Initial release + Added Advanced Configuration UI for customizing individual seasonal effects. diff --git a/manifest.json b/manifest.json index f315921..677191e 100644 --- a/manifest.json +++ b/manifest.json @@ -6,8 +6,16 @@ "overview": "Seasonal effects for Jellyfin", "owner": "CodeDevMLH", "category": "General", - "imageUrl": "", + "imageUrl": "https://raw.githubusercontent.com/CodeDevMLH/jellyfin-plugin-seasonals/main/icon.png", "versions": [ + { + "version": "1.1.0.0", + "changelog": "Added Advanced Configuration UI for customizing individual seasonal effects.", + "targetAbi": "10.11.0.0", + "sourceUrl": "https://github.com/CodeDevMLH/jellyfin-plugin-seasonals", + "checksum": "CHECKSUM_HIER_EINFÜGEN", + "timestamp": "2025-12-16T00:00:00Z" + }, { "version": "1.0.0.0", "changelog": "Initial release",