Dynamic Playlists
The main new feature of this version is Dynamic Playlists (DPs). Instead of a fixed list of songs, you can now set filter/ordering rules and query all matching songs. These rules may be dynamic, for example "sort by descending listen count" and "limit to songs played in the last 30 days".
With DPs, one can create things like a "personal top-10", "newly-added songs", "songs I hate and skip all the time", etc.
Initial capabilities:
- Supports both stickers-based (ratings, last play, play count, skip count) and query-based (tags, URIs) rules with one UI. This is in contrast with existing designs such as myMPD's (one needs to select a "rule type" beforehand, and that DP is then
- Zero, one or many of the above rules. If no filtering rules are added, you'll be fetching the entire library at once.
- Zero, one or many ordering clauses, with a special "random" clause that would trigger a shuffle on every queue.
- Real-time error checking & dynamically limited options. For example: if the "random" ordering clause is specified, then no other ordering clause may be added; rating filter rules must be within 0-5; etc. Any detected misconfiguration will prevent saving.
- Scheduled refresh based on system time and a user-configurable frequency (refresh once on the first load of every new day, for example).
- Optional fetch limit to get first N songs only (to facilitate things like "top 10 most listened songs". Note that this does not (and cannot) limit the number of songs actually fetched to the local machine as we have to resolve rule intersections locally.
- JSON import & export for backup or sharing
- Cover images
- Conversion to fixed playlist by freezing the current queried results and saving them as a new MPD-side playlist.
UI tweaks
- Increase max blur radius to 2048px (#180).
- Refactor sorting and filtering logic to rely more on expressions & their UI widgets to be more compact.
- Full-size bottom bar now requires a minimum window height of 680px (minified bar will be shown instead for lower heights).
Refactors & optimisations
- Implement a unified SongRow widget for use everywhere (cuts down 2700 SLoC)
- Reduce dependence on async channels in metadata cache code where possible.
- Cut down on unnecessary async polls (e.g., the loops for awaiting ashpd file selectors opened by album art/artist avatar/playlist cover selection).
Bugfixes
- Hide "Read more" link widget when no wiki/bio text entry is available (currently erroneously pointing to last album/artist with wiki/bio).
- Fix various quirks in existing UIs.
- Fix hanging after wake-from-suspend when connected to a remote server (requires
systemddistributions)
Pull Requests
- Redesign audio output widget to fit in bottom bar by @htkhiem in #191
- Proactively disconnect before suspend and reconnect after wake by @htkhiem in #194
- v0.98.0: Dynamic playlists, playlist images, song ratings, play/skip count keeping & more by @htkhiem in #179
Full Changelog: v0.97.2-beta...v0.98.0-beta