Add Edit Details, lyrics beside the player bar and in a tab, and the sound server's volume, and prepare the 0.6.0 release #21

Merged
GrumpyStraw merged 1 commit from release-0.6.0 into main 2026-10-21 19:35:07 +02:00
Owner

Edit Details

  • Edit Details, in the right-click menu of a song in All Music, a playlist or Now Playing, writes the song's tags and cover into its file. tag_editor.rs writes through lofty's types for each format (MP3, FLAC, Ogg Vorbis, Opus, Speex, M4A, AAC and WAV), and splits each tag into the fields the editor shows and the rest, so the rest stays as it was.
  • Only the fields that changed are written. A field replaces its value under every tag key it covers, so a cleared date takes a release date with it, and new lyrics replace both LYRICS and UNSYNCEDLYRICS.
  • The cover can be replaced with a JPEG or PNG image, or removed. Both take out every picture marked as the front cover or as "other", since FFmpeg often writes the same cover both ways. A back cover stays.
  • The changes go into a new copy next to the song (File::create_new), which then replaces it, with the song's permissions and user.* extended attributes. A song shared through the document portal on its own has no folder for a copy and is written in place.
  • SongEditor saves on a thread of its own. The player bar, All Music and the playlists read the song again afterwards, and the covers load again only when the cover changed. A save that ends after the dialog was closed shows its result as a notification.

Lyrics

  • The arrow at the top right of the Normal and Expanded bars shows or hides the lyrics on the right of the bar, with a line to drag between the controls and the lyrics. A Lyrics tab after All Music shows them in a bigger font, opened from the Mini bar or beside the lyrics in the larger bars.
  • LyricsView.qml shows each line large and bold. With LRC timestamps, the line being sung is larger and the view scrolls to keep it in the middle, and four seconds after a manual scroll it follows the song again. [offset:] lines move the times.
  • MP3 lyrics are read from the ID3v2 USLT frame, which lofty maps to UnsyncLyrics.

Player bar

  • Clicking the artist, album, year or genre filters All Music with a field such as album:=Fierce. search::toggle_field adds the field, replaces it for another value, and takes it out for the same value. An artist taken from the file name is not a link, since no tag has it.
  • A field with = matches the whole value. Search texts keep each tagged value on one line with single spaces, so a value with two spaces in a row or line breaks still matches. year:=08 matches a date tag that is only 08.
  • Clicking the length shows the time left, and the choice is saved.
  • The volume is the app's volume in the sound server. volume.rs sets it on the player's streams through libpulse, finds them by the PULSE_PROP_strawly.instance property main.cpp sets, and follows changes made in the Plasma applet. The slider goes up to 150% when the applet raises the app above 100%.
  • The Normal bar is no longer cut off, and the year comes from the date before the release dates.

Now Playing

  • Right-click a song for Edit Details and Remove from Now Playing.
  • Save as a playlist, above Now Playing, saves the songs in play order as a new playlist. createPlaylist now takes the songs and writes them in the same save, so a failed save leaves no empty playlist.

Opening songs and one running copy

  • The desktop file lists the audio types, so Open With offers the app. Settings → Music files opens systemsettings://kcm_componentchooser, since the Flatpak cannot make itself the default.
  • instance.rs owns app.strawly.music on the session bus and serves org.freedesktop.Application. A second start hands over its files and activation token and ends. Without a session bus, the app runs on its own and still plays its files.
  • windowactivation.cpp brings the window to the front with that token through the xdg-activation protocol, instead of setting XDG_ACTIVATION_TOKEN while other threads run. CMake writes the protocol code with wayland-scanner, and its MIT notice is in LICENSES/xdg-activation-v1.txt, installed with the other license texts.

Colors and donations

  • colorscheme.cpp follows a new KDE color scheme while the app runs. It reads the colors from the Settings portal, writes them into a scheme file in the cache folder and sets KDE_COLOR_SCHEME_PATH and the application palette, since the Flatpak's kdeglobals stays bound to the file from the start.
  • A donation dialog shows once a year and when the major version goes up, never on the first start. The dates are under [donation] in the settings.

Repository name

The repository is now Strawly-Music/desktop. The links in the metainfo, the About dialog, the README and the changelog point there.

0.6.0 release prep

  • Version 0.6.0 in Cargo.toml, Cargo.lock, CMakeLists.txt and the README's install command.
  • A 0.6.0 entry in data/app.strawly.music.metainfo.xml. appstreamcli validate passes.
  • The changes are under [0.6.0] - 2026-10-20 in CHANGELOG.md, with the compare links updated. FEATURES.md covers lyrics, Edit Details and opening songs, and DEVELOPMENT.md the new C++ files and portals.

Checked

check.sh passes in org.kde.Sdk//6.11, with all 3 tests. New tests cover writing the fields and covers of each format, keeping frames and extended attributes the editor does not show, replacing a field under each of its keys, the libpulse struct layouts and volume scale, whole-value search fields and toggling them, the year from the date, LRC line times, and removing songs from Now Playing. .forgejo/release-notes.sh 0.6.0 prints the notes. The Flatpak builds, installs and reports version 0.6.0.

Tested by hand on Plasma 6 (Wayland) with the installed build.

## Edit Details - Edit Details, in the right-click menu of a song in All Music, a playlist or Now Playing, writes the song's tags and cover into its file. `tag_editor.rs` writes through lofty's types for each format (MP3, FLAC, Ogg Vorbis, Opus, Speex, M4A, AAC and WAV), and splits each tag into the fields the editor shows and the rest, so the rest stays as it was. - Only the fields that changed are written. A field replaces its value under every tag key it covers, so a cleared date takes a release date with it, and new lyrics replace both `LYRICS` and `UNSYNCEDLYRICS`. - The cover can be replaced with a JPEG or PNG image, or removed. Both take out every picture marked as the front cover or as "other", since FFmpeg often writes the same cover both ways. A back cover stays. - The changes go into a new copy next to the song (`File::create_new`), which then replaces it, with the song's permissions and `user.*` extended attributes. A song shared through the document portal on its own has no folder for a copy and is written in place. - `SongEditor` saves on a thread of its own. The player bar, All Music and the playlists read the song again afterwards, and the covers load again only when the cover changed. A save that ends after the dialog was closed shows its result as a notification. ## Lyrics - The arrow at the top right of the Normal and Expanded bars shows or hides the lyrics on the right of the bar, with a line to drag between the controls and the lyrics. A Lyrics tab after All Music shows them in a bigger font, opened from the Mini bar or beside the lyrics in the larger bars. - `LyricsView.qml` shows each line large and bold. With LRC timestamps, the line being sung is larger and the view scrolls to keep it in the middle, and four seconds after a manual scroll it follows the song again. `[offset:]` lines move the times. - MP3 lyrics are read from the ID3v2 `USLT` frame, which lofty maps to `UnsyncLyrics`. ## Player bar - Clicking the artist, album, year or genre filters All Music with a field such as `album:=Fierce`. `search::toggle_field` adds the field, replaces it for another value, and takes it out for the same value. An artist taken from the file name is not a link, since no tag has it. - A field with `=` matches the whole value. Search texts keep each tagged value on one line with single spaces, so a value with two spaces in a row or line breaks still matches. `year:=08` matches a date tag that is only `08`. - Clicking the length shows the time left, and the choice is saved. - The volume is the app's volume in the sound server. `volume.rs` sets it on the player's streams through libpulse, finds them by the `PULSE_PROP_strawly.instance` property `main.cpp` sets, and follows changes made in the Plasma applet. The slider goes up to 150% when the applet raises the app above 100%. - The Normal bar is no longer cut off, and the year comes from the date before the release dates. ## Now Playing - Right-click a song for Edit Details and Remove from Now Playing. - Save as a playlist, above Now Playing, saves the songs in play order as a new playlist. `createPlaylist` now takes the songs and writes them in the same save, so a failed save leaves no empty playlist. ## Opening songs and one running copy - The desktop file lists the audio types, so Open With offers the app. Settings → Music files opens `systemsettings://kcm_componentchooser`, since the Flatpak cannot make itself the default. - `instance.rs` owns `app.strawly.music` on the session bus and serves `org.freedesktop.Application`. A second start hands over its files and activation token and ends. Without a session bus, the app runs on its own and still plays its files. - `windowactivation.cpp` brings the window to the front with that token through the xdg-activation protocol, instead of setting `XDG_ACTIVATION_TOKEN` while other threads run. CMake writes the protocol code with `wayland-scanner`, and its MIT notice is in `LICENSES/xdg-activation-v1.txt`, installed with the other license texts. ## Colors and donations - `colorscheme.cpp` follows a new KDE color scheme while the app runs. It reads the colors from the Settings portal, writes them into a scheme file in the cache folder and sets `KDE_COLOR_SCHEME_PATH` and the application palette, since the Flatpak's `kdeglobals` stays bound to the file from the start. - A donation dialog shows once a year and when the major version goes up, never on the first start. The dates are under `[donation]` in the settings. ## Repository name The repository is now `Strawly-Music/desktop`. The links in the metainfo, the About dialog, the README and the changelog point there. ## 0.6.0 release prep - Version 0.6.0 in `Cargo.toml`, `Cargo.lock`, `CMakeLists.txt` and the README's install command. - A 0.6.0 entry in `data/app.strawly.music.metainfo.xml`. `appstreamcli validate` passes. - The changes are under `[0.6.0] - 2026-10-20` in `CHANGELOG.md`, with the compare links updated. `FEATURES.md` covers lyrics, Edit Details and opening songs, and `DEVELOPMENT.md` the new C++ files and portals. ## Checked `check.sh` passes in `org.kde.Sdk//6.11`, with all 3 tests. New tests cover writing the fields and covers of each format, keeping frames and extended attributes the editor does not show, replacing a field under each of its keys, the libpulse struct layouts and volume scale, whole-value search fields and toggling them, the year from the date, LRC line times, and removing songs from Now Playing. `.forgejo/release-notes.sh 0.6.0` prints the notes. The Flatpak builds, installs and reports version 0.6.0. Tested by hand on Plasma 6 (Wayland) with the installed build.
Add Edit Details, lyrics beside the player bar and in a tab, and the sound server's volume, and prepare the 0.6.0 release
All checks were successful
Pull request checks / Lint and test (pull_request) Successful in 8m1s
7ca599648f
## Edit Details

- Edit Details, in the right-click menu of a song in All Music, a playlist or Now Playing, writes the song's tags and cover into its file. `tag_editor.rs` writes through lofty's types for each format (MP3, FLAC, Ogg Vorbis, Opus, Speex, M4A, AAC and WAV), and splits each tag into the fields the editor shows and the rest, so the rest stays as it was.
- Only the fields that changed are written. A field replaces its value under every tag key it covers, so a cleared date takes a release date with it, and new lyrics replace both `LYRICS` and `UNSYNCEDLYRICS`.
- The cover can be replaced with a JPEG or PNG image, or removed. Both take out every picture marked as the front cover or as "other", since FFmpeg often writes the same cover both ways. A back cover stays.
- The changes go into a new copy next to the song (`File::create_new`), which then replaces it, with the song's permissions and `user.*` extended attributes. A song shared through the document portal on its own has no folder for a copy and is written in place.
- `SongEditor` saves on a thread of its own. The player bar, All Music and the playlists read the song again afterwards, and the covers load again only when the cover changed. A save that ends after the dialog was closed shows its result as a notification.

## Lyrics

- The arrow at the top right of the Normal and Expanded bars shows or hides the lyrics on the right of the bar, with a line to drag between the controls and the lyrics. A Lyrics tab after All Music shows them in a bigger font, opened from the Mini bar or beside the lyrics in the larger bars.
- `LyricsView.qml` shows each line large and bold. With LRC timestamps, the line being sung is larger and the view scrolls to keep it in the middle, and four seconds after a manual scroll it follows the song again. `[offset:]` lines move the times.
- MP3 lyrics are read from the ID3v2 `USLT` frame, which lofty maps to `UnsyncLyrics`.

## Player bar

- Clicking the artist, album, year or genre filters All Music with a field such as `album:=Fierce`. `search::toggle_field` adds the field, replaces it for another value, and takes it out for the same value. An artist taken from the file name is not a link, since no tag has it.
- A field with `=` matches the whole value. Search texts keep each tagged value on one line with single spaces, so a value with two spaces in a row or line breaks still matches. `year:=08` matches a date tag that is only `08`.
- Clicking the length shows the time left, and the choice is saved.
- The volume is the app's volume in the sound server. `volume.rs` sets it on the player's streams through libpulse, finds them by the `PULSE_PROP_strawly.instance` property `main.cpp` sets, and follows changes made in the Plasma applet. The slider goes up to 150% when the applet raises the app above 100%.
- The Normal bar is no longer cut off, and the year comes from the date before the release dates.

## Now Playing

- Right-click a song for Edit Details and Remove from Now Playing.
- Save as a playlist, above Now Playing, saves the songs in play order as a new playlist. `createPlaylist` now takes the songs and writes them in the same save, so a failed save leaves no empty playlist.

## Opening songs and one running copy

- The desktop file lists the audio types, so Open With offers the app. Settings → Music files opens `systemsettings://kcm_componentchooser`, since the Flatpak cannot make itself the default.
- `instance.rs` owns `app.strawly.music` on the session bus and serves `org.freedesktop.Application`. A second start hands over its files and activation token and ends. Without a session bus, the app runs on its own and still plays its files.
- `windowactivation.cpp` brings the window to the front with that token through the xdg-activation protocol, instead of setting `XDG_ACTIVATION_TOKEN` while other threads run. CMake writes the protocol code with `wayland-scanner`, and its MIT notice is in `LICENSES/xdg-activation-v1.txt`, installed with the other license texts.

## Colors and donations

- `colorscheme.cpp` follows a new KDE color scheme while the app runs. It reads the colors from the Settings portal, writes them into a scheme file in the cache folder and sets `KDE_COLOR_SCHEME_PATH` and the application palette, since the Flatpak's `kdeglobals` stays bound to the file from the start.
- A donation dialog shows once a year and when the major version goes up, never on the first start. The dates are under `[donation]` in the settings.

## Repository name

The repository is now `Strawly-Music/desktop`. The links in the metainfo, the About dialog, the README and the changelog point there.

## 0.6.0 release prep

- Version 0.6.0 in `Cargo.toml`, `Cargo.lock`, `CMakeLists.txt` and the README's install command.
- A 0.6.0 entry in `data/app.strawly.music.metainfo.xml`. `appstreamcli validate` passes.
- The changes are under `[0.6.0] - 2026-10-20` in `CHANGELOG.md`, with the compare links updated. `FEATURES.md` covers lyrics, Edit Details and opening songs, and `DEVELOPMENT.md` the new C++ files and portals.

## Checked

`check.sh` passes in `org.kde.Sdk//6.11`, with all 3 tests. New tests cover writing the fields and covers of each format, keeping frames and extended attributes the editor does not show, replacing a field under each of its keys, the libpulse struct layouts and volume scale, whole-value search fields and toggling them, the year from the date, LRC line times, and removing songs from Now Playing. `.forgejo/release-notes.sh 0.6.0` prints the notes. The Flatpak builds, installs and reports version 0.6.0.

Tested by hand on Plasma 6 (Wayland) with the installed build.
GrumpyStraw scheduled this pull request to auto merge when all checks succeed 2026-10-21 19:28:16 +02:00
GrumpyStraw deleted branch release-0.6.0 2026-10-21 19:35:07 +02:00
Sign in to join this conversation.
No description provided.