## Version 9.2.0

- Upstream fixes from Logitech Media Server 9.1.x
- New Features:

- #1286 - Display album cover for AudioAddict stations (inspired by some work by @mcduman)
- #1541 - Add per-player timezone support: players can now display date and time, and fire alarms, in their own timezone rather than the server's. (@boudekerk)
- #1546 - Add "Default Adjustment for Local Tracks" player option. (@SamInPgh)
- #1564 - Add Dismiss option to Jive alarm popup (@boudekerk)

- Server Changes:

- More aggressively cache DNS lookups, re-use cached data even if expired, but if lookup fails.
- Improve HTTP/1.1 compatibility using keep-alive and SSL/TLS.
- #1548 - Updated Czech translation (@mipa87)
- #1549 - Update CODE2000 font to 1.176 (@mipa87)
- #1550 - Update wizard plugin JSON encoding to use UTF-8 for HTML templates (@mipa87)

- Platform Support:

- Improve SSL support for Windows and macOS builds, updating Mozilla::CA to the latest version.
- Add ARM64 sox binary for macOS (@ralphy)
- Update Audio-Scan module to version 1.12 (Windows, macOS, Linux Perl 5.32 x86_64, 5.36 x86_64/aarch64, 5.40 x86_64) (@ralphy, @cheesestraws)
- #106 - Removal of SYSV Init support and better systemd support in the RPM package for Red Hat/SUSE (@JohanSaaw, @mavit)

- Bug Fixes:

- Fix an issue with the image resizer where an explicitly requested format was not honored when padding was needed.
- #10 - id3: Never add undef to tag hash for empty or invalid TXXX key (@cheesestraws)
- #1140 - Fix stat returning an empty size for most files (@jecaro)
- #1517 - Fix work images and artwork precaching (@darrell-k)
- #1553 - Allow plugins to shut down before closing the database (@SamInPgh)
- #1555 - Scanner: stop-gap to prevent contributor row poisoning when the MusicBrainz ID count does not match the artist name count. (@Rouzax)
- #1558 - Add album link for imported remote tracks (@SamInPgh)
- #1563 - Fix restoration of pre-alarm volume when changing the alarm volume while playing (@boudekerk)
- #1571 - Guard ReplayGain and URL tag processing against arrayrefs (@Rouzax)
- #1587 - Fix RSS feed parsing when a podcast URL contains wide characters (@robho)

- Other:

## Version 9.1.1

- New Features:

- Server Changes:

- Enable caching for radio artwork lookups.

- Platform Support:

- #1562 - Improve compatibility with newer versions of DBIx::Class (@paulgevers)

- Bug Fixes:

- Some radio streams would redirect to web page when using a "Mozilla" user agent string.
- Fix software update check for Debian on i686 and older systems.
- Fix scheduling scans to run at midnight.
- #1567 - Fix addition/deletion of favorites when the "item_id" comes with a session ID.
- #1527 - YAML::XS would turn booleans into read-only values on Perl 5.42
- #1528 - Fix FLAC to MP3 transcoding for mono tracks (@jbylsma)
- #1573 - Fix release types for Squeezeplay/Touch etc. (@darrell-k)

- Other:

## Version 9.1.0 - 2026-02-19 (d19d25040)

- New Features:

- Optionally navigate playlists by folders, allowing you to organise your playlists hierarchically.
- Implement an artist portrait picture handler. This will read images from folders where you've stored them under the artist's name, or from the artist folder in a typical artist/album/track hierarchy.
- Add a plugin to try to fetch artwork for radio stations which don't provide track artwork.
- Add new scan modes "album" and "track" to re-scan individual albums or tracks. Album scan is available from an album's Info menu.
- #1425 - Add playlist drag and drop support to the Classic skin (thanks @oreillymj)
- #1426 - add support for ListenBrainz to AudioScrobbler plugin (thanks @vysmaty & AI)
- Allow GETting the JSONRPC.js handler with a "request" parameter to simplify access by limited clients.
- #1294 - Bring back list view in the Manage Plugins section. The view can be toggled between grid an list view.
- #1422 - Add new sort orders "playcount", "popular", and "recentlyplayed" to "albums" and "artists" queries.
- Provide a hook which would allow a plugin or other to register a method to display track artwork for radio stations which don't provide their own.
- #1468 - Add support for SUBTITLE to Advanced Search.
- #1510 - Give option to use ID3 tag TIT1 either as grouping or work.

- Server Changes:

- Improve support for 3rd party player icons, add some for piCorePlayer, SqueezeAMP, WiiM players.
- Update downloader now validates the installers checksum.
- Updated Czech translation - thanks @mipa87!
- Updated French translation - thanks @Franck-Berry!
- Updated Chinese translation - thanks @xdsnet!
- Updated Swedish translation - thanks @JohanSaaw!
- Improve cache purging reliability to avoid unnecessary growth.
- Update the custom user agent string: pretending to be iTunes probably caused more problems than it solved.
- Enable log rotation on Docker based systeme.
- Don't re-encode lossy streams when bitrate limiting if original stream is of lower or equal bitrate already (thanks @ralphy!)
- Add prefs folder to search list for custom types/convert/strings files (macOS/Windows).
- Use online service to convert WEBP images to JPEG if needed (only works with online images).
- Change the minimum sync adjustment to 5ms (from 10ms)
- #1216 - Reset playing position to first track once a playlist or album has ended (@ml-1)
- #1245 - Added a Simple WebSocket client capability for 3rd Party Plugins to support this protocol (@expectingtofly)
- #1356 - Use ORIGINALDATE tag with Flac (@jbylsma)
- #1363 - Allow item removal even if playlist has only 1 item (@mw9)
- #1364 - store/return playqueue entry context flag ("addedFromWork")
- #1377 - Provide new /time/tz endpoint for Squeezeplay to fetch the local timezone (@mw9)
- #1399 - Use artwork appropriate for a Work if multiple album covers
- #1487 - Improve CJK search support (@xxbin)
- #1489 - Allow Replay Gain to be modified in a plugin's onStream() protocol handler routine (@SamInPgh)
- #1490 - Fix incorrect ICY stream title sent during track change (@maniac103)
- #1494 - Use metadata from the library for remote tracks when possible (@SamInPgh)
- #1500 - Fix FLAC transcoding to MP3 for embedded cuesheets and when seeking in a stream (@jbylsma)

- Platform Support:

- Make Docker a first class citizan: add Slim::Utils::OS::Docker instead of a Custom.pm
- Add support for Perl 5.42 on x86_64 Linux.
- Remove Win32 legacy support files, code, control panels, build pipeline, etc.
- Remove legacy Mac installer from build pipeline.
- Remove code dealing with Perl < 5.10.
- Remove support for older Perl versions from the RPM (thanks @mavit!) and DEB packages.
- Stop building i386 DEB package.
- Updated Audio::Scan to v1.11 on Linux Perl 5.36/5.40, and Windows - thanks @ralphy!
- Upgrade DBD::SQLite to v1.75 for Perl 5.40 (Linux x86_64, aarch64), 5.38 (Linux x86_64), 5.36 (Linux x86_64, aarch64, armv7), 5.34 (Linux x86_64, aarch64; macOS), 5.32 (Linux x86_64, aarch64, armv7).
- #73 - Add a note about setting the hostname in a Docker container (thanks @hartzell!)
- #86 - Add more tags to Docker images to better support automated updates (thanks @stavros-k!)
- #101 - Add package opus-tools to docker image (thanks @terual!)

- Bug Fixes:

- The AudioScrobbler failed to report tracks from online music services when they were integrated with the local library.
- Let the image proxy tell the upstream server what image formats we support, because we don't support WEBP.
- #1287 - fix method name for spdr protocol handler.
- #1359 - Update UPnP ConnectionManager.pm to add checks for Wav and Opus (@BoringName15).
- #1362 - Update UPnP AVTransport.pm to move LMS event registration (@BoringName15).
- #1367 - Update UPnP support to fix gapless playback (setNextAVTransport) (@BoringName15).
- #1414 - Make sure custom image proxy handlers are always called (fixes incompatibility with Radio Now Playing's SVG handler).
- #1442 - Avoid log flood when player discovery JSON is empty (@mikecappella).
- #1444 - Fix search using terms with quotes in the Default skin (@darrell-k).
- #1460 - Don't close HTTP when 1.1, unless explicit asked (@philippe44).
- #1471 - Consider all of a track's genres for scrobbling exclusion (@jbylsma).
- #1486 - Replay gain is sometimes not applied to remote tracks (@SamInPgh).

- Other:

- Remove more left-overs from removed picture/video scanning.
- Remove more left-overs from removed MySqueezebox integration.
- Remove support for MySQL. Existing configurations using it will log an error.
- #1458 - Add devcontainer configuration with Dockerfile and docker-compose setup (@LMSSonos).

## Version 9.0.4

- Server Changes:

- Updated Czech translation - thanks @mipa87!

- Platform Support:

- Add Homebrew's binary path to OSX search paths.
- #1441 - Install procps package Docker image in support of plugins which need the tools to manage their helper processes.
- Make piCorePlayer a first class citizan: add Slim::Utils::OS::pCP to support it

- Bug Fixes:

- Classic/Transporter/Boom would not navigate down the artist of the currently playing track.
- #1280 - persists current song on last track (thanks @MrC!).

## Version 9.0.3 - 2025-10-03 (9977737c1)

- Server Changes:

- #1386 - Store the calculated replay gain in the song object when beginning playback (@SamInPgh)

- Platform Support:

- Add support for Perl 5.40 on aarch64/armv7 Linux.
- #1339 - Add ghcr.io as an alternative container registry in addition to Docker Hub.
- Download Strawberry Perl for Windows from our own download site. strawberryperl.com has been unstable recently.

- Bug Fixes:

- #1373 - Transcoding of some APE files does not work with LMS 9 - upgrade the mac binary to v10 (thanks @ralphy!).
- #1378 - Rescanning a track with MusicBrainz ID can lead to corrupted ID value in database.
- #1423 - Fix compatibility with Squeezer app (thanks @darrell-k).
- #1429 - Make sure work is removed from track if removed in tags (thanks @darrell-k).

## Version 9.0.2 - 2025-03-13 (1470c9412)

- New Features:

- Add a few more alarm clock sounds to the Sounds & Effects plugin.

- Platform Support:

- Improve Windows installer to give better feedback on service start failure.
- #85 - Change permissions of user running LMS in Docker. Use "squeezeboxserver" group instead of "nogroup" (thanks @osnieh!)

- Bug Fixes:

- Mitigate an issue with uppercase umlauts and other non-latin characters in the full text search on Windows.
- #1193 - Don't throw error when fulltext search is being used before the end of a scan.
- #1214 - If item in queue can't be played, StreamingController leaves player in a bad state, failing further playback.
- #1288 - Update Carp::Assert to latest to fix compatibility with recent Perl versions.
- #1303 - Fix an issue where browsing releases would sometimes create thousands of parameters (and more - thanks @darrell-k!).
- #1306 - Don't run the scanner before we're done with the setup wizard.
- #1307 - Fix scanner progress information in the web UI.
- #1309 - Limit works advanced search to discovered albums. (@darrell-k)
- #1314 - The server would seemingly hang when trying to connect to the Material skin as long as no work has been found.
- #1319 - Don't filter by release types if user pref is ignoreReleaseTypes (@darrell-k).
- #1320 - Scanner crashes on unexpected system folders.
- #1325 - Fix scanning multiple MusicBrainz IDs (@darrell-k).
- Improve compatibility with modern HTML/JS and more strict browsers (eg. Safari).

- Other:

- #1315 - Return contiguous/non-contiguous flag in statusQuery (thanks @darrell-k).

## Version 9.0.1 - 2025-01-09 (e3effbe91)

- New Features:

- #1267 - Provide easy installation of Date and Time screensaver for Classic/Boom/Transporter users.

- Server Changes:

- Analytics: only check a small, well defined list of pref changes to decide whether a disconnected player had been active recently.
- Initialize autoincrement start value for contributors table to prevent ID re-use on full wipe & rescans.
- #1259 - Improve the way in which we initialize a "track added" timestamp. Use the file's timestamp on initial imports.

- Platform Support:

- Fix helper search path initialisation on older macOS using Perl 5.18.
- #74 - Speed up Perl installation during an initial installation on Windows.
- #75 - Make sure newly installed LMS on Windows is running before sending the user to the web page.
- #76 - Start/stop LMS on Mac when the menu bar item is started/stopped.
- #77 - Add instructions to the macOS DMG file. Improve overall user experience.
- #78 - Fix crypto library linking issues in the Docker image.
- #80 - Reset update status when updating fromt he macOS menu bar item.
- Have a newly installed LMS on Windows use "Lyrion" as the data path, rather than "Squeezebox".

- Bug Fixes:

- Only re-initialize menu settings for connected players - otherwise Analytics considers them "active" due to a prefs change.
- Fix display of final "Scan done" message in Material skin.
- Fix track count caching in "titles" query.
- #1235 - Need to utf8Decode album title for new & changed (thanks @darrell-k!)
- #1237 - Fix create table syntax for MySQL (MariaDB) (thanks @JKDingwall!)
- #1238 - Merge multiple works per track into one single work (thanks @darrell-k!)
- #1240 - Add option to limit works scanning to classical genre(s) (thanks @darrell-k!)
- #1242 - Fix plugin download - must wait for the download to finish before restarting the server
- #1247 - Fix display of final "Scan done" message and "Abort scan" link in Material/Classic skins.
- #1250 - Radio stations wouldn't show album artwork any more.
- #1246 - Windows registry value "DataPath" is in the wrong place.
- #1273 - Remove grouping & discsubtitle in new & changed scan if tags were removed (thanks @darrell-k!)

## Introducing... Lyrion Music Server Version 9.0.0! - 2024-11-29 (2ed5e147e)

- Upstream fixes from Logitech Media Server 8.5.x
- New Features:

- New product name! Welcome Lyrion Music Server!
- New visuals - thanks @gobuleberbu & @mikes!
- Default skin refresh (the old version is still available as "Logic Teal")
- Massive upgrade for (Classical) music lovers: add support for Works, Performances, Disc Subtitles, Roles. Thanks a ton @darrell-k!
- Improved first start setup: suggest a few plugins to install on initial startup.
- Add new "Recently Changed" browse mode to complement the "New Music" menu. The latter is no longer based on the file's timestamp, but on the time added to the collection, as stored in the persistant track table.
- #1095 - Link from online tracks and albums to local library (if possible).
- #1115 - Add option to show tracks from a given year, even if their album would be listed in a different year.
- #1132 - Allow user defined contributor roles (thanks @darrell-k!).
- #1228 - Allow user to define how many HTTP requests to follow.

- Server Changes:

- Added Hungarian translations - thanks @ambrits!
- Updated Czech translation - thanks @mipa87!
- Updated Danish translation - thanks @cfuttrup!
- Updated Dutch translation - thanks @terual!
- Updated French translation - thanks @Franck-Berry!
- Updated Portuguese translation - thanks @DuLac!
- Improved Plugin Manager: add categories, icons, and search.
- #1124 - Return 'Random Mix' state in player status message (thanks @CraigD!)
- #1144 - Remove unnecessary delay reporting volume changes (thanks @SamInPgh!)

- Platform Support:

- Replace the macOS Preference Pane with a menubar item (requires macOS 10.11 El Capitan).
- #64 - Upgrade Docker base image to Debian 12 (Bookworm) - thanks @mavit!
- #1198 - Add support for Perl 5.40 on x86_64 Linux.
- Much improved RPM packages to better integrate with system standards (thanks @JohanSaaw!)
- Update Windows 64-bit installer to be compatible with new Windows on ARM machines.
- Updated Audio::Scan to v1.09 on Windows 32-bit, v1.10 on Windows 64-bit and Linux Perl 5.36/5.38 - thanks @ralphy!
- Dropped support for Windows 32-bit and macOS < 10.11.

- Bug Fixes:

- #1027 - Play count increase with in-track jumps (thanks @darrell-k!)
- #1116 - Fix album info track count when there are more than 50 tracks in an album (thanks @darrell-k!)
- #1138 - "Add all songs" from search not working (thanks @darrell-k!)
- #1146 - Restore partial Cometd support for CLI clients (thanks @sodface!)
- #1203 - Fix display of album roles in the playlist (thanks @darrell-k!)
- #1213 - Modify #CURRTRACK to first track when playlist finishes
- #1229 - Only allow audio tracks for RandomPlay (thanks @jbylsma!)

- Other:

- Move CLI documentation out of the server code to lyrion.org.
- Allow a caller (plugin) of Slim::Networking::SimpleAsyncHTTP to disable HTTPS certificate validation.