feat(ui): Add composer field to datatables#4857
Conversation
In order to make the UI a bit more useful for classical music, where the recorded artist isn't the composer of the work, add the composer field to the song and album datatables. To not affect existing users, the field is default off.
Summary of ChangesHello @AlexGustafsson, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request implements a new 'composer' field across various UI datatables, specifically for songs and albums. The primary motivation is to provide a more granular view for classical music, where the composer is often different from the performing artist. By making this field toggleable and off by default, the change ensures a non-disruptive integration while offering enhanced data presentation capabilities to users who choose to enable it. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
This pull request introduces a 'composer' field to the album and song data tables, which is a great enhancement for classical music listeners. The implementation correctly adds this as a toggleable field that is disabled by default to maintain backward compatibility for existing users. I've found one small typo that prevents this default behavior in one of the views, but otherwise, the changes are solid and well-integrated.
|
I've added strings for English and Swedish. I don't know if they're crowedsourced through some external means, if so I could remove them. |
Albums can have more than one composer. Showing all or just one of them in a list doesn't really make sense.
|
A while ago I made an experimental build for better support for classical music, where it had the logic that the Composer and Conductor were automatically appended to Artist (so,
This is a more space-efficient way to implement this than an extra column, and would also not clutter the interface with all the composers of non-classical music. In the end we decided to not merge that implementation because it was just before the "great database refactoring" that introduced multi-artist support, but I'm happy to redo it (or you could, if you wanted). (but if @deluan is happy with this PR, I have no problems with that) |
|
I don't want to spend much time on this UI, but if you folks are ok with this change, it is fine for me. If @AlexGustafsson prefers to implement that kind of logic before merging, let me know. |
|
Thanks for the input certuna, that does sound like a good solution. I'm happy as is, the PR feels like a simple incremental addition with at least some improvements for classical music. |
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [deluan/navidrome](https://github.com/navidrome/navidrome) | minor | `0.59.0` → `0.60.0` | --- ### Release Notes <details> <summary>navidrome/navidrome (deluan/navidrome)</summary> ### [`v0.60.0`](https://github.com/navidrome/navidrome/releases/tag/v0.60.0) [Compare Source](navidrome/navidrome@v0.59.0...v0.60.0) #### Plugins This release introduces a major rewrite of the experimental **Plugin System**, now with multi-language PDK support, enabling developers to extend Navidrome's functionality using WebAssembly-based plugins written in Go, Rust, Python or JavaScript. Plugins run in a secure sandbox and can provide additional metadata sources, custom integrations, and server-side enhancements. Users can now easily configure plugins directly from the UI through a new JSONForms-based configuration interface. A couple of working plugins are already available: - [AudioMuse-AI integration](https://github.com/NeptuneHub/AudioMuse-AI-NV-plugin) - [ListenBrainz Daily Playlist Importer](https://github.com/kgarner7/navidrome-listenbrainz-daily-playlist) - [Discord Rich Presence](https://github.com/navidrome/discord-rich-presence-plugin) For more plugins, keep an eye on the tag [navidrome-plugins](https://github.com/topics/navidrome-plugin) in GitHub. More details and instructions on how to use and manage plugins can be found in our [documentation](https://www.navidrome.org/docs/usage/features/plugins/). New documentation will soon be added with details on how to create new plugins. #### Metadata Extraction Additionally, this version includes a **pure-Go metadata extractor** built on top of the new `go-taglib` library. This is a significant step toward removing the C++ TagLib dependency, which will simplify cross-platform builds and packaging in future releases. The new extractor is activated by default, but in case of any issues you can revert to the previous implementation by setting `Scanner.Extractor="legacy-taglib"` configuration option. #### Instant Mix The Instant Mix feature generates a playlist of similar songs based on a selected track. By default, it retrieves similar songs from Last.fm (if configured with an API key) or falls back to Deezer. It can also be configured to use external plugins, like [AudioMuse-AI](https://github.com/NeptuneHub/AudioMuse-AI-NV-plugin) for sonic analysis-based similarity recommendations. #### New and Changed Configuration Options ##### Plugin System Options | Option | Default | Description | | -------------------- | --------- | ------------------------------------------------------------- | | `Plugins.Enabled` | `true` | Enable/disable the plugin system | | `Plugins.Folder` | `""` | Path to the plugins directory. Default: `$DataFolder/Plugins` | | `Plugins.CacheSize` | `"200MB"` | Maximum cache size for storing compiled plugin WASM modules | | `Plugins.AutoReload` | `false` | Automatically detect new/changed/removed plugins | | `Plugins.LogLevel` | `""` | Override log level for plugin-related messages | ##### Subsonic API Options | Option | Default | Description | | ------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------ | | `Subsonic.MinimalClients` | `""` | Comma-separated list of clients that receive reduced API responses (useful for resource-constrained devices like smartwatches) | | `Subsonic.EnableAverageRating` | `true` | Include average rating in API responses | ##### Metadata & Matching Options | Option | Default | Description | | ---------------------------- | ------- | -------------------------------------------------------------------------------------------------- | | `SimilarSongsMatchThreshold` | `85` | Minimum similarity score (0-100) for matching similar songs from external sources to local library | | `LastFM.Language` | `"en"` | Now supports comma-separated list of languages (e.g., `"de,fr,en"`) for metadata fallback | | `Deezer.Language` | `"en"` | Now supports comma-separated list of languages for metadata fallback | ##### Renamed Options (Deprecation Notice) The following options have been renamed. The old names still work but will be removed in a future release: | Old Name | New Name | | --------------------------------------------- | -------------------------- | | `HTTPSecurityHeaders.CustomFrameOptionsValue` | `HTTPHeaders.FrameOptions` | #### Security - Fix potential XSS vulnerability by sanitizing user-supplied data before rendering (GHSA-rh3r-8pxm-hg4w). ([d7ec735](navidrome/navidrome@d7ec7355c) by [@​AlexGustafsson](https://github.com/AlexGustafsson)) - Fix potential DoS vulnerability in cover art upscaling by clamping requested square size to original dimensions (GHSA-hrr4-3wgr-68x3). ([77367548](navidrome/navidrome@77367548f) by [@​deluan](https://github.com/deluan)). Thanks to [@​yunfachi](https://github.com/yunfachi) #### Added - Plugins: - Add new WebAssembly-based plugin system with multi-language PDK support (Go, Rust, Python). ([#​4833](navidrome/navidrome#4833) by [@​deluan](https://github.com/deluan)) - Add JSONForms-based plugin configuration UI. ([#​4911](navidrome/navidrome#4911) by [@​deluan](https://github.com/deluan)) - Add similar songs retrieval functions to plugins API. ([#​4933](navidrome/navidrome#4933) by [@​deluan](https://github.com/deluan)) - Server: - Add pure-Go metadata extractor (`go-taglib`) as alternative to FFmpeg-based extraction. ([#​4902](navidrome/navidrome#4902) by [@​deluan](https://github.com/deluan)) - Add support for reading embedded images using the new taglib extractor by default. ([66474fc](navidrome/navidrome@66474fc9f) by [@​deluan](https://github.com/deluan)) - Add Instant Mix (song-based Similar Songs) functionality with MBID, ISRC and Title/Artist fuzzy matching. ([#​4919](navidrome/navidrome#4919), [#​4946](navidrome/navidrome#4946) by [@​deluan](https://github.com/deluan)) - Add support for multiple languages when fetching metadata from Last.fm and Deezer. ([#​4952](navidrome/navidrome#4952) by [@​deluan](https://github.com/deluan)) - Add `Subsonic.MinimalClients` configuration option for improved compatibility with minimal Subsonic clients. Default list is `"SubMusic"` ([#​4850](navidrome/navidrome#4850) by [@​typhoon2099](https://github.com/typhoon2099)) - Add support for public/private playlists in NSP import. ([c5447a6](navidrome/navidrome@c5447a637) by [@​deluan](https://github.com/deluan)) - Add RISCV64 builds. ([#​4949](navidrome/navidrome#4949) by [@​MichaIng](https://github.com/MichaIng)) - UI Features: - Add composer field to table views. ([#​4857](navidrome/navidrome#4857) by [@​AlexGustafsson](https://github.com/AlexGustafsson)) - Add prompt before closing window if music is playing. ([#​4899](navidrome/navidrome#4899) by [@​alannnna](https://github.com/alannnna)) - Add Nautiline-like theme. ([#​4909](navidrome/navidrome#4909) by [@​borisrorsvort](https://github.com/borisrorsvort)) - Add multiline support and resizing for playlist comment input. ([6fce30c](navidrome/navidrome@6fce30c13) by [@​deluan](https://github.com/deluan)) - Subsonic API: - Add `avgRating` field from Subsonic spec. ([#​4900](navidrome/navidrome#4900) by [@​terry90](https://github.com/terry90)) - Insights: - Add insights collection for Scanner.Extractor configuration to measure go-taglib usage. ([63517e9](navidrome/navidrome@63517e904) by [@​deluan](https://github.com/deluan)) - Add file suffix counting to insights. ([0473c50](navidrome/navidrome@0473c50b4) by [@​deluan](https://github.com/deluan)) #### Changed - Optimize cross-library move detection for single-library setups. ([#​4888](navidrome/navidrome#4888) by [@​deluan](https://github.com/deluan)) - Improve Deezer artist search ranking. ([a081569](navidrome/navidrome@a081569ed) by [@​deluan](https://github.com/deluan)) - Rename `HTTPSecurityHeaders.CustomFrameOptionsValue` to `HTTPHeaders.FrameOptions`. ([7ccf44b](navidrome/navidrome@7ccf44b8e) by [@​deluan](https://github.com/deluan)) - Update translations: Bulgarian, Catalan, German, Greek, Spanish, Finnish, French, Galician, Indonesian, Dutch, Polish, Russian, Slovenian, Swedish, Thai by [POEditor contributors](https://www.navidrome.org/docs/developers/translations/). - Update Spanish translations. ([#​4904](navidrome/navidrome#4904) by [@​abrugues](https://github.com/abrugues)) - Update Basque translation. ([#​4815](navidrome/navidrome#4815) by [@​xabirequejo](https://github.com/xabirequejo)) #### Fixed - Playlists: - Fix M3U playlist import failing for paths with different UTF/Unicode representations (NFC/NFD normalization). ([#​4890](navidrome/navidrome#4890) by [@​deluan](https://github.com/deluan)) - Fix playlist name sorting to be case-insensitive. ([#​4845](navidrome/navidrome#4845) by [@​deluan](https://github.com/deluan)) - UI: - Fix various UI issues and improve styling coherence. ([#​4910](navidrome/navidrome#4910) by [@​borisrorsvort](https://github.com/borisrorsvort)) - Fix AMusic theme player buttons and delete button color. ([#​4797](navidrome/navidrome#4797) by [@​dragonish](https://github.com/dragonish)) - Fix export missing files showing only first 1000 results. ([017676c](navidrome/navidrome@017676c45) by [@​deluan](https://github.com/deluan)) - Scanner: - Fix `FullScanInProgress` not reflecting current scan request during interrupted scans. ([8c80be5](navidrome/navidrome@8c80be56d) by [@​deluan](https://github.com/deluan)) - Fix "Expression tree is too large" error by executing GetFolderUpdateInfo in batches. ([cde5992](navidrome/navidrome@cde5992c4) by [@​deluan](https://github.com/deluan)) - Fix stale role associations when artist role changes. ([2d7b716](navidrome/navidrome@2d7b71683) by [@​deluan](https://github.com/deluan)) - Fix infinite recursion in PID configuration. ([1c4a7e8](navidrome/navidrome@1c4a7e855) by [@​deluan](https://github.com/deluan)) - Fix default PIDs not being set for Album and Track. In some circumstances it could lead to empty PIDs ([71f549a](navidrome/navidrome@71f549afb) by [@​deluan](https://github.com/deluan)) - Fix error when watcher detected too many folder changes, causing the scan to fail. ([9ed309a](navidrome/navidrome@9ed309ac8) by [@​deluan](https://github.com/deluan)) - Show scan errors in the UI more consistently. ([ebbc31f](navidrome/navidrome@ebbc31f1a) by [@​deluan](https://github.com/deluan)) - Subsonic API: - Fix username parameter validation for `getUser` endpoint. ([6ed6524](navidrome/navidrome@6ed652475) by [@​deluan](https://github.com/deluan)) - Fix `getNowPlaying` endpoint to always be enabled regardless of configuration. ([603cccd](navidrome/navidrome@603cccde1) by [@​deluan](https://github.com/deluan)) - Server: - Fix JWT-related errors being exposed on share page. ([#​4892](navidrome/navidrome#4892) by [@​AlexGustafsson](https://github.com/AlexGustafsson)) - Fix user context not preserved in async NowPlaying dispatch. ([396eee4](navidrome/navidrome@396eee48c) by [@​deluan](https://github.com/deluan)) - Fix environment variable configuration loading not being logged when no config file is found. ([51ca2de](navidrome/navidrome@51ca2dee6) by [@​deluan](https://github.com/deluan)) - Fix items with no annotation not being included for `starred=false` filter, handle `has_rating=false`. ([#​4921](navidrome/navidrome#4921) by [@​kgarner7](https://github.com/kgarner7)) - Last.fm's `scrobble` and `updateNowPlaying` methods should send parameters in request body. ([51026de](navidrome/navidrome@51026de80) by [@​deluan](https://github.com/deluan)) #### New Contributors - [@​alannnna](https://github.com/alannnna) made their first contribution in [#​4899](navidrome/navidrome#4899) - [@​abrugues](https://github.com/abrugues) made their first contribution in [#​4904](navidrome/navidrome#4904) - [@​AlexGustafsson](https://github.com/AlexGustafsson) made their first contribution in [#​4857](navidrome/navidrome#4857) - [@​borisrorsvort](https://github.com/borisrorsvort) made their first contribution in [#​4909](navidrome/navidrome#4909) - [@​dragonish](https://github.com/dragonish) made their first contribution in [#​4797](navidrome/navidrome#4797) - [@​MichaIng](https://github.com/MichaIng) made their first contribution in [#​4949](navidrome/navidrome#4949) - [@​terry90](https://github.com/terry90) made their first contribution in [#​4900](navidrome/navidrome#4900) - [@​typhoon2099](https://github.com/typhoon2099) made their first contribution in [#​4850](navidrome/navidrome#4850) **Full Changelog**: <navidrome/navidrome@v0.59.0...v0.60.0> #### Helping out This release is only possible thanks to the support of some **awesome people**! Want to be one of them? You can [sponsor](https://github.com/sponsors/deluan), pay me a [Ko-fi](https://ko-fi.com/deluan), or [contribute with code](https://www.navidrome.org/docs/developers/). #### Where to go next? - Read installation instructions on our [website](https://www.navidrome.org/docs/installation/). - Host Navidrome on [PikaPods](https://www.pikapods.com/pods/navidrome) for a simple cloud solution. - Reach out on [Discord](https://discord.gg/xh7j7yF), [Reddit](https://www.reddit.com/r/navidrome/) and [Twitter](https://twitter.com/navidrome)! </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4wLjIiLCJ1cGRhdGVkSW5WZXIiOiI0My4wLjIiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImltYWdlIl19--> Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/3687 Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net> Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
##### [\`0.60.0\`](https://github.com/navidrome/navidrome/releases/tag/v0.60.0) ##### Plugins This release introduces a major rewrite of the experimental **Plugin System**, now with multi-language PDK support, enabling developers to extend Navidrome's functionality using WebAssembly-based plugins written in Go, Rust, Python or JavaScript. Plugins run in a secure sandbox and can provide additional metadata sources, custom integrations, and server-side enhancements. Users can now easily configure plugins directly from the UI through a new JSONForms-based configuration interface. A couple of working plugins are already available: - [AudioMuse-AI integration](https://github.com/NeptuneHub/AudioMuse-AI-NV-plugin) - [ListenBrainz Daily Playlist Importer](https://github.com/kgarner7/navidrome-listenbrainz-daily-playlist) - [Discord Rich Presence](https://github.com/navidrome/discord-rich-presence-plugin) For more plugins, keep an eye on the tag [navidrome-plugins](https://github.com/topics/navidrome-plugin) in GitHub. More details and instructions on how to use and manage plugins can be found in our [documentation](https://www.navidrome.org/docs/usage/features/plugins/). New documentation will soon be added with details on how to create new plugins. ##### Metadata Extraction Additionally, this version includes a **pure-Go metadata extractor** built on top of the new `go-taglib` library. This is a significant step toward removing the C++ TagLib dependency, which will simplify cross-platform builds and packaging in future releases. The new extractor is activated by default, but in case of any issues you can revert to the previous implementation by setting `Scanner.Extractor="legacy-taglib"` configuration option. ##### Instant Mix The Instant Mix feature generates a playlist of similar songs based on a selected track. By default, it retrieves similar songs from Last.fm (if configured with an API key) or falls back to Deezer. It can also be configured to use external plugins, like [AudioMuse-AI](https://github.com/NeptuneHub/AudioMuse-AI-NV-plugin) for sonic analysis-based similarity recommendations. ##### New and Changed Configuration Options ##### Plugin System Options | Option | Default | Description | | -------------------- | --------- | ------------------------------------------------------------- | | `Plugins.Enabled` | `true` | Enable/disable the plugin system | | `Plugins.Folder` | `""` | Path to the plugins directory. Default: `$DataFolder/Plugins` | | `Plugins.CacheSize` | `"200MB"` | Maximum cache size for storing compiled plugin WASM modules | | `Plugins.AutoReload` | `false` | Automatically detect new/changed/removed plugins | | `Plugins.LogLevel` | `""` | Override log level for plugin-related messages | ##### Subsonic API Options | Option | Default | Description | | ------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------ | | `Subsonic.MinimalClients` | `""` | Comma-separated list of clients that receive reduced API responses (useful for resource-constrained devices like smartwatches) | | `Subsonic.EnableAverageRating` | `true` | Include average rating in API responses | ##### Metadata & Matching Options | Option | Default | Description | | ---------------------------- | ------- | -------------------------------------------------------------------------------------------------- | | `SimilarSongsMatchThreshold` | `85` | Minimum similarity score (0-100) for matching similar songs from external sources to local library | | `LastFM.Language` | `"en"` | Now supports comma-separated list of languages (e.g., `"de,fr,en"`) for metadata fallback | | `Deezer.Language` | `"en"` | Now supports comma-separated list of languages for metadata fallback | ##### Renamed Options (Deprecation Notice) The following options have been renamed. The old names still work but will be removed in a future release: | Old Name | New Name | | --------------------------------------------- | -------------------------- | | `HTTPSecurityHeaders.CustomFrameOptionsValue` | `HTTPHeaders.FrameOptions` | ##### Security - Fix potential XSS vulnerability by sanitizing user-supplied data before rendering ([GHSA-rh3r-8pxm-hg4w](GHSA-rh3r-8pxm-hg4w)). ([d7ec735](navidrome/navidrome@d7ec7355c) by [@AlexGustafsson](https://github.com/AlexGustafsson)) - Fix potential DoS vulnerability in cover art upscaling by clamping requested square size to original dimensions ([GHSA-hrr4-3wgr-68x3](GHSA-hrr4-3wgr-68x3)). ([77367548](navidrome/navidrome@77367548f) by [@deluan](https://github.com/deluan)). Thanks to [@yunfachi](https://github.com/yunfachi) ##### Added - Plugins: - Add new WebAssembly-based plugin system with multi-language PDK support (Go, Rust, Python). ([#4833](navidrome/navidrome#4833) by [@deluan](https://github.com/deluan)) - Add JSONForms-based plugin configuration UI. ([#4911](navidrome/navidrome#4911) by [@deluan](https://github.com/deluan)) - Add similar songs retrieval functions to plugins API. ([#4933](navidrome/navidrome#4933) by [@deluan](https://github.com/deluan)) - Server: - Add pure-Go metadata extractor (`go-taglib`) as alternative to FFmpeg-based extraction. ([#4902](navidrome/navidrome#4902) by [@deluan](https://github.com/deluan)) - Add support for reading embedded images using the new taglib extractor by default. ([66474fc](navidrome/navidrome@66474fc9f) by [@deluan](https://github.com/deluan)) - Add Instant Mix (song-based Similar Songs) functionality with MBID, ISRC and Title/Artist fuzzy matching. ([#4919](navidrome/navidrome#4919), [#4946](navidrome/navidrome#4946) by [@deluan](https://github.com/deluan)) - Add support for multiple languages when fetching metadata from Last.fm and Deezer. ([#4952](navidrome/navidrome#4952) by [@deluan](https://github.com/deluan)) - Add `Subsonic.MinimalClients` configuration option for improved compatibility with minimal Subsonic clients. Default list is `"SubMusic"` ([#4850](navidrome/navidrome#4850) by [@typhoon2099](https://github.com/typhoon2099)) - Add support for public/private playlists in NSP import. ([c5447a6](navidrome/navidrome@c5447a637) by [@deluan](https://github.com/deluan)) - Add RISCV64 builds. ([#4949](navidrome/navidrome#4949) by [@MichaIng](https://github.com/MichaIng)) - UI Features: - Add composer field to table views. ([#4857](navidrome/navidrome#4857) by [@AlexGustafsson](https://github.com/AlexGustafsson)) - Add prompt before closing window if music is playing. ([#4899](navidrome/navidrome#4899) by [@alannnna](https://github.com/alannnna)) - Add Nautiline-like theme. ([#4909](navidrome/navidrome#4909) by [@borisrorsvort](https://github.com/borisrorsvort)) - Add multiline support and resizing for playlist comment input. ([6fce30c](navidrome/navidrome@6fce30c13) by [@deluan](https://github.com/deluan)) - Subsonic API: - Add `avgRating` field from Subsonic spec. ([#4900](navidrome/navidrome#4900) by [@terry90](https://github.com/terry90)) - Insights: - Add insights collection for Scanner.Extractor configuration to measure go-taglib usage. ([63517e9](navidrome/navidrome@63517e904) by [@deluan](https://github.com/deluan)) - Add file suffix counting to insights. ([0473c50](navidrome/navidrome@0473c50b4) by [@deluan](https://github.com/deluan)) ##### Changed - Optimize cross-library move detection for single-library setups. ([#4888](navidrome/navidrome#4888) by [@deluan](https://github.com/deluan)) - Improve Deezer artist search ranking. ([a081569](navidrome/navidrome@a081569ed) by [@deluan](https://github.com/deluan)) - Rename `HTTPSecurityHeaders.CustomFrameOptionsValue` to `HTTPHeaders.FrameOptions`. ([7ccf44b](navidrome/navidrome@7ccf44b8e) by [@deluan](https://github.com/deluan)) - Update translations: Bulgarian, Catalan, German, Greek, Spanish, Finnish, French, Galician, Indonesian, Dutch, Polish, Russian, Slovenian, Swedish, Thai by [POEditor contributors](https://www.navidrome.org/docs/developers/translations/). - Update Spanish translations. ([#4904](navidrome/navidrome#4904) by [@abrugues](https://github.com/abrugues)) - Update Basque translation. ([#4815](navidrome/navidrome#4815) by [@xabirequejo](https://github.com/xabirequejo)) ##### Fixed - Playlists: - Fix M3U playlist import failing for paths with different UTF/Unicode representations (NFC/NFD normalization). ([#4890](navidrome/navidrome#4890) by [@deluan](https://github.com/deluan)) - Fix playlist name sorting to be case-insensitive. ([#4845](navidrome/navidrome#4845) by [@deluan](https://github.com/deluan)) - UI: - Fix various UI issues and improve styling coherence. ([#4910](navidrome/navidrome#4910) by [@borisrorsvort](https://github.com/borisrorsvort)) - Fix AMusic theme player buttons and delete button color. ([#4797](navidrome/navidrome#4797) by [@dragonish](https://github.com/dragonish)) - Fix export missing files showing only first 1000 results. ([017676c](navidrome/navidrome@017676c45) by [@deluan](https://github.com/deluan)) - Scanner: - Fix `FullScanInProgress` not reflecting current scan request during interrupted scans. ([8c80be5](navidrome/navidrome@8c80be56d) by [@deluan](https://github.com/deluan)) - Fix "Expression tree is too large" error by executing GetFolderUpdateInfo in batches. ([cde5992](navidrome/navidrome@cde5992c4) by [@deluan](https://github.com/deluan)) - Fix stale role associations when artist role changes. ([2d7b716](navidrome/navidrome@2d7b71683) by [@deluan](https://github.com/deluan)) - Fix infinite recursion in PID configuration. ([1c4a7e8](navidrome/navidrome@1c4a7e855) by [@deluan](https://github.com/deluan)) - Fix default PIDs not being set for Album and Track. In some circumstances it could lead to empty PIDs ([71f549a](navidrome/navidrome@71f549afb) by [@deluan](https://github.com/deluan)) - Fix error when watcher detected too many folder changes, causing the scan to fail. ([9ed309a](navidrome/navidrome@9ed309ac8) by [@deluan](https://github.com/deluan)) - Show scan errors in the UI more consistently. ([ebbc31f](navidrome/navidrome@ebbc31f1a) by [@deluan](https://github.com/deluan)) - Subsonic API: - Fix username parameter validation for `getUser` endpoint. ([6ed6524](navidrome/navidrome@6ed652475) by [@deluan](https://github.com/deluan)) - Fix `getNowPlaying` endpoint to always be enabled regardless of configuration. ([603cccd](navidrome/navidrome@603cccde1) by [@deluan](https://github.com/deluan)) - Server: - Fix JWT-related errors being exposed on share page. ([#4892](navidrome/navidrome#4892) by [@AlexGustafsson](https://github.com/AlexGustafsson)) - Fix user context not preserved in async NowPlaying dispatch. ([396eee4](navidrome/navidrome@396eee48c) by [@deluan](https://github.com/deluan)) - Fix environment variable configuration loading not being logged when no config file is found. ([51ca2de](navidrome/navidrome@51ca2dee6) by [@deluan](https://github.com/deluan)) - Fix items with no annotation not being included for `starred=false` filter, handle `has_rating=false`. ([#4921](navidrome/navidrome#4921) by [@kgarner7](https://github.com/kgarner7)) - Last.fm's `scrobble` and `updateNowPlaying` methods should send parameters in request body. ([51026de](navidrome/navidrome@51026de80) by [@deluan](https://github.com/deluan)) ##### New Contributors - [@alannnna](https://github.com/alannnna) made their first contribution in [#4899](navidrome/navidrome#4899) - [@abrugues](https://github.com/abrugues) made their first contribution in [#4904](navidrome/navidrome#4904) - [@AlexGustafsson](https://github.com/AlexGustafsson) made their first contribution in [#4857](navidrome/navidrome#4857) - [@borisrorsvort](https://github.com/borisrorsvort) made their first contribution in [#4909](navidrome/navidrome#4909) - [@dragonish](https://github.com/dragonish) made their first contribution in [#4797](navidrome/navidrome#4797) - [@MichaIng](https://github.com/MichaIng) made their first contribution in [#4949](navidrome/navidrome#4949) - [@terry90](https://github.com/terry90) made their first contribution in [#4900](navidrome/navidrome#4900) - [@typhoon2099](https://github.com/typhoon2099) made their first contribution in [#4850](navidrome/navidrome#4850) **Full Changelog**: <navidrome/navidrome@v0.59.0...v0.60.0> ##### Helping out This release is only possible thanks to the support of some **awesome people**! Want to be one of them? You can [sponsor](https://github.com/sponsors/deluan), pay me a [Ko-fi](https://ko-fi.com/deluan), or [contribute with code](https://www.navidrome.org/docs/developers/). ##### Where to go next? - Read installation instructions on our [website](https://www.navidrome.org/docs/installation/). - Host Navidrome on [PikaPods](https://www.pikapods.com/pods/navidrome) for a simple cloud solution. - Reach out on [Discord](https://discord.gg/xh7j7yF), [Reddit](https://www.reddit.com/r/navidrome/) and [Twitter](https://twitter.com/navidrome)!
##### [\`0.60.0\`](https://github.com/navidrome/navidrome/releases/tag/v0.60.0) ##### Plugins This release introduces a major rewrite of the experimental **Plugin System**, now with multi-language PDK support, enabling developers to extend Navidrome's functionality using WebAssembly-based plugins written in Go, Rust, Python or JavaScript. Plugins run in a secure sandbox and can provide additional metadata sources, custom integrations, and server-side enhancements. Users can now easily configure plugins directly from the UI through a new JSONForms-based configuration interface. A couple of working plugins are already available: - [AudioMuse-AI integration](https://github.com/NeptuneHub/AudioMuse-AI-NV-plugin) - [ListenBrainz Daily Playlist Importer](https://github.com/kgarner7/navidrome-listenbrainz-daily-playlist) - [Discord Rich Presence](https://github.com/navidrome/discord-rich-presence-plugin) For more plugins, keep an eye on the tag [navidrome-plugins](https://github.com/topics/navidrome-plugin) in GitHub. More details and instructions on how to use and manage plugins can be found in our [documentation](https://www.navidrome.org/docs/usage/features/plugins/). New documentation will soon be added with details on how to create new plugins. ##### Metadata Extraction Additionally, this version includes a **pure-Go metadata extractor** built on top of the new `go-taglib` library. This is a significant step toward removing the C++ TagLib dependency, which will simplify cross-platform builds and packaging in future releases. The new extractor is activated by default, but in case of any issues you can revert to the previous implementation by setting `Scanner.Extractor="legacy-taglib"` configuration option. ##### Instant Mix The Instant Mix feature generates a playlist of similar songs based on a selected track. By default, it retrieves similar songs from Last.fm (if configured with an API key) or falls back to Deezer. It can also be configured to use external plugins, like [AudioMuse-AI](https://github.com/NeptuneHub/AudioMuse-AI-NV-plugin) for sonic analysis-based similarity recommendations. ##### New and Changed Configuration Options ##### Plugin System Options | Option | Default | Description | | -------------------- | --------- | ------------------------------------------------------------- | | `Plugins.Enabled` | `true` | Enable/disable the plugin system | | `Plugins.Folder` | `""` | Path to the plugins directory. Default: `$DataFolder/Plugins` | | `Plugins.CacheSize` | `"200MB"` | Maximum cache size for storing compiled plugin WASM modules | | `Plugins.AutoReload` | `false` | Automatically detect new/changed/removed plugins | | `Plugins.LogLevel` | `""` | Override log level for plugin-related messages | ##### Subsonic API Options | Option | Default | Description | | ------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------ | | `Subsonic.MinimalClients` | `""` | Comma-separated list of clients that receive reduced API responses (useful for resource-constrained devices like smartwatches) | | `Subsonic.EnableAverageRating` | `true` | Include average rating in API responses | ##### Metadata & Matching Options | Option | Default | Description | | ---------------------------- | ------- | -------------------------------------------------------------------------------------------------- | | `SimilarSongsMatchThreshold` | `85` | Minimum similarity score (0-100) for matching similar songs from external sources to local library | | `LastFM.Language` | `"en"` | Now supports comma-separated list of languages (e.g., `"de,fr,en"`) for metadata fallback | | `Deezer.Language` | `"en"` | Now supports comma-separated list of languages for metadata fallback | ##### Renamed Options (Deprecation Notice) The following options have been renamed. The old names still work but will be removed in a future release: | Old Name | New Name | | --------------------------------------------- | -------------------------- | | `HTTPSecurityHeaders.CustomFrameOptionsValue` | `HTTPHeaders.FrameOptions` | ##### Security - Fix potential XSS vulnerability by sanitizing user-supplied data before rendering ([GHSA-rh3r-8pxm-hg4w](GHSA-rh3r-8pxm-hg4w)). ([d7ec735](navidrome/navidrome@d7ec7355c) by [@AlexGustafsson](https://github.com/AlexGustafsson)) - Fix potential DoS vulnerability in cover art upscaling by clamping requested square size to original dimensions ([GHSA-hrr4-3wgr-68x3](GHSA-hrr4-3wgr-68x3)). ([77367548](navidrome/navidrome@77367548f) by [@deluan](https://github.com/deluan)). Thanks to [@yunfachi](https://github.com/yunfachi) ##### Added - Plugins: - Add new WebAssembly-based plugin system with multi-language PDK support (Go, Rust, Python). ([#4833](navidrome/navidrome#4833) by [@deluan](https://github.com/deluan)) - Add JSONForms-based plugin configuration UI. ([#4911](navidrome/navidrome#4911) by [@deluan](https://github.com/deluan)) - Add similar songs retrieval functions to plugins API. ([#4933](navidrome/navidrome#4933) by [@deluan](https://github.com/deluan)) - Server: - Add pure-Go metadata extractor (`go-taglib`) as alternative to FFmpeg-based extraction. ([#4902](navidrome/navidrome#4902) by [@deluan](https://github.com/deluan)) - Add support for reading embedded images using the new taglib extractor by default. ([66474fc](navidrome/navidrome@66474fc9f) by [@deluan](https://github.com/deluan)) - Add Instant Mix (song-based Similar Songs) functionality with MBID, ISRC and Title/Artist fuzzy matching. ([#4919](navidrome/navidrome#4919), [#4946](navidrome/navidrome#4946) by [@deluan](https://github.com/deluan)) - Add support for multiple languages when fetching metadata from Last.fm and Deezer. ([#4952](navidrome/navidrome#4952) by [@deluan](https://github.com/deluan)) - Add `Subsonic.MinimalClients` configuration option for improved compatibility with minimal Subsonic clients. Default list is `"SubMusic"` ([#4850](navidrome/navidrome#4850) by [@typhoon2099](https://github.com/typhoon2099)) - Add support for public/private playlists in NSP import. ([c5447a6](navidrome/navidrome@c5447a637) by [@deluan](https://github.com/deluan)) - Add RISCV64 builds. ([#4949](navidrome/navidrome#4949) by [@MichaIng](https://github.com/MichaIng)) - UI Features: - Add composer field to table views. ([#4857](navidrome/navidrome#4857) by [@AlexGustafsson](https://github.com/AlexGustafsson)) - Add prompt before closing window if music is playing. ([#4899](navidrome/navidrome#4899) by [@alannnna](https://github.com/alannnna)) - Add Nautiline-like theme. ([#4909](navidrome/navidrome#4909) by [@borisrorsvort](https://github.com/borisrorsvort)) - Add multiline support and resizing for playlist comment input. ([6fce30c](navidrome/navidrome@6fce30c13) by [@deluan](https://github.com/deluan)) - Subsonic API: - Add `avgRating` field from Subsonic spec. ([#4900](navidrome/navidrome#4900) by [@terry90](https://github.com/terry90)) - Insights: - Add insights collection for Scanner.Extractor configuration to measure go-taglib usage. ([63517e9](navidrome/navidrome@63517e904) by [@deluan](https://github.com/deluan)) - Add file suffix counting to insights. ([0473c50](navidrome/navidrome@0473c50b4) by [@deluan](https://github.com/deluan)) ##### Changed - Optimize cross-library move detection for single-library setups. ([#4888](navidrome/navidrome#4888) by [@deluan](https://github.com/deluan)) - Improve Deezer artist search ranking. ([a081569](navidrome/navidrome@a081569ed) by [@deluan](https://github.com/deluan)) - Rename `HTTPSecurityHeaders.CustomFrameOptionsValue` to `HTTPHeaders.FrameOptions`. ([7ccf44b](navidrome/navidrome@7ccf44b8e) by [@deluan](https://github.com/deluan)) - Update translations: Bulgarian, Catalan, German, Greek, Spanish, Finnish, French, Galician, Indonesian, Dutch, Polish, Russian, Slovenian, Swedish, Thai by [POEditor contributors](https://www.navidrome.org/docs/developers/translations/). - Update Spanish translations. ([#4904](navidrome/navidrome#4904) by [@abrugues](https://github.com/abrugues)) - Update Basque translation. ([#4815](navidrome/navidrome#4815) by [@xabirequejo](https://github.com/xabirequejo)) ##### Fixed - Playlists: - Fix M3U playlist import failing for paths with different UTF/Unicode representations (NFC/NFD normalization). ([#4890](navidrome/navidrome#4890) by [@deluan](https://github.com/deluan)) - Fix playlist name sorting to be case-insensitive. ([#4845](navidrome/navidrome#4845) by [@deluan](https://github.com/deluan)) - UI: - Fix various UI issues and improve styling coherence. ([#4910](navidrome/navidrome#4910) by [@borisrorsvort](https://github.com/borisrorsvort)) - Fix AMusic theme player buttons and delete button color. ([#4797](navidrome/navidrome#4797) by [@dragonish](https://github.com/dragonish)) - Fix export missing files showing only first 1000 results. ([017676c](navidrome/navidrome@017676c45) by [@deluan](https://github.com/deluan)) - Scanner: - Fix `FullScanInProgress` not reflecting current scan request during interrupted scans. ([8c80be5](navidrome/navidrome@8c80be56d) by [@deluan](https://github.com/deluan)) - Fix "Expression tree is too large" error by executing GetFolderUpdateInfo in batches. ([cde5992](navidrome/navidrome@cde5992c4) by [@deluan](https://github.com/deluan)) - Fix stale role associations when artist role changes. ([2d7b716](navidrome/navidrome@2d7b71683) by [@deluan](https://github.com/deluan)) - Fix infinite recursion in PID configuration. ([1c4a7e8](navidrome/navidrome@1c4a7e855) by [@deluan](https://github.com/deluan)) - Fix default PIDs not being set for Album and Track. In some circumstances it could lead to empty PIDs ([71f549a](navidrome/navidrome@71f549afb) by [@deluan](https://github.com/deluan)) - Fix error when watcher detected too many folder changes, causing the scan to fail. ([9ed309a](navidrome/navidrome@9ed309ac8) by [@deluan](https://github.com/deluan)) - Show scan errors in the UI more consistently. ([ebbc31f](navidrome/navidrome@ebbc31f1a) by [@deluan](https://github.com/deluan)) - Subsonic API: - Fix username parameter validation for `getUser` endpoint. ([6ed6524](navidrome/navidrome@6ed652475) by [@deluan](https://github.com/deluan)) - Fix `getNowPlaying` endpoint to always be enabled regardless of configuration. ([603cccd](navidrome/navidrome@603cccde1) by [@deluan](https://github.com/deluan)) - Server: - Fix JWT-related errors being exposed on share page. ([#4892](navidrome/navidrome#4892) by [@AlexGustafsson](https://github.com/AlexGustafsson)) - Fix user context not preserved in async NowPlaying dispatch. ([396eee4](navidrome/navidrome@396eee48c) by [@deluan](https://github.com/deluan)) - Fix environment variable configuration loading not being logged when no config file is found. ([51ca2de](navidrome/navidrome@51ca2dee6) by [@deluan](https://github.com/deluan)) - Fix items with no annotation not being included for `starred=false` filter, handle `has_rating=false`. ([#4921](navidrome/navidrome#4921) by [@kgarner7](https://github.com/kgarner7)) - Last.fm's `scrobble` and `updateNowPlaying` methods should send parameters in request body. ([51026de](navidrome/navidrome@51026de80) by [@deluan](https://github.com/deluan)) ##### New Contributors - [@alannnna](https://github.com/alannnna) made their first contribution in [#4899](navidrome/navidrome#4899) - [@abrugues](https://github.com/abrugues) made their first contribution in [#4904](navidrome/navidrome#4904) - [@AlexGustafsson](https://github.com/AlexGustafsson) made their first contribution in [#4857](navidrome/navidrome#4857) - [@borisrorsvort](https://github.com/borisrorsvort) made their first contribution in [#4909](navidrome/navidrome#4909) - [@dragonish](https://github.com/dragonish) made their first contribution in [#4797](navidrome/navidrome#4797) - [@MichaIng](https://github.com/MichaIng) made their first contribution in [#4949](navidrome/navidrome#4949) - [@terry90](https://github.com/terry90) made their first contribution in [#4900](navidrome/navidrome#4900) - [@typhoon2099](https://github.com/typhoon2099) made their first contribution in [#4850](navidrome/navidrome#4850) **Full Changelog**: <navidrome/navidrome@v0.59.0...v0.60.0> ##### Helping out This release is only possible thanks to the support of some **awesome people**! Want to be one of them? You can [sponsor](https://github.com/sponsors/deluan), pay me a [Ko-fi](https://ko-fi.com/deluan), or [contribute with code](https://www.navidrome.org/docs/developers/). ##### Where to go next? - Read installation instructions on our [website](https://www.navidrome.org/docs/installation/). - Host Navidrome on [PikaPods](https://www.pikapods.com/pods/navidrome) for a simple cloud solution. - Reach out on [Discord](https://discord.gg/xh7j7yF), [Reddit](https://www.reddit.com/r/navidrome/) and [Twitter](https://twitter.com/navidrome)!
Description
In order to make the UI a bit more useful for classical music, where the
recorded artist isn't the composer of the work, add the composer field
to the song and album songs datatables.
To not affect existing users, the field is default off.
Related Issues
None.
Type of Change
Checklist
Please review and check all that apply:
How to Test
Use the "toggleable fields" button to enable the new "composer" field. It's available via the album list, songs list or album's song list.
Screenshots / Demos (if applicable)
Additional Notes