Compare commits

...

10 Commits

Author SHA1 Message Date
CodeDevMLH
3dffd847de Refactor Earth Day configuration to replace VineCount with FlowersCount and update related descriptions [skip ci] 2026-02-28 14:08:22 +01:00
CodeDevMLH
9f7ecd9cd0 Update EarthDay configuration to replace VineCount with FlowersCount and adjust flower generation logic 2026-02-28 14:08:12 +01:00
CodeDevMLH
25e678af8d Fix default balloon count in birthday configuration from 15 to 12 [skip ci] 2026-02-28 03:48:05 +01:00
CodeDevMLH
cc2c5eb973 Update manifest.json for release v2.0.0.6 [skip ci] 2026-02-28 02:39:48 +00:00
CodeDevMLH
8c02a07b88 Bump version to 2.0.0.6 and update manifest for new themes and improvements; add mobile symbol count input and error handling in config loading
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 53s
2026-02-28 03:38:56 +01:00
CodeDevMLH
7da6549bf9 Update manifest.json for release v2.0.0.5 [skip ci] 2026-02-28 02:29:30 +00:00
CodeDevMLH
2e6c1534b1 Bump version to 2.0.0.5 and update changelog for new themes and improvements
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 53s
2026-02-28 03:28:39 +01:00
CodeDevMLH
0a301564ac Update manifest.json for release v2.0.0.4 [skip ci] 2026-02-28 02:11:13 +00:00
CodeDevMLH
85e69a0b34 Bump version to 2.0.0.4
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 52s
2026-02-28 03:10:22 +01:00
CodeDevMLH
5adaf202ae Refactor seasonal configuration: remove unused input fields and add Oktoberfest options 2026-02-28 03:10:05 +01:00
6 changed files with 192 additions and 317 deletions

View File

@@ -159,7 +159,7 @@ public class ChristmasOptions {
public class EarthDayOptions { public class EarthDayOptions {
public bool EnableEarthDay { get; set; } = true; public bool EnableEarthDay { get; set; } = true;
public int VineCount { get; set; } = 4; public int FlowersCount { get; set; } = 60;
} }
public class EasterOptions { public class EasterOptions {

View File

@@ -136,12 +136,10 @@
</label> </label>
<div class="fieldDescription">Enable the autumn theme effects in general (e.g. for automation).</div> <div class="fieldDescription">Enable the autumn theme effects in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="AutumnLeafCount">Leaf Count</label> <label class="inputLabel" for="AutumnLeafCount">Leaf Count</label>
<input is="emby-input" type="number" id="AutumnLeafCount" name="AutumnLeafCount" /> <input is="emby-input" type="number" id="AutumnLeafCount" name="AutumnLeafCount" />
<div class="fieldDescription">Number of additional leaves displayed (if enabled)</div> <div class="fieldDescription">Number of leaves displayed</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="AutumnLeafCountMobile">Leaf Count (Mobile)</label> <label class="inputLabel" for="AutumnLeafCountMobile">Leaf Count (Mobile)</label>
@@ -174,12 +172,10 @@
</label> </label>
<div class="fieldDescription">Enable the snowflakes theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the snowflakes theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SnowflakesCount">Snowflake Count</label> <label class="inputLabel" for="SnowflakesCount">Snowflake Count</label>
<input is="emby-input" type="number" id="SnowflakesCount" name="SnowflakesCount" /> <input is="emby-input" type="number" id="SnowflakesCount" name="SnowflakesCount" />
<div class="fieldDescription">Number of additional snowflakes displayed (if enabled).</div> <div class="fieldDescription">Number of snowflakes displayed.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SnowflakeCountMobile">Snowflake Count (Mobile)</label> <label class="inputLabel" for="SnowflakeCountMobile">Snowflake Count (Mobile)</label>
@@ -315,12 +311,10 @@
</label> </label>
<div class="fieldDescription">Enable the Halloween theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Halloween theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="HalloweenCount">Symbol Count</label> <label class="inputLabel" for="HalloweenCount">Symbol Count</label>
<input is="emby-input" type="number" id="HalloweenCount" name="HalloweenCount" /> <input is="emby-input" type="number" id="HalloweenCount" name="HalloweenCount" />
<div class="fieldDescription">Number of additional Halloween symbols (pumpkins, ghosts, etc.) on screen (if enabled).</div> <div class="fieldDescription">Number of Halloween symbols (pumpkins, ghosts, etc.) on screen.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="HalloweenCountMobile">Symbol Count (Mobile)</label> <label class="inputLabel" for="HalloweenCountMobile">Symbol Count (Mobile)</label>
@@ -395,52 +389,6 @@
</details> </details>
<hr style="max-width: 800px; margin: 1em 0;"> <hr style="max-width: 800px; margin: 1em 0;">
<details>
<summary>Underwater</summary>
<div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label">
<input id="EnableUnderwater" name="EnableUnderwater" type="checkbox" is="emby-checkbox" />
<span>Enable Underwater Seasonal</span>
</label>
<div class="fieldDescription">Enable the Underwater theme (fishes, bubbles, seaweed).</div>
</div>
<div class="checkboxContainer">
<label class="emby-checkbox-label">
<input id="EnableUnderwaterLightRays" name="EnableUnderwaterLightRays" type="checkbox" is="emby-checkbox" />
<span>Enable Light Rays (God Rays)</span>
</label>
</div>
<div class="inputContainer">
<label class="inputLabel" for="UnderwaterSymbolCount">Symbol Count</label>
<input is="emby-input" type="number" id="UnderwaterSymbolCount" name="UnderwaterSymbolCount" />
<div class="fieldDescription">Number of sea creatures.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="UnderwaterSymbolCountMobile">Symbol Count (Mobile)</label>
<input is="emby-input" type="number" id="UnderwaterSymbolCountMobile" name="UnderwaterSymbolCountMobile" />
<div class="fieldDescription">Amount of sea creatures on mobile. Minimum 0. Warning: High values may affect performance.</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label">
<input id="EnableRandomUnderwater" name="EnableRandomUnderwater" type="checkbox" is="emby-checkbox" />
<span>Enable Additional Random Symbols</span>
</label>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label">
<input id="EnableRandomUnderwaterMobile" name="EnableRandomUnderwaterMobile" type="checkbox" is="emby-checkbox" />
<span>Enable Additional Random Symbols on Mobile</span>
</label>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label">
<input id="EnableDifferentDurationUnderwater" name="EnableDifferentDurationUnderwater" type="checkbox" is="emby-checkbox" />
<span>Enable Different Duration</span>
</label>
</div>
</details>
<hr style="max-width: 800px; margin: 1em 0;">
<details> <details>
<summary>Hearts</summary> <summary>Hearts</summary>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
@@ -450,12 +398,10 @@
</label> </label>
<div class="fieldDescription">Enable the Hearts theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Hearts theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="HeartsCount">Symbol Count</label> <label class="inputLabel" for="HeartsCount">Symbol Count</label>
<input is="emby-input" type="number" id="HeartsCount" name="HeartsCount" /> <input is="emby-input" type="number" id="HeartsCount" name="HeartsCount" />
<div class="fieldDescription">Number of additional floating hearts.</div> <div class="fieldDescription">Number of hearts displayed.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="HeartsCountMobile">Symbol Count (Mobile)</label> <label class="inputLabel" for="HeartsCountMobile">Symbol Count (Mobile)</label>
@@ -481,12 +427,10 @@
</label> </label>
<div class="fieldDescription">Enable the Christmas theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Christmas theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="ChristmasCount">Symbol Count</label> <label class="inputLabel" for="ChristmasCount">Symbol Count</label>
<input is="emby-input" type="number" id="ChristmasCount" name="ChristmasCount" /> <input is="emby-input" type="number" id="ChristmasCount" name="ChristmasCount" />
<div class="fieldDescription">Number of additional Christmas symbols.</div> <div class="fieldDescription">Number of Christmas symbols.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="ChristmasCountMobile">Symbol Count (Mobile)</label> <label class="inputLabel" for="ChristmasCountMobile">Symbol Count (Mobile)</label>
@@ -569,14 +513,11 @@
</label> </label>
<div class="fieldDescription">Enable the Easter theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Easter theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="EasterEggCount">Egg Count</label> <label class="inputLabel" for="EasterEggCount">Egg Count</label>
<input is="emby-input" type="number" id="EasterEggCount" name="EasterEggCount" /> <input is="emby-input" type="number" id="EasterEggCount" name="EasterEggCount" />
<div class="fieldDescription">Number of additional Easter eggs (if enabled).</div> <div class="fieldDescription">Number of Easter eggs in the lawn.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EasterBunny" name="EasterBunny" type="checkbox" is="emby-checkbox" /> <input id="EasterBunny" name="EasterBunny" type="checkbox" is="emby-checkbox" />
@@ -584,16 +525,6 @@
</label> </label>
<div class="fieldDescription">Show the Easter Bunny hopping across the screen.</div> <div class="fieldDescription">Show the Easter Bunny hopping across the screen.</div>
</div> </div>
<div class="inputContainer">
<label class="inputLabel" for="BunnyDuration">Bunny Duration (ms)</label>
<input is="emby-input" type="number" id="BunnyDuration" name="BunnyDuration" />
<div class="fieldDescription">Time in milliseconds for one hop cycle.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="HopHeight">Hop Height (px)</label>
<input is="emby-input" type="number" id="HopHeight" name="HopHeight" />
<div class="fieldDescription">Height of the bunny's hop in pixels.</div>
</div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="MinBunnyRestTime">Min Bunny Rest Time (ms)</label> <label class="inputLabel" for="MinBunnyRestTime">Min Bunny Rest Time (ms)</label>
<input is="emby-input" type="number" id="MinBunnyRestTime" name="MinBunnyRestTime" /> <input is="emby-input" type="number" id="MinBunnyRestTime" name="MinBunnyRestTime" />
@@ -616,12 +547,10 @@
</label> </label>
<div class="fieldDescription">Enable the Resurrection theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Resurrection theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="ResurrectionSymbolCount">Symbol Count</label> <label class="inputLabel" for="ResurrectionSymbolCount">Symbol Count</label>
<input is="emby-input" type="number" id="ResurrectionSymbolCount" name="ResurrectionSymbolCount" /> <input is="emby-input" type="number" id="ResurrectionSymbolCount" name="ResurrectionSymbolCount" />
<div class="fieldDescription">Number of additional symbols (if enabled).</div> <div class="fieldDescription">Number of resurrection symbols.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="ResurrectionSymbolCountMobile">Symbol Count (Mobile)</label> <label class="inputLabel" for="ResurrectionSymbolCountMobile">Symbol Count (Mobile)</label>
@@ -647,17 +576,10 @@
</label> </label>
<div class="fieldDescription">Enables the Spring theme (grass, pollen).</div> <div class="fieldDescription">Enables the Spring theme (grass, pollen).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SpringPollenCount">Pollen Count</label> <label class="inputLabel" for="SpringPollenCount">Pollen Count</label>
<input is="emby-input" type="number" id="SpringPollenCount" name="SpringPollenCount" /> <input is="emby-input" type="number" id="SpringPollenCount" name="SpringPollenCount" />
<div class="fieldDescription">Number of pollen particles (if enabled).</div> <div class="fieldDescription">Number of pollen particles.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="SpringSunbeamCount">Sunbeam Count</label>
<input is="emby-input" type="number" id="SpringSunbeamCount" name="SpringSunbeamCount" />
<div class="fieldDescription">Number of sunbeams (if enabled).</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
@@ -665,6 +587,11 @@
<span>Enable Sunbeams</span> <span>Enable Sunbeams</span>
</label> </label>
<div class="fieldDescription">Display sunbeams at the top of the screen.</div> <div class="fieldDescription">Display sunbeams at the top of the screen.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="SpringSunbeamCount">Sunbeam Count</label>
<input is="emby-input" type="number" id="SpringSunbeamCount" name="SpringSunbeamCount" />
<div class="fieldDescription">Number of sunbeams.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SpringBirdCount">Bird Count</label> <label class="inputLabel" for="SpringBirdCount">Bird Count</label>
@@ -687,9 +614,9 @@
<div class="fieldDescription">Number of ladybugs walking along the bottom.</div> <div class="fieldDescription">Number of ladybugs walking along the bottom.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SpringSymbolCountMobile">Symbol Count (Mobile)</label> <label class="inputLabel" for="SpringSymbolCountMobile">Symbol Count Mobile (Devisor)</label>
<input is="emby-input" type="number" id="SpringSymbolCountMobile" name="SpringSymbolCountMobile" /> <input is="emby-input" type="number" id="SpringSymbolCountMobile" name="SpringSymbolCountMobile" />
<div class="fieldDescription">Amount of mixed symbols on mobile. Warning: High values may affect performance.</div> <div class="fieldDescription">Devisor of the symbols count for mobile devices.</div>
</div> </div>
</details> </details>
@@ -704,22 +631,20 @@
</label> </label>
<div class="fieldDescription">Enable the Summer theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Summer theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SummerBubbleCount">Bubbles Count</label> <label class="inputLabel" for="SummerBubbleCount">Bubbles Count</label>
<input is="emby-input" type="number" id="SummerBubbleCount" name="SummerBubbleCount" /> <input is="emby-input" type="number" id="SummerBubbleCount" name="SummerBubbleCount" />
<div class="fieldDescription">Number of bubbles (if enabled).</div> <div class="fieldDescription">Number of bubbles.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SummerDustCount">Dust Count</label> <label class="inputLabel" for="SummerDustCount">Dust Count</label>
<input is="emby-input" type="number" id="SummerDustCount" name="SummerDustCount" /> <input is="emby-input" type="number" id="SummerDustCount" name="SummerDustCount" />
<div class="fieldDescription">Number of dust particles (if enabled).</div> <div class="fieldDescription">Number of dust particles.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SummerSymbolCountMobile">Symbol Count (Mobile)</label> <label class="inputLabel" for="SummerSymbolCountMobile">Symbol Count Mobile (Devisor)</label>
<input is="emby-input" type="number" id="SummerSymbolCountMobile" name="SummerSymbolCountMobile" /> <input is="emby-input" type="number" id="SummerSymbolCountMobile" name="SummerSymbolCountMobile" />
<div class="fieldDescription">Amount of mixed symbols on mobile. Warning: High values may affect performance.</div> <div class="fieldDescription">Devisor of the symbols count for mobile devices.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
@@ -740,12 +665,10 @@
</label> </label>
<div class="fieldDescription">Enable the Carnival theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Carnival theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="CarnivalObjectCount">Confetti Count</label> <label class="inputLabel" for="CarnivalObjectCount">Confetti Count</label>
<input is="emby-input" type="number" id="CarnivalObjectCount" name="CarnivalObjectCount" /> <input is="emby-input" type="number" id="CarnivalObjectCount" name="CarnivalObjectCount" />
<div class="fieldDescription">Number of additional confetti pieces (if enabled).</div> <div class="fieldDescription">Number of confetti pieces.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="CarnivalObjectCountMobile">Confetti Count (Mobile)</label> <label class="inputLabel" for="CarnivalObjectCountMobile">Confetti Count (Mobile)</label>
@@ -778,12 +701,10 @@
</label> </label>
<div class="fieldDescription">Enable the Cherry Blossom theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Cherry Blossom theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="CherryBlossomPetalCount">Petal Count</label> <label class="inputLabel" for="CherryBlossomPetalCount">Petal Count</label>
<input is="emby-input" type="number" id="CherryBlossomPetalCount" name="CherryBlossomPetalCount" /> <input is="emby-input" type="number" id="CherryBlossomPetalCount" name="CherryBlossomPetalCount" />
<div class="fieldDescription">Number of additional cherry blossoms (if enabled).</div> <div class="fieldDescription">Number of cherry blossoms.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="CherryBlossomPetalCountMobile">Petal Count (Mobile)</label> <label class="inputLabel" for="CherryBlossomPetalCountMobile">Petal Count (Mobile)</label>
@@ -810,15 +731,13 @@
<div class="fieldDescription">Enable the Earth Day theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Earth Day theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="EarthDayVineCount">Vine Count</label> <label class="inputLabel" for="EarthDayFlowersCount">Flowers Count</label>
<input is="emby-input" type="number" id="EarthDayVineCount" name="EarthDayVineCount" /> <input is="emby-input" type="number" id="EarthDayFlowersCount" name="EarthDayFlowersCount" />
<div class="fieldDescription">Number of animated vines (if enabled).</div> <div class="fieldDescription">Number of flowers in the lawn.</div>
</div> </div>
</details> </details>
<hr style="max-width: 800px; margin: 1em 0;"> <hr style="max-width: 800px; margin: 1em 0;">
<details> <details>
<summary>Sports</summary> <summary>Sports</summary>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
@@ -828,39 +747,38 @@
</label> </label>
<div class="fieldDescription">Enable the sports theme effects in general (e.g. for automation).</div> <div class="fieldDescription">Enable the sports theme effects in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SportsSymbolCount">Symbol Count</label> <label class="inputLabel" for="SportsSymbolCount">Symbol Count</label>
<input is="emby-input" type="number" id="SportsSymbolCount" name="SportsSymbolCount" /> <input is="emby-input" type="number" id="SportsSymbolCount" name="SportsSymbolCount" />
<div class="fieldDescription">Number of additional symbols displayed (if enabled).</div> <div class="fieldDescription">Number of bouncing sports balls visible at once.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="SportsSymbolCountMobile">Symbol Count (Mobile)</label>
<input is="emby-input" type="number" id="SportsSymbolCountMobile" name="SportsSymbolCountMobile" />
<div class="fieldDescription">Amount of symbols on mobile. Minimum 0. Warning: High values may affect performance.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableDifferentDurationSports" name="EnableDifferentDurationSports" type="checkbox" is="emby-checkbox" /> <input id="EnableDifferentDurationSports" name="EnableDifferentDurationSports" type="checkbox" is="emby-checkbox" />
<span>Enable Different Duration</span> <span>Enable Different Duration</span>
</label> </label>
<div class="fieldDescription">Randomize the bouncing speed of each ball.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableTrophy" name="EnableTrophy" type="checkbox" is="emby-checkbox" /> <input id="EnableTrophy" name="EnableTrophy" type="checkbox" is="emby-checkbox" />
<span>Enable Trophy</span> <span>Enable Trophy</span>
</label> </label>
<div class="fieldDescription">Enable the flying trophy animation.</div> <div class="fieldDescription">Show a flying trophy animation.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="TurfColor">Turf Color</label> <label class="inputLabel" for="TurfColor">Turf Color</label>
<input is="emby-input" type="color" id="TurfColor" name="TurfColor" value="#228b22" /> <input is="emby-input" type="color" id="TurfColor" name="TurfColor" value="#228b22" />
<div class="fieldDescription">Color for the grass/turf overlay at the bottom.</div> <div class="fieldDescription">Color of the grass/turf/floor strip at the bottom.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="SportsConfettiColors">Confetti Colors (comma-separated hex) - e.g. national flag colors</label>
<input is="emby-input" type="text" id="SportsConfettiColors" name="SportsConfettiColors" />
<div class="fieldDescription">Colors used for the confetti burst. Example: #000000,#FF0000,#FFCC00</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel">Enabled Sports Balls</label> <label class="inputLabel">Enabled Sports Balls</label>
<div class="fieldDescription" style="margin-bottom: 8px;">Select which sports balls should be featured.</div> <div class="fieldDescription" style="margin-bottom: 8px;">Select which sports balls should be displayed.</div>
<div style="display: flex; flex-wrap: wrap; gap: 15px;"> <div style="display: flex; flex-wrap: wrap; gap: 15px;">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input type="checkbox" is="emby-checkbox" class="sport-ball-cb" value="badminton" /> <input type="checkbox" is="emby-checkbox" class="sport-ball-cb" value="badminton" />
@@ -892,7 +810,7 @@
</label> </label>
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input type="checkbox" is="emby-checkbox" class="sport-ball-cb" value="rugby" /> <input type="checkbox" is="emby-checkbox" class="sport-ball-cb" value="rugby" />
<span>Rugby</span> <span>Rugby/American Football</span>
</label> </label>
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input type="checkbox" is="emby-checkbox" class="sport-ball-cb" value="table_tennis" /> <input type="checkbox" is="emby-checkbox" class="sport-ball-cb" value="table_tennis" />
@@ -908,7 +826,7 @@
</label> </label>
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input type="checkbox" is="emby-checkbox" class="sport-ball-cb" value="waterball" /> <input type="checkbox" is="emby-checkbox" class="sport-ball-cb" value="waterball" />
<span>Waterpolo</span> <span>Water Polo</span>
</label> </label>
</div> </div>
</div> </div>
@@ -924,12 +842,10 @@
</label> </label>
<div class="fieldDescription">Enable the olympia theme effects in general (e.g. for automation).</div> <div class="fieldDescription">Enable the olympia theme effects in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="OlympiaSymbolCount">Symbol Count</label> <label class="inputLabel" for="OlympiaSymbolCount">Symbol Count</label>
<input is="emby-input" type="number" id="OlympiaSymbolCount" name="OlympiaSymbolCount" /> <input is="emby-input" type="number" id="OlympiaSymbolCount" name="OlympiaSymbolCount" />
<div class="fieldDescription">Number of additional symbols displayed (if enabled).</div> <div class="fieldDescription">Number of symbols displayed.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="OlympiaSymbolCountMobile">Symbol Count (Mobile)</label> <label class="inputLabel" for="OlympiaSymbolCountMobile">Symbol Count (Mobile)</label>
@@ -954,37 +870,35 @@
</label> </label>
<div class="fieldDescription">Enable the space theme effects in general (e.g. for automation).</div> <div class="fieldDescription">Enable the space theme effects in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="PlanetCount">Planet Count</label> <label class="inputLabel" for="PlanetCount">Planet Count</label>
<input is="emby-input" type="number" id="PlanetCount" name="PlanetCount" /> <input is="emby-input" type="number" id="PlanetCount" name="PlanetCount" />
<div class="fieldDescription">Number of planets displayed (if enabled).</div> <div class="fieldDescription">Number of planets displayed.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="AstronautCount">Astronaut Count</label> <label class="inputLabel" for="AstronautCount">Astronaut Count</label>
<input is="emby-input" type="number" id="AstronautCount" name="AstronautCount" /> <input is="emby-input" type="number" id="AstronautCount" name="AstronautCount" />
<div class="fieldDescription">Number of astronauts displayed (if enabled).</div> <div class="fieldDescription">Number of astronauts displayed.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SatelliteCount">Satellite Count</label> <label class="inputLabel" for="SatelliteCount">Satellite Count</label>
<input is="emby-input" type="number" id="SatelliteCount" name="SatelliteCount" /> <input is="emby-input" type="number" id="SatelliteCount" name="SatelliteCount" />
<div class="fieldDescription">Number of satellites displayed (if enabled).</div> <div class="fieldDescription">Number of satellites displayed.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="IssCount">ISS Count</label> <label class="inputLabel" for="IssCount">ISS Count</label>
<input is="emby-input" type="number" id="IssCount" name="IssCount" /> <input is="emby-input" type="number" id="IssCount" name="IssCount" />
<div class="fieldDescription">Number of ISS symbols displayed (if enabled).</div> <div class="fieldDescription">Number of ISS displayed.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="RocketCount">Rocket Count</label> <label class="inputLabel" for="RocketCount">Rocket Count</label>
<input is="emby-input" type="number" id="RocketCount" name="RocketCount" /> <input is="emby-input" type="number" id="RocketCount" name="RocketCount" />
<div class="fieldDescription">Number of rockets displayed (if enabled).</div> <div class="fieldDescription">Number of rockets/Space Shuttles displayed.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="SpaceSymbolCountMobile">Symbol Count (Replaces individual counts) (Mobile)</label> <label class="inputLabel" for="SpaceSymbolCountMobile">Symbol Count Mobile (Devisor)</label>
<input is="emby-input" type="number" id="SpaceSymbolCountMobile" name="SpaceSymbolCountMobile" /> <input is="emby-input" type="number" id="SpaceSymbolCountMobile" name="SpaceSymbolCountMobile" />
<div class="fieldDescription">Amount of combined symbols on mobile. Minimum 0. Warning: High values may affect performance.</div> <div class="fieldDescription">Devisor of the symbols count for mobile devices.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
@@ -1011,8 +925,6 @@
</label> </label>
<div class="fieldDescription">Enable god rays from the top.</div> <div class="fieldDescription">Enable god rays from the top.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="UnderwaterSeaweedCount">Seaweed Count</label> <label class="inputLabel" for="UnderwaterSeaweedCount">Seaweed Count</label>
<input is="emby-input" type="number" id="UnderwaterSeaweedCount" name="UnderwaterSeaweedCount" /> <input is="emby-input" type="number" id="UnderwaterSeaweedCount" name="UnderwaterSeaweedCount" />
@@ -1026,26 +938,37 @@
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="UnderwaterSeahorseCount">Seahorse Count</label> <label class="inputLabel" for="UnderwaterSeahorseCount">Seahorse Count</label>
<input is="emby-input" type="number" id="UnderwaterSeahorseCount" name="UnderwaterSeahorseCount" /> <input is="emby-input" type="number" id="UnderwaterSeahorseCount" name="UnderwaterSeahorseCount" />
<div class="fieldDescription">Number of swimming seahorses.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="UnderwaterJellyfishCount">Jellyfish Count</label> <label class="inputLabel" for="UnderwaterJellyfishCount">Jellyfish Count</label>
<input is="emby-input" type="number" id="UnderwaterJellyfishCount" name="UnderwaterJellyfishCount" /> <input is="emby-input" type="number" id="UnderwaterJellyfishCount" name="UnderwaterJellyfishCount" />
<div class="fieldDescription">Number of swimming jellyfish.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="UnderwaterTurtleCount">Turtle Count</label> <label class="inputLabel" for="UnderwaterTurtleCount">Turtle Count</label>
<input is="emby-input" type="number" id="UnderwaterTurtleCount" name="UnderwaterTurtleCount" /> <input is="emby-input" type="number" id="UnderwaterTurtleCount" name="UnderwaterTurtleCount" />
<div class="fieldDescription">Number of swimming turtles.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="UnderwaterCrabCount">Crab Count</label> <label class="inputLabel" for="UnderwaterCrabCount">Crab Count</label>
<input is="emby-input" type="number" id="UnderwaterCrabCount" name="UnderwaterCrabCount" /> <input is="emby-input" type="number" id="UnderwaterCrabCount" name="UnderwaterCrabCount" />
<div class="fieldDescription">Number of crabs at the bottom.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="UnderwaterStarfishCount">Starfish Count</label> <label class="inputLabel" for="UnderwaterStarfishCount">Starfish Count</label>
<input is="emby-input" type="number" id="UnderwaterStarfishCount" name="UnderwaterStarfishCount" /> <input is="emby-input" type="number" id="UnderwaterStarfishCount" name="UnderwaterStarfishCount" />
<div class="fieldDescription">Number of starfish at the bottom.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="UnderwaterShellCount">Shell Count</label> <label class="inputLabel" for="UnderwaterShellCount">Shell Count</label>
<input is="emby-input" type="number" id="UnderwaterShellCount" name="UnderwaterShellCount" /> <input is="emby-input" type="number" id="UnderwaterShellCount" name="UnderwaterShellCount" />
<div class="fieldDescription">Number of shells at the bottom.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="UnderwaterSymbolCountMobile">Symbol Count Mobile (Devisor)</label>
<input is="emby-input" type="number" id="UnderwaterSymbolCountMobile" name="UnderwaterSymbolCountMobile" />
<div class="fieldDescription">Devisor of the symbols count for mobile devices.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
@@ -1065,23 +988,20 @@
</label> </label>
<div class="fieldDescription">Enable the birthday theme effects in general (e.g. for automation).</div> <div class="fieldDescription">Enable the birthday theme effects in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="BirthdaySymbolCount">Symbol Count</label> <label class="inputLabel" for="BirthdaySymbolCount">Balloons Count</label>
<input is="emby-input" type="number" id="BirthdaySymbolCount" name="BirthdaySymbolCount" /> <input is="emby-input" type="number" id="BirthdaySymbolCount" name="BirthdaySymbolCount" />
<div class="fieldDescription">Number of additional symbols displayed (if enabled).</div> <div class="fieldDescription">Number of balloons displayed.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="BirthdaySymbolCountMobile">Symbol Count (Mobile)</label> <label class="inputLabel" for="BirthdaySymbolCountMobile">Balloons Count (Mobile)</label>
<input is="emby-input" type="number" id="BirthdaySymbolCountMobile" name="BirthdaySymbolCountMobile" /> <input is="emby-input" type="number" id="BirthdaySymbolCountMobile" name="BirthdaySymbolCountMobile" />
<div class="fieldDescription">Amount of symbols on mobile. Minimum 0. Warning: High values may affect performance.</div> <div class="fieldDescription">Amount of balloons on mobile. Minimum 0. Warning: High values may affect performance.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="BirthdayConfettiCount">Confetti Count</label> <label class="inputLabel" for="BirthdayConfettiCount">Confetti Count</label>
<input is="emby-input" type="number" id="BirthdayConfettiCount" name="BirthdayConfettiCount" /> <input is="emby-input" type="number" id="BirthdayConfettiCount" name="BirthdayConfettiCount" />
<div class="fieldDescription">Number of confetti pieces created when a balloon bursts.</div> <div class="fieldDescription">Number of confetti pieces.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
@@ -1093,7 +1013,7 @@
<hr style="max-width: 800px; margin: 1em 0;"> <hr style="max-width: 800px; margin: 1em 0;">
<details> <details>
<summary>Eurovision / Musik</summary> <summary>Eurovision / Music</summary>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableEurovision" name="EnableEurovision" type="checkbox" is="emby-checkbox" /> <input id="EnableEurovision" name="EnableEurovision" type="checkbox" is="emby-checkbox" />
@@ -1101,17 +1021,10 @@
</label> </label>
<div class="fieldDescription">Enable the Eurovision/Music theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Eurovision/Music theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="EurovisionSymbolCount">Symbol Count</label> <label class="inputLabel" for="EurovisionSymbolCount">Music Notes Count</label>
<input is="emby-input" type="number" id="EurovisionSymbolCount" name="EurovisionSymbolCount" /> <input is="emby-input" type="number" id="EurovisionSymbolCount" name="EurovisionSymbolCount" />
<div class="fieldDescription">Number of additional dancing music notes (if enabled).</div> <div class="fieldDescription">Number of dancing music notes on screen.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="EurovisionSymbolCountMobile">Symbol Count (Mobile)</label>
<input is="emby-input" type="number" id="EurovisionSymbolCountMobile" name="EurovisionSymbolCountMobile" />
<div class="fieldDescription">Amount of notes on mobile. Minimum 0. Warning: High values may affect performance.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
@@ -1123,7 +1036,7 @@
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableColorfulNotes" name="EnableColorfulNotes" type="checkbox" is="emby-checkbox" /> <input id="EnableColorfulNotes" name="EnableColorfulNotes" type="checkbox" is="emby-checkbox" />
<span>Colorful Notes Mode</span> <span>Colorful Notes</span>
</label> </label>
<div class="fieldDescription">If checked, notes will pick colors from the array below. If unchecked, notes will be white.</div> <div class="fieldDescription">If checked, notes will pick colors from the array below. If unchecked, notes will be white.</div>
</div> </div>
@@ -1149,36 +1062,22 @@
</label> </label>
<div class="fieldDescription">Enable the Matrix theme in general (e.g. for automation).</div> <div class="fieldDescription">Enable the Matrix theme in general (e.g. for automation).</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="MatrixSymbolCount">Symbol Count</label> <label class="inputLabel" for="MatrixSymbolCount">Symbol Count</label>
<input is="emby-input" type="number" id="MatrixSymbolCount" name="MatrixSymbolCount" /> <input is="emby-input" type="number" id="MatrixSymbolCount" name="MatrixSymbolCount" />
<div class="fieldDescription">Number of additional digital rain columns (if enabled).</div> <div class="fieldDescription">Number of digital rain columns.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="MatrixSymbolCountMobile">Symbol Count (Mobile)</label>
<input is="emby-input" type="number" id="MatrixSymbolCountMobile" name="MatrixSymbolCountMobile" />
<div class="fieldDescription">Amount of rain columns on mobile. Minimum 0. Warning: High values may affect performance.</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="MatrixChars">Raining Characters</label> <label class="inputLabel" for="MatrixChars">Raining Characters</label>
<input is="emby-input" type="text" id="MatrixChars" name="MatrixChars" /> <input is="emby-input" type="text" id="MatrixChars" name="MatrixChars" />
<div class="fieldDescription">Characters to use for the rain effect (default is 0-9).</div> <div class="fieldDescription">Characters to use for the rain effect (default is 0-9).</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label">
<input id="EnableDifferentDurationMatrix" name="EnableDifferentDurationMatrix" type="checkbox" is="emby-checkbox" />
<span>Enable Different Falling Speed</span>
</label>
<div class="fieldDescription">Randomize the digital rain falling speed.</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableMatrixBackground" name="EnableMatrixBackground" type="checkbox" is="emby-checkbox" /> <input id="EnableMatrixBackground" name="EnableMatrixBackground" type="checkbox" is="emby-checkbox" />
<span>Background Mode (Behind UI)</span> <span>Background Mode (Behind UI)</span>
</label> </label>
<div class="fieldDescription">Displays the Matrix animation behind library tiles and content.</div> <div class="fieldDescription">Displays the Matrix animation behind library tiles and content as "Background"</div>
</div> </div>
</details> </details>
<hr style="max-width: 800px; margin: 1em 0;"> <hr style="max-width: 800px; margin: 1em 0;">
@@ -1200,12 +1099,7 @@
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel" for="PrideHeartSize">Heart Size (rem)</label> <label class="inputLabel" for="PrideHeartSize">Heart Size (rem)</label>
<input is="emby-input" type="number" id="PrideHeartSize" name="PrideHeartSize" step="0.1" /> <input is="emby-input" type="number" id="PrideHeartSize" name="PrideHeartSize" step="0.1" />
<div class="fieldDescription">Base size of the Pride hearts (default 2).</div> <div class="fieldDescription">Base size of the Pride hearts (default 1.5).</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="PrideConfettiCount">Confetti Count</label>
<input is="emby-input" type="number" id="PrideConfettiCount" name="PrideConfettiCount" />
<div class="fieldDescription">Number of falling rainbow confetti pieces.</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
@@ -1285,6 +1179,7 @@
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableFrost" name="EnableFrost" type="checkbox" is="emby-checkbox" /> <input id="EnableFrost" name="EnableFrost" type="checkbox" is="emby-checkbox" />
<span>Enable Frost Seasonal</span> <span>Enable Frost Seasonal</span>
<div class="fieldDescription">Enable the Frost theme in general (e.g. for automation).</div>
</label> </label>
</div> </div>
</details> </details>
@@ -1296,6 +1191,7 @@
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableFilmNoir" name="EnableFilmNoir" type="checkbox" is="emby-checkbox" /> <input id="EnableFilmNoir" name="EnableFilmNoir" type="checkbox" is="emby-checkbox" />
<span>Enable Film-Noir Seasonal</span> <span>Enable Film-Noir Seasonal</span>
<div class="fieldDescription">Enable the Film-Noir theme in general (e.g. for automation).</div>
</label> </label>
</div> </div>
</details> </details>
@@ -1307,6 +1203,7 @@
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableOscar" name="EnableOscar" type="checkbox" is="emby-checkbox" /> <input id="EnableOscar" name="EnableOscar" type="checkbox" is="emby-checkbox" />
<span>Enable Oscar Awards Seasonal</span> <span>Enable Oscar Awards Seasonal</span>
<div class="fieldDescription">Enable the Oscar Awards theme in general (e.g. for automation).</div>
</label> </label>
</div> </div>
</details> </details>
@@ -1318,14 +1215,15 @@
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableMarioDay" name="EnableMarioDay" type="checkbox" is="emby-checkbox" /> <input id="EnableMarioDay" name="EnableMarioDay" type="checkbox" is="emby-checkbox" />
<span>Enable Mario Day Seasonal</span> <span>Enable Mario Day Seasonal</span>
<div class="fieldDescription">Enable the Mario Day theme in general (e.g. for automation).</div>
</label> </label>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="LetMarioJump" name="LetMarioJump" type="checkbox" is="emby-checkbox" /> <input id="LetMarioJump" name="LetMarioJump" type="checkbox" is="emby-checkbox" />
<span>Let Mario Jump</span> <span>Let Mario Jump</span>
<div class="fieldDescription">Lets Mario jump randomly.</div>
</label> </label>
<div class="fieldDescription">Allow Mario to jump periodically.</div>
</div> </div>
</details> </details>
<hr style="max-width: 800px; margin: 1em 0;"> <hr style="max-width: 800px; margin: 1em 0;">
@@ -1336,6 +1234,7 @@
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableStarWars" name="EnableStarWars" type="checkbox" is="emby-checkbox" /> <input id="EnableStarWars" name="EnableStarWars" type="checkbox" is="emby-checkbox" />
<span>Enable Star Wars Seasonal</span> <span>Enable Star Wars Seasonal</span>
<div class="fieldDescription">Enable the Star Wars theme in general (e.g. for automation).</div>
</label> </label>
</div> </div>
</details> </details>
@@ -1347,6 +1246,24 @@
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableOktoberfest" name="EnableOktoberfest" type="checkbox" is="emby-checkbox" /> <input id="EnableOktoberfest" name="EnableOktoberfest" type="checkbox" is="emby-checkbox" />
<span>Enable Oktoberfest Seasonal</span> <span>Enable Oktoberfest Seasonal</span>
<div class="fieldDescription">Enable the Oktoberfest theme in general (e.g. for automation).</div>
</label>
</div>
<div class="inputContainer">
<label class="inputLabel" for="OktoberfestCount">Symbol Count</label>
<input is="emby-input" type="number" id="OktoberfestCount" name="OktoberfestCount" />
<div class="fieldDescription">Total number of symbols in the Oktoberfest theme.</div>
</div>
<div class="inputContainer">
<label class="inputLabel" for="OktoberfestCountMobile">Symbol Count (Mobile)</label>
<input is="emby-input" type="number" id="OktoberfestCountMobile" name="OktoberfestCountMobile" />
<div class="fieldDescription">Total number of symbols on mobile devices. Warning: High values may affect performance.</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label">
<input id="EnableDifferentDurationOktoberfest" name="EnableDifferentDurationOktoberfest" type="checkbox" is="emby-checkbox" />
<span>Enable Different Duration</span>
<div class="fieldDescription">Randomize the Oktoberfest symbol duration.</div>
</label> </label>
</div> </div>
</details> </details>
@@ -1358,6 +1275,7 @@
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableFriday13" name="EnableFriday13" type="checkbox" is="emby-checkbox" /> <input id="EnableFriday13" name="EnableFriday13" type="checkbox" is="emby-checkbox" />
<span>Enable Friday the 13th Seasonal</span> <span>Enable Friday the 13th Seasonal</span>
<div class="fieldDescription">Enable the Friday the 13th theme in general (e.g. for automation).</div>
</label> </label>
</div> </div>
</details> </details>
@@ -1369,6 +1287,7 @@
<label class="emby-checkbox-label"> <label class="emby-checkbox-label">
<input id="EnableEid" name="EnableEid" type="checkbox" is="emby-checkbox" /> <input id="EnableEid" name="EnableEid" type="checkbox" is="emby-checkbox" />
<span>Enable Eid al-Fitr Seasonal</span> <span>Enable Eid al-Fitr Seasonal</span>
<div class="fieldDescription">Enable the Eid al-Fitr theme in general (e.g. for automation).</div>
</label> </label>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
@@ -1652,12 +1571,11 @@
Dashboard.showLoadingMsg(); Dashboard.showLoadingMsg();
ApiClient.getPluginConfiguration(SeasonalsConfigPage.pluginUniqueId).then(function (config) { ApiClient.getPluginConfiguration(SeasonalsConfigPage.pluginUniqueId).then(function (config) {
try {
document.querySelector('#SeasonalsIsEnabled').checked = config.IsEnabled; document.querySelector('#SeasonalsIsEnabled').checked = config.IsEnabled;
document.querySelector('#SeasonalsSelectedSeason').value = config.SelectedSeason; document.querySelector('#SeasonalsSelectedSeason').value = config.SelectedSeason;
document.querySelector('#SeasonalsAutomateSeasonSelection').checked = config.AutomateSeasonSelection; document.querySelector('#SeasonalsAutomateSeasonSelection').checked = config.AutomateSeasonSelection;
document.querySelector('#SeasonalsEnableClientSideToggle').checked = config.EnableClientSideToggle !== undefined ? config.EnableClientSideToggle : true; document.querySelector('#SeasonalsEnableClientSideToggle').checked = config.EnableClientSideToggle !== undefined ? config.EnableClientSideToggle : true;
if (!config.Autumn) config.Autumn = {}; if (!config.Autumn) config.Autumn = {};
if (!config.Birthday) config.Birthday = {}; if (!config.Birthday) config.Birthday = {};
if (!config.Carnival) config.Carnival = {}; if (!config.Carnival) config.Carnival = {};
@@ -1746,7 +1664,7 @@
// EarthDay // EarthDay
document.querySelector('#EnableEarthDay').checked = config.EarthDay.EnableEarthDay; document.querySelector('#EnableEarthDay').checked = config.EarthDay.EnableEarthDay;
document.querySelector('#EarthDayVineCount').value = config.EarthDay.VineCount; document.querySelector('#EarthDayFlowersCount').value = config.EarthDay.FlowersCount;
// Easter // Easter
@@ -1758,13 +1676,12 @@
// Eurovision // Eurovision
document.querySelector('#EnableEurovision').checked = config.Eurovision.EnableEurovision; document.querySelector('#EnableEurovision').checked = config.Eurovision.EnableEurovision !== false;
document.querySelector('#EurovisionSymbolCount').value = config.Eurovision.SymbolCount; document.querySelector('#EurovisionSymbolCount').value = config.Eurovision.SymbolCount !== undefined ? config.Eurovision.SymbolCount : 25;
document.querySelector('#EurovisionSymbolCountMobile').value = config.Eurovision.SymbolCountMobile; document.querySelector('#EnableDifferentDurationEurovision').checked = config.Eurovision.EnableDifferentDuration !== false;
document.querySelector('#EnableDifferentDurationEurovision').checked = config.Eurovision.EnableDifferentDuration; document.querySelector('#EnableColorfulNotes').checked = config.Eurovision.EnableColorfulNotes !== false;
document.querySelector('#EnableColorfulNotes').checked = config.Eurovision.EnableColorfulNotes; document.querySelector('#EurovisionColors').value = config.Eurovision.EurovisionColors || '#ff0026ff,#17a6ffff,#32d432ff,#FFD700,#f0821bff,#f826f8ff';
document.querySelector('#EurovisionColors').value = config.Eurovision.EurovisionColors; document.querySelector('#EurovisionGlowSize').value = config.Eurovision.EurovisionGlowSize !== undefined ? config.Eurovision.EurovisionGlowSize : 2;
document.querySelector('#EurovisionGlowSize').value = config.Eurovision.EurovisionGlowSize;
// Fireworks // Fireworks
@@ -1793,11 +1710,9 @@
// Matrix // Matrix
document.querySelector('#EnableMatrix').checked = config.Matrix.EnableMatrix; document.querySelector('#EnableMatrix').checked = config.Matrix.EnableMatrix !== false;
document.querySelector('#MatrixSymbolCount').value = config.Matrix.SymbolCount; document.querySelector('#MatrixSymbolCount').value = config.Matrix.SymbolCount !== undefined ? config.Matrix.SymbolCount : 25;
document.querySelector('#MatrixSymbolCountMobile').value = config.Matrix.SymbolCountMobile;
document.querySelector('#MatrixChars').value = config.Matrix.MatrixChars !== undefined ? config.Matrix.MatrixChars : '0123456789'; document.querySelector('#MatrixChars').value = config.Matrix.MatrixChars !== undefined ? config.Matrix.MatrixChars : '0123456789';
document.querySelector('#EnableDifferentDurationMatrix').checked = config.Matrix.EnableDifferentDuration;
document.querySelector('#EnableMatrixBackground').checked = config.Matrix.EnableMatrixBackground !== undefined ? config.Matrix.EnableMatrixBackground : false; document.querySelector('#EnableMatrixBackground').checked = config.Matrix.EnableMatrixBackground !== undefined ? config.Matrix.EnableMatrixBackground : false;
// Olympia // Olympia
@@ -1889,57 +1804,50 @@
document.querySelector('#EnableDifferentDurationSpooky').checked = config.Spooky.EnableDifferentDuration !== false; document.querySelector('#EnableDifferentDurationSpooky').checked = config.Spooky.EnableDifferentDuration !== false;
// Sports // Sports
if (!config.Sports) config.Sports = { EnableSports: true, SymbolCount: 25, EnableRandomSymbols: true, EnableRandomSymbolsMobile: false, EnableDifferentDuration: true };
// Load Checkboxes
const savedBallsString = config.Sports.SportsBalls || 'football,basketball,tennis,volleyball'; const savedBallsString = config.Sports.SportsBalls || 'football,basketball,tennis,volleyball';
const savedBalls = savedBallsString.split(','); const savedBalls = savedBallsString.split(',');
document.querySelector('#EnableSports').checked = config.Sports.EnableSports !== false; document.querySelector('#EnableSports').checked = config.Sports.EnableSports !== false;
document.querySelector('#EnableDifferentDurationSports').checked = config.Sports.EnableDifferentDuration !== false; document.querySelector('#EnableDifferentDurationSports').checked = config.Sports.EnableDifferentDuration !== false;
document.querySelector('#SportsSymbolCount').value = config.Sports.SymbolCount || 25; document.querySelector('#SportsSymbolCount').value = config.Sports.SymbolCount !== undefined ? config.Sports.SymbolCount : 5;
document.querySelector('#SportsSymbolCountMobile').value = config.Sports.SymbolCountMobile || 10;
document.querySelector('#TurfColor').value = config.Sports.TurfColor || '#228b22'; document.querySelector('#TurfColor').value = config.Sports.TurfColor || '#228b22';
document.querySelector('#EnableTrophy').checked = config.Sports.EnableTrophy !== false; document.querySelector('#SportsConfettiColors').value = config.Sports.ConfettiColors || '#000000,#FF0000,#FFCC00';
document.querySelector('#EnableTrophy').checked = config.Sports.EnableTrophy === true;
document.querySelectorAll('.sport-ball-cb').forEach(cb => { document.querySelectorAll('.sport-ball-cb').forEach(cb => {
// Spring
document.querySelector('#EnableSpring').checked = config.Spring.EnableSpring;
document.querySelector('#EnableSpringSunbeams').checked = config.Spring.EnableSpringSunbeams !== undefined ? config.Spring.EnableSpringSunbeams : true;
document.querySelector('#SpringPollenCount').value = config.Spring.PollenCount;
document.querySelector('#SpringSunbeamCount').value = config.Spring.SunbeamCount;
document.querySelector('#SpringBirdCount').value = config.Spring.BirdCount !== undefined ? config.Spring.BirdCount : 3;
document.querySelector('#SpringButterflyCount').value = config.Spring.ButterflyCount !== undefined ? config.Spring.ButterflyCount : 2;
document.querySelector('#SpringBeeCount').value = config.Spring.BeeCount !== undefined ? config.Spring.BeeCount : 1;
document.querySelector('#SpringLadybugCount').value = config.Spring.LadybugCount !== undefined ? config.Spring.LadybugCount : 1;
document.querySelector('#SpringSymbolCountMobile').value = config.Spring.SymbolCountMobile !== undefined ? config.Spring.SymbolCountMobile : 5;
// Storm
document.querySelector('#EnableStorm').checked = config.Storm.EnableStorm;
document.querySelector('#StormRaindropCount').value = config.Storm.RaindropCount;
document.querySelector('#StormRaindropCountMobile').value = config.Storm.RaindropCountMobile;
document.querySelector('#StormRainSpeed').value = config.Storm.RainSpeed;
document.querySelector('#StormEnableLightning').checked = config.Storm.EnableLightning;
// Summer
document.querySelector('#EnableSummer').checked = config.Summer.EnableSummer;
document.querySelector('#SummerBubbleCount').value = config.Summer.BubbleCount;
document.querySelector('#SummerDustCount').value = config.Summer.DustCount;
document.querySelector('#SummerSymbolCountMobile').value = config.Summer.SymbolCountMobile;
document.querySelector('#EnableDifferentDurationSummer').checked = config.Summer.EnableDifferentDuration;
// Support for both new category string and legacy filename strings
cb.checked = savedBalls.some(b => b === cb.value || b.startsWith(cb.value + '_')); cb.checked = savedBalls.some(b => b === cb.value || b.startsWith(cb.value + '_'));
}); });
// Spring
document.querySelector('#EnableSpring').checked = config.Spring.EnableSpring !== false;
document.querySelector('#EnableSpringSunbeams').checked = config.Spring.EnableSpringSunbeams !== false;
document.querySelector('#SpringPollenCount').value = config.Spring.PollenCount !== undefined ? config.Spring.PollenCount : 30;
document.querySelector('#SpringSunbeamCount').value = config.Spring.SunbeamCount !== undefined ? config.Spring.SunbeamCount : 5;
document.querySelector('#SpringBirdCount').value = config.Spring.BirdCount !== undefined ? config.Spring.BirdCount : 3;
document.querySelector('#SpringButterflyCount').value = config.Spring.ButterflyCount !== undefined ? config.Spring.ButterflyCount : 4;
document.querySelector('#SpringBeeCount').value = config.Spring.BeeCount !== undefined ? config.Spring.BeeCount : 2;
document.querySelector('#SpringLadybugCount').value = config.Spring.LadybugCount !== undefined ? config.Spring.LadybugCount : 2;
document.querySelector('#SpringSymbolCountMobile').value = config.Spring.SymbolCountMobile !== undefined ? config.Spring.SymbolCountMobile : 2;
// Storm
document.querySelector('#EnableStorm').checked = config.Storm.EnableStorm !== false;
document.querySelector('#StormRaindropCount').value = config.Storm.RaindropCount !== undefined ? config.Storm.RaindropCount : 300;
document.querySelector('#StormRaindropCountMobile').value = config.Storm.RaindropCountMobile !== undefined ? config.Storm.RaindropCountMobile : 150;
document.querySelector('#StormRainSpeed').value = config.Storm.RainSpeed !== undefined ? config.Storm.RainSpeed : 1.0;
document.querySelector('#StormEnableLightning').checked = config.Storm.EnableLightning !== false;
// Summer
document.querySelector('#EnableSummer').checked = config.Summer.EnableSummer !== false;
document.querySelector('#SummerBubbleCount').value = config.Summer.BubbleCount !== undefined ? config.Summer.BubbleCount : 30;
document.querySelector('#SummerDustCount').value = config.Summer.DustCount !== undefined ? config.Summer.DustCount : 50;
document.querySelector('#SummerSymbolCountMobile').value = config.Summer.SymbolCountMobile !== undefined ? config.Summer.SymbolCountMobile : 2;
document.querySelector('#EnableDifferentDurationSummer').checked = config.Summer.EnableDifferentDuration !== false;
// Underwater // Underwater
document.querySelector('#EnableUnderwater').checked = config.Underwater.EnableUnderwater !== false; document.querySelector('#EnableUnderwater').checked = config.Underwater.EnableUnderwater !== false;
document.querySelector('#EnableUnderwaterLightRays').checked = config.Underwater.EnableLightRays !== false;
document.querySelector('#EnableDifferentDurationUnderwater').checked = config.Underwater.EnableDifferentDuration !== false; document.querySelector('#EnableDifferentDurationUnderwater').checked = config.Underwater.EnableDifferentDuration !== false;
document.querySelector('#UnderwaterSeaweedCount').value = config.Underwater.SeaweedCount !== undefined ? config.Underwater.SeaweedCount : 30; document.querySelector('#UnderwaterSymbolCountMobile').value = config.Underwater.SymbolCountMobile !== undefined ? config.Underwater.SymbolCountMobile : 2;
document.querySelector('#UnderwaterSeaweedCount').value = config.Underwater.SeaweedCount !== undefined ? config.Underwater.SeaweedCount : 50;
document.querySelector('#UnderwaterFishCount').value = config.Underwater.FishCount !== undefined ? config.Underwater.FishCount : 15; document.querySelector('#UnderwaterFishCount').value = config.Underwater.FishCount !== undefined ? config.Underwater.FishCount : 15;
document.querySelector('#UnderwaterSeahorseCount').value = config.Underwater.SeahorseCount !== undefined ? config.Underwater.SeahorseCount : 3; document.querySelector('#UnderwaterSeahorseCount').value = config.Underwater.SeahorseCount !== undefined ? config.Underwater.SeahorseCount : 3;
document.querySelector('#UnderwaterJellyfishCount').value = config.Underwater.JellyfishCount !== undefined ? config.Underwater.JellyfishCount : 3; document.querySelector('#UnderwaterJellyfishCount').value = config.Underwater.JellyfishCount !== undefined ? config.Underwater.JellyfishCount : 3;
@@ -1947,13 +1855,27 @@
document.querySelector('#UnderwaterCrabCount').value = config.Underwater.CrabCount !== undefined ? config.Underwater.CrabCount : 2; document.querySelector('#UnderwaterCrabCount').value = config.Underwater.CrabCount !== undefined ? config.Underwater.CrabCount : 2;
document.querySelector('#UnderwaterStarfishCount').value = config.Underwater.StarfishCount !== undefined ? config.Underwater.StarfishCount : 2; document.querySelector('#UnderwaterStarfishCount').value = config.Underwater.StarfishCount !== undefined ? config.Underwater.StarfishCount : 2;
document.querySelector('#UnderwaterShellCount').value = config.Underwater.ShellCount !== undefined ? config.Underwater.ShellCount : 2; document.querySelector('#UnderwaterShellCount').value = config.Underwater.ShellCount !== undefined ? config.Underwater.ShellCount : 2;
config.Underwater = config.Underwater || {}; // Simple Themes
document.querySelector('#EnableUnderwaterLightRays').checked = config.Underwater.EnableLightRays !== false; document.querySelector('#EnableFrost').checked = config.Frost.EnableFrost !== false;
document.querySelector('#UnderwaterSymbolCount').value = config.Underwater.SymbolCount || 15; document.querySelector('#EnableFilmNoir').checked = config.FilmNoir.EnableFilmNoir !== false;
document.querySelector('#UnderwaterSymbolCountMobile').value = config.Underwater.SymbolCountMobile || 5; document.querySelector('#EnableOscar').checked = config.Oscar.EnableOscar !== false;
document.querySelector('#EnableMarioDay').checked = config.MarioDay.EnableMarioDay !== false;
document.querySelector('#LetMarioJump').checked = config.MarioDay.LetMarioJump !== false;
document.querySelector('#EnableStarWars').checked = config.StarWars.EnableStarWars !== false;
document.querySelector('#EnableFriday13').checked = config.Friday13.EnableFriday13 !== false;
document.querySelector('#EnableOktoberfest').checked = config.Oktoberfest.EnableOktoberfest !== false;
document.querySelector('#OktoberfestCount').value = config.Oktoberfest.SymbolCount !== undefined ? config.Oktoberfest.SymbolCount : 25;
document.querySelector('#OktoberfestCountMobile').value = config.Oktoberfest.SymbolCountMobile !== undefined ? config.Oktoberfest.SymbolCountMobile : 10;
document.querySelector('#EnableDifferentDurationOktoberfest').checked = config.Oktoberfest.EnableDifferentDuration !== false;
document.querySelector('#EnableEid').checked = config.Eid.EnableEid !== false;
document.querySelector('#EidLanternCount').value = config.Eid.LanternCount !== undefined ? config.Eid.LanternCount : 8;
document.querySelector('#EidLanternCountMobile').value = config.Eid.LanternCountMobile !== undefined ? config.Eid.LanternCountMobile : 3;
} catch(e) {
Dashboard.hideLoadingMsg(); console.error('[Seasonals] Error loading config:', e);
} finally {
Dashboard.hideLoadingMsg();
}
}); });
}); });
@@ -1977,22 +1899,7 @@
config.Autumn.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationAutumn').checked; config.Autumn.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationAutumn').checked;
config.Autumn.EnableRotation = document.querySelector('#EnableRotation').checked; config.Autumn.EnableRotation = document.querySelector('#EnableRotation').checked;
// Sports (saved later to avoid duplicate)
// Sports
if (!config.Sports) config.Sports = {};
config.Sports.EnableSports = document.querySelector('#EnableSports').checked;
config.Sports.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationSports').checked;
config.Sports.SymbolCount = parseInt(document.querySelector('#SportsSymbolCount').value);
config.Sports.SymbolCountMobile = parseInt(document.querySelector('#SportsSymbolCountMobile').value);
config.Sports.TurfColor = document.querySelector('#TurfColor').value;
config.Sports.EnableTrophy = document.querySelector('#EnableTrophy').checked;
// Save Checkboxes
const selectedBalls = Array.from(document.querySelectorAll('.sport-ball-cb'))
.filter(cb => cb.checked)
.map(cb => cb.value);
config.Sports.SportsBalls = selectedBalls.join(',');
// Olympia // Olympia
if (!config.Olympia) config.Olympia = {}; if (!config.Olympia) config.Olympia = {};
@@ -2012,21 +1919,7 @@
config.Space.RocketCount = parseInt(document.querySelector('#RocketCount').value); config.Space.RocketCount = parseInt(document.querySelector('#RocketCount').value);
config.Space.SymbolCountMobile = parseInt(document.querySelector('#SpaceSymbolCountMobile').value); config.Space.SymbolCountMobile = parseInt(document.querySelector('#SpaceSymbolCountMobile').value);
// Underwater // Underwater (saved later)
if (!config.Underwater) config.Underwater = {};
config.Underwater.EnableUnderwater = document.querySelector('#EnableUnderwater').checked;
config.Underwater.EnableUnderwaterLightRays = document.querySelector('#EnableUnderwaterLightRays').checked;
config.Underwater.EnableRandomSymbols = document.querySelector('#EnableRandomSymbolsUnderwater').checked;
config.Underwater.EnableRandomSymbolsMobile = document.querySelector('#EnableRandomSymbolsMobileUnderwater').checked;
config.Underwater.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationUnderwater').checked;
config.Underwater.SeaweedCount = parseInt(document.querySelector('#UnderwaterSeaweedCount').value);
config.Underwater.FishCount = parseInt(document.querySelector('#UnderwaterFishCount').value);
config.Underwater.SeahorseCount = parseInt(document.querySelector('#UnderwaterSeahorseCount').value);
config.Underwater.JellyfishCount = parseInt(document.querySelector('#UnderwaterJellyfishCount').value);
config.Underwater.TurtleCount = parseInt(document.querySelector('#UnderwaterTurtleCount').value);
config.Underwater.CrabCount = parseInt(document.querySelector('#UnderwaterCrabCount').value);
config.Underwater.StarfishCount = parseInt(document.querySelector('#UnderwaterStarfishCount').value);
config.Underwater.ShellCount = parseInt(document.querySelector('#UnderwaterShellCount').value);
// Birthday // Birthday
if (!config.Birthday) config.Birthday = {}; if (!config.Birthday) config.Birthday = {};
@@ -2150,12 +2043,11 @@
// Earth Day // Earth Day
config.EarthDay.EnableEarthDay = document.querySelector('#EnableEarthDay').checked; config.EarthDay.EnableEarthDay = document.querySelector('#EnableEarthDay').checked;
config.EarthDay.VineCount = parseInt(document.querySelector('#EarthDayVineCount').value); config.EarthDay.FlowersCount = parseInt(document.querySelector('#EarthDayFlowersCount').value);
// Eurovision // Eurovision
config.Eurovision.EnableEurovision = document.querySelector('#EnableEurovision').checked; config.Eurovision.EnableEurovision = document.querySelector('#EnableEurovision').checked;
config.Eurovision.SymbolCount = parseInt(document.querySelector('#EurovisionSymbolCount').value); config.Eurovision.SymbolCount = parseInt(document.querySelector('#EurovisionSymbolCount').value);
config.Eurovision.SymbolCountMobile = parseInt(document.querySelector('#EurovisionSymbolCountMobile').value);
config.Eurovision.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationEurovision').checked; config.Eurovision.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationEurovision').checked;
config.Eurovision.EnableColorfulNotes = document.querySelector('#EnableColorfulNotes').checked; config.Eurovision.EnableColorfulNotes = document.querySelector('#EnableColorfulNotes').checked;
config.Eurovision.EurovisionColors = document.querySelector('#EurovisionColors').value; config.Eurovision.EurovisionColors = document.querySelector('#EurovisionColors').value;
@@ -2164,9 +2056,7 @@
// Matrix // Matrix
config.Matrix.EnableMatrix = document.querySelector('#EnableMatrix').checked; config.Matrix.EnableMatrix = document.querySelector('#EnableMatrix').checked;
config.Matrix.SymbolCount = parseInt(document.querySelector('#MatrixSymbolCount').value); config.Matrix.SymbolCount = parseInt(document.querySelector('#MatrixSymbolCount').value);
config.Matrix.SymbolCountMobile = parseInt(document.querySelector('#MatrixSymbolCountMobile').value);
config.Matrix.MatrixChars = document.querySelector('#MatrixChars').value; config.Matrix.MatrixChars = document.querySelector('#MatrixChars').value;
config.Matrix.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationMatrix').checked;
config.Matrix.EnableMatrixBackground = document.querySelector('#EnableMatrixBackground').checked; config.Matrix.EnableMatrixBackground = document.querySelector('#EnableMatrixBackground').checked;
// Pride // Pride
@@ -2191,9 +2081,27 @@
// Underwater // Underwater
config.Underwater.EnableUnderwater = document.querySelector('#EnableUnderwater').checked; config.Underwater.EnableUnderwater = document.querySelector('#EnableUnderwater').checked;
config.Underwater.EnableLightRays = document.querySelector('#EnableUnderwaterLightRays').checked; config.Underwater.EnableLightRays = document.querySelector('#EnableUnderwaterLightRays').checked;
config.Underwater.SymbolCount = parseInt(document.querySelector('#UnderwaterSymbolCount').value);
config.Underwater.SymbolCountMobile = parseInt(document.querySelector('#UnderwaterSymbolCountMobile').value);
config.Underwater.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationUnderwater').checked; config.Underwater.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationUnderwater').checked;
config.Underwater.SymbolCountMobile = parseInt(document.querySelector('#UnderwaterSymbolCountMobile').value);
config.Underwater.SeaweedCount = parseInt(document.querySelector('#UnderwaterSeaweedCount').value);
config.Underwater.FishCount = parseInt(document.querySelector('#UnderwaterFishCount').value);
config.Underwater.SeahorseCount = parseInt(document.querySelector('#UnderwaterSeahorseCount').value);
config.Underwater.JellyfishCount = parseInt(document.querySelector('#UnderwaterJellyfishCount').value);
config.Underwater.TurtleCount = parseInt(document.querySelector('#UnderwaterTurtleCount').value);
config.Underwater.CrabCount = parseInt(document.querySelector('#UnderwaterCrabCount').value);
config.Underwater.StarfishCount = parseInt(document.querySelector('#UnderwaterStarfishCount').value);
config.Underwater.ShellCount = parseInt(document.querySelector('#UnderwaterShellCount').value);
// Sports
if (!config.Sports) config.Sports = {};
config.Sports.EnableSports = document.querySelector('#EnableSports').checked;
config.Sports.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationSports').checked;
config.Sports.SymbolCount = parseInt(document.querySelector('#SportsSymbolCount').value);
config.Sports.TurfColor = document.querySelector('#TurfColor').value;
config.Sports.ConfettiColors = document.querySelector('#SportsConfettiColors').value;
config.Sports.EnableTrophy = document.querySelector('#EnableTrophy').checked;
config.Sports.SportsBalls = Array.from(document.querySelectorAll('.sport-ball-cb'))
.filter(cb => cb.checked).map(cb => cb.value).join(',');
// Simple Themes (just on/off toggles) // Simple Themes (just on/off toggles)
config.Frost.EnableFrost = document.querySelector('#EnableFrost').checked; config.Frost.EnableFrost = document.querySelector('#EnableFrost').checked;
@@ -2203,6 +2111,9 @@
config.MarioDay.LetMarioJump = document.querySelector('#LetMarioJump').checked; config.MarioDay.LetMarioJump = document.querySelector('#LetMarioJump').checked;
config.StarWars.EnableStarWars = document.querySelector('#EnableStarWars').checked; config.StarWars.EnableStarWars = document.querySelector('#EnableStarWars').checked;
config.Oktoberfest.EnableOktoberfest = document.querySelector('#EnableOktoberfest').checked; config.Oktoberfest.EnableOktoberfest = document.querySelector('#EnableOktoberfest').checked;
config.Oktoberfest.SymbolCount = parseInt(document.querySelector('#OktoberfestCount').value);
config.Oktoberfest.SymbolCountMobile = parseInt(document.querySelector('#OktoberfestCountMobile').value);
config.Oktoberfest.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationOktoberfest').checked;
config.Friday13.EnableFriday13 = document.querySelector('#EnableFriday13').checked; config.Friday13.EnableFriday13 = document.querySelector('#EnableFriday13').checked;
if (!config.Eid) config.Eid = {}; if (!config.Eid) config.Eid = {};
config.Eid.EnableEid = document.querySelector('#EnableEid').checked; config.Eid.EnableEid = document.querySelector('#EnableEid').checked;
@@ -2210,10 +2121,6 @@
config.Eid.LanternCountMobile = parseInt(document.querySelector('#EidLanternCountMobile').value); config.Eid.LanternCountMobile = parseInt(document.querySelector('#EidLanternCountMobile').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 // Easter
config.Easter.EnableEaster = document.querySelector('#EnableEaster').checked; config.Easter.EnableEaster = document.querySelector('#EnableEaster').checked;
config.Easter.EggCount = parseInt(document.querySelector('#EasterEggCount').value); config.Easter.EggCount = parseInt(document.querySelector('#EasterEggCount').value);
@@ -2259,12 +2166,11 @@
// Earth Day // Earth Day
config.EarthDay.EnableEarthDay = document.querySelector('#EnableEarthDay').checked; config.EarthDay.EnableEarthDay = document.querySelector('#EnableEarthDay').checked;
config.EarthDay.VineCount = parseInt(document.querySelector('#EarthDayVineCount').value); config.EarthDay.FlowersCount = parseInt(document.querySelector('#EarthDayFlowersCount').value);
// Eurovision // Eurovision (second pass - deduplicated)
config.Eurovision.EnableEurovision = document.querySelector('#EnableEurovision').checked; config.Eurovision.EnableEurovision = document.querySelector('#EnableEurovision').checked;
config.Eurovision.SymbolCount = parseInt(document.querySelector('#EurovisionSymbolCount').value); config.Eurovision.SymbolCount = parseInt(document.querySelector('#EurovisionSymbolCount').value);
config.Eurovision.SymbolCountMobile = parseInt(document.querySelector('#EurovisionSymbolCountMobile').value);
config.Eurovision.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationEurovision').checked; config.Eurovision.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationEurovision').checked;
config.Eurovision.EnableColorfulNotes = document.querySelector('#EnableColorfulNotes').checked; config.Eurovision.EnableColorfulNotes = document.querySelector('#EnableColorfulNotes').checked;
config.Eurovision.EurovisionColors = document.querySelector('#EurovisionColors').value; config.Eurovision.EurovisionColors = document.querySelector('#EurovisionColors').value;
@@ -2277,37 +2183,6 @@
config.Birthday.ConfettiCount = parseInt(document.querySelector('#BirthdayConfettiCount').value); config.Birthday.ConfettiCount = parseInt(document.querySelector('#BirthdayConfettiCount').value);
config.Birthday.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationBirthday').checked; config.Birthday.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationBirthday').checked;
// Sports
config.Sports.EnableSports = document.querySelector('#EnableSports').checked;
config.Sports.SymbolCount = parseInt(document.querySelector('#SportsSymbolCount').value);
config.Sports.SymbolCountMobile = parseInt(document.querySelector('#SportsSymbolCountMobile').value);
config.Sports.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationSports').checked;
// Olympia
config.Olympia.EnableOlympia = document.querySelector('#EnableOlympia').checked;
config.Olympia.SymbolCount = parseInt(document.querySelector('#OlympiaSymbolCount').value);
config.Olympia.SymbolCountMobile = parseInt(document.querySelector('#OlympiaSymbolCountMobile').value);
config.Olympia.EnableDifferentDuration = document.querySelector('#EnableDifferentDurationOlympia').checked;
// Pride
config.Pride.EnablePride = document.querySelector('#EnablePride').checked;
config.Pride.HeartCount = parseInt(document.querySelector('#PrideHeartCount').value);
config.Pride.HeartSize = parseFloat(document.querySelector('#PrideHeartSize').value);
config.Pride.ColorHeader = document.querySelector('#PrideColorHeader').checked;
// Rain
config.Rain.EnableRain = document.querySelector('#EnableRain').checked;
config.Rain.RaindropCount = parseInt(document.querySelector('#RaindropCount').value);
config.Rain.RaindropCountMobile = parseInt(document.querySelector('#RaindropCountMobile').value);
config.Rain.RainSpeed = parseFloat(document.querySelector('#RainSpeed').value);
// Storm
config.Storm.EnableStorm = document.querySelector('#EnableStorm').checked;
config.Storm.RaindropCount = parseInt(document.querySelector('#StormRaindropCount').value);
config.Storm.RaindropCountMobile = parseInt(document.querySelector('#StormRaindropCountMobile').value);
config.Storm.RainSpeed = parseFloat(document.querySelector('#StormRainSpeed').value);
config.Storm.EnableLightning = document.querySelector('#StormEnableLightning').checked;
ApiClient.updatePluginConfiguration(SeasonalsConfigPage.pluginUniqueId, config).then(function (result) { ApiClient.updatePluginConfiguration(SeasonalsConfigPage.pluginUniqueId, config).then(function (result) {
Dashboard.processPluginConfigurationUpdateResult(result); Dashboard.processPluginConfigurationUpdateResult(result);
}); });

View File

@@ -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>2.0.0.3</Version> <Version>2.0.0.6</Version>
<RepositoryUrl>https://github.com/CodeDevMLH/Jellyfin-Seasonals</RepositoryUrl> <RepositoryUrl>https://github.com/CodeDevMLH/Jellyfin-Seasonals</RepositoryUrl>
</PropertyGroup> </PropertyGroup>

View File

@@ -1,7 +1,7 @@
const config = window.SeasonalsPluginConfig?.Birthday || {}; const config = window.SeasonalsPluginConfig?.Birthday || {};
const birthday = config.EnableBirthday !== undefined ? config.EnableBirthday : true; // enable/disable birthday symbols const birthday = config.EnableBirthday !== undefined ? config.EnableBirthday : true; // enable/disable birthday symbols
const symbolCount = config.SymbolCount !== undefined ? config.SymbolCount : 15; // count of balloons const symbolCount = config.SymbolCount !== undefined ? config.SymbolCount : 12; // count of balloons
const enableDifferentDuration = config.EnableDifferentDuration !== undefined ? config.EnableDifferentDuration : true; // enable different duration for the symbols const enableDifferentDuration = config.EnableDifferentDuration !== undefined ? config.EnableDifferentDuration : true; // enable different duration for the symbols
const symbolCountMobile = config.SymbolCountMobile !== undefined ? config.SymbolCountMobile : 5; // count of mobile balloons const symbolCountMobile = config.SymbolCountMobile !== undefined ? config.SymbolCountMobile : 5; // count of mobile balloons
const baseConfettiCount = config.ConfettiCount !== undefined ? config.ConfettiCount : 60; // count of confetti const baseConfettiCount = config.ConfettiCount !== undefined ? config.ConfettiCount : 60; // count of confetti

View File

@@ -1,7 +1,7 @@
const config = window.SeasonalsPluginConfig?.EarthDay || {}; const config = window.SeasonalsPluginConfig?.EarthDay || {};
const enabled = config.EnableEarthDay !== undefined ? config.EnableEarthDay : true; // enable/disable earthday const enabled = config.EnableEarthDay !== undefined ? config.EnableEarthDay : true; // enable/disable earthday
const vineCount = config.VineCount !== undefined ? config.VineCount : 4; // count of vine const flowersCount = config.FlowersCount !== undefined ? config.FlowersCount : 60; // count of vine
const flowerColors = ['#FF69B4', '#FFD700', '#87CEFA', '#FF4500', '#BA55D3', '#FFA500', '#FF1493']; const flowerColors = ['#FF69B4', '#FFD700', '#87CEFA', '#FF4500', '#BA55D3', '#FFA500', '#FF1493'];
@@ -68,7 +68,7 @@ function createElements() {
} }
// Generate Flowers // Generate Flowers
const flowerCount = Math.max(10, vineCount * 15); const flowerCount = Math.max(10, flowersCount);
for (let i = 0; i < flowerCount; i++) { for (let i = 0; i < flowerCount; i++) {
const x = 10 + Math.random() * (w - 20); const x = 10 + Math.random() * (w - 20);
const y = hSVG * 0.1 + Math.random() * (hSVG * 0.5); const y = hSVG * 0.1 + Math.random() * (hSVG * 0.5);

View File

@@ -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": "2.0.0.3", "version": "2.0.0.6",
"changelog": "- feat: add many themes\n- fix: improve performance", "changelog": "- feat: add new themes:\n- birthday (ballons, computer mouse interactive)\n- earthday\n- Eid al-Fitr (sugar feast/ramadan)\n- eurovision\n- Film Noir filter\n- Friday the 13\n- frost\n- Mario Day\n- Matrix\n- Oktoberfest\n- Olympia\n- Oscar Awards\n- Pride\n- Rain\n- Spooky\n- Sports (many selectable balls of ball games like handball, football (soccer) or tennis)\n- StarWars Day\n- Storm (Epilepsy Warning!!!, Thunderstorm)\n- refactored spring (new lawn with flowers), easter (new easter bunny, new lawn with flowers and ester eggs), halloween (add spiders (computer mouse sensitive), add mice, add fog) \n- fix: many improvements and bug fixes e.g. changed top to translate/transform for performance reasons",
"targetAbi": "10.11.0.0", "targetAbi": "10.11.0.0",
"sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/Jellyfin-Seasonals-Plugin/releases/download/v2.0.0.3/Jellyfin.Plugin.Seasonals.zip", "sourceUrl": "https://git.mahom03-spacecloud.de/CodeDevMLH/Jellyfin-Seasonals-Plugin/releases/download/v2.0.0.6/Jellyfin.Plugin.Seasonals.zip",
"checksum": "ef29196932c544d88119421dddb58afb", "checksum": "09f0f06ae228b4f439c6358558364368",
"timestamp": "2026-02-28T01:30:54Z" "timestamp": "2026-02-28T02:39:47Z"
}, },
{ {
"version": "1.7.2.0", "version": "1.7.2.0",