From bdf6ca30e5732a3509b0335b8ed90a87a2d5939f Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Tue, 12 May 2026 18:10:59 -0600 Subject: [PATCH] fix(local-library): prefer album metadata over folder-derived title (#411) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User-reported: Local Library Albums view showed the folder name as the album title even when the album tag in the track metadata had a different value — e.g. folder `Alle Songs` shadowed metadata `ALBUM.`. Cause: the three metadata-grouped album queries (full-load `get_albums_metadata_grouped`, chunked `get_albums_metadata_page`, and `count_albums_metadata_for_page`) projected the title via `COALESCE(album_group_title, album, 'Unknown Album')`. `album_group_title` is the snapshot the scanner wrote — it contains the tag's album when the tag was present at scan time, otherwise the folder name. So whenever a tag was missing or changed after scan, the folder name would win over the live `album` column. Fixed the priority by querying `album` first and falling back to `album_group_title` only when the live metadata is empty / NULL / 'Unknown Album': COALESCE( NULLIF(NULLIF(TRIM(album), ''), 'Unknown Album'), album_group_title, 'Unknown Album' ) Folder-grouped queries (which use `album_group_key` first and intentionally prefer folder-derived titles) are unchanged. Closes #411 cc --- crates/qbz-library/src/database.rs | 36 +++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/crates/qbz-library/src/database.rs b/crates/qbz-library/src/database.rs index ccd6a760e..1ee153f6e 100644 --- a/crates/qbz-library/src/database.rs +++ b/crates/qbz-library/src/database.rs @@ -1789,7 +1789,17 @@ impl LibraryDatabase { WITH grouped AS ( SELECT {group_key} AS group_key, - COALESCE(album_group_title, album, 'Unknown Album') AS title, + -- Prefer `album` (metadata tag) over + -- `album_group_title` (scan-time snapshot, which + -- falls back to folder name if metadata is + -- missing). Fixes #411 — when album metadata is + -- valid, the folder name was winning because + -- COALESCE returned `album_group_title` first. + COALESCE( + NULLIF(NULLIF(TRIM(album), ''), 'Unknown Album'), + album_group_title, + 'Unknown Album' + ) AS title, COALESCE(album_artist, artist, 'Unknown Artist') AS artist, year, catalog_number, @@ -2043,7 +2053,17 @@ impl LibraryDatabase { WITH grouped AS ( SELECT {group_key} AS group_key, - COALESCE(album_group_title, album, 'Unknown Album') AS title, + -- Prefer `album` (metadata tag) over + -- `album_group_title` (scan-time snapshot, which + -- falls back to folder name if metadata is + -- missing). Fixes #411 — when album metadata is + -- valid, the folder name was winning because + -- COALESCE returned `album_group_title` first. + COALESCE( + NULLIF(NULLIF(TRIM(album), ''), 'Unknown Album'), + album_group_title, + 'Unknown Album' + ) AS title, COALESCE(album_artist, artist, 'Unknown Artist') AS artist, year, catalog_number, @@ -2231,7 +2251,17 @@ impl LibraryDatabase { WITH grouped AS ( SELECT {group_key} AS group_key, - COALESCE(album_group_title, album, 'Unknown Album') AS title, + -- Prefer `album` (metadata tag) over + -- `album_group_title` (scan-time snapshot, which + -- falls back to folder name if metadata is + -- missing). Fixes #411 — when album metadata is + -- valid, the folder name was winning because + -- COALESCE returned `album_group_title` first. + COALESCE( + NULLIF(NULLIF(TRIM(album), ''), 'Unknown Album'), + album_group_title, + 'Unknown Album' + ) AS title, COALESCE(album_artist, artist, 'Unknown Artist') AS artist, artist AS track_artist FROM local_tracks