v1.2.1
NowPlaying
- The "seamless transition" path (when the next song is already detected during the last 10s of the current one) now waits for the cover the same way a normal song change does, instead of rendering with a placeholder immediately. If the
current song happens to end before that wait finishes, the currently displayed slot just stays up until the next render is ready - get_now_playing() and the metadata fetch (cover, album, tags, duration) are now guarded with 15s/20s timeouts, so a hung Last.fm/Spotify request can no longer stall the poller forever.
Stability
- Fixed a bug where the clock display would freeze (e.g. stuck at "21:59" despite active hours ending at 22:00), silently skipping the active-hours transition and its webhooks. Root cause: Verse of Day was fetching/rendering its verse
synchronously on the main loop, blocking everything.
Triggers (Web UI)
- Timed triggers and "hold indefinitely" locks used to live entirely in the browser, closing or reloading the tab could leave a trigger stuck forever ("limbo state"). Expiry is now tracked server-side, and the web UI reconciles its
state from the server on every load/reload.
Active Hours & Power
- When active hours end automatically, the manual power switch in the UI now correctly reflects "off" (previously it kept showing "on").
- Manually turning the display on outside active hours now keeps it on until manually turned off again (like an indefinite panel trigger), instead of immediately turning back off. Turning it off again restores normal after-hours
behavior. If active hours start naturally on their own, the override is cleared automatically. - New setting: "Auto Sleep After Hours": when turned on manually outside active hours, an optional timer (adjustable via a slider) can automatically turn it back off instead of staying on indefinitely.