From 31dd910289e536904ff519a205e979c821dbb233 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sat, 5 Sep 2020 18:59:35 +0200 Subject: [PATCH] Make sure albums in cover manager are unique Fixes #529 --- src/collection/collectionbackend.cpp | 50 +++++++++++++++++----------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/src/collection/collectionbackend.cpp b/src/collection/collectionbackend.cpp index feb70023b..32892d41b 100644 --- a/src/collection/collectionbackend.cpp +++ b/src/collection/collectionbackend.cpp @@ -1000,10 +1000,8 @@ void CollectionBackend::UpdateCompilations(QSqlQuery &find_song, QSqlQuery &upda CollectionBackend::AlbumList CollectionBackend::GetAlbums(const QString &artist, const bool compilation_required, const QueryOptions &opt) { - AlbumList ret; - CollectionQuery query(opt); - query.SetColumnSpec("album, artist, albumartist, compilation, compilation_detected, art_automatic, art_manual, url"); + query.SetColumnSpec("url, artist, albumartist, album, compilation_effective, art_automatic, art_manual"); query.SetOrderBy("album"); if (compilation_required) { @@ -1016,20 +1014,24 @@ CollectionBackend::AlbumList CollectionBackend::GetAlbums(const QString &artist, { QMutexLocker l(db_->Mutex()); - if (!ExecQuery(&query)) return ret; + if (!ExecQuery(&query)) return AlbumList(); } - QString last_album; - QString last_artist; - QString last_album_artist; + QMap albums; while (query.Next()) { - bool is_compilation = query.Value(3).toBool() | query.Value(4).toBool(); + bool is_compilation = query.Value(4).toBool(); Album info; - info.artist = is_compilation ? QString() : query.Value(1).toString(); - info.album_artist = is_compilation ? QString() : query.Value(2).toString(); - info.album_name = query.Value(0).toString(); - info.first_url = QUrl::fromEncoded(query.Value(7).toByteArray()); + QString directory; + info.first_url = QUrl::fromEncoded(query.Value(0).toByteArray()); + if (is_compilation) { + directory = info.first_url.toString(QUrl::PreferLocalFile|QUrl::RemoveFilename); + } + else { + info.artist = query.Value(1).toString(); + info.album_artist = query.Value(2).toString(); + } + info.album_name = query.Value(3).toString(); QString art_automatic = query.Value(5).toString(); if (art_automatic.contains(QRegularExpression("..+:.*"))) { @@ -1047,17 +1049,27 @@ CollectionBackend::AlbumList CollectionBackend::GetAlbums(const QString &artist, info.art_manual = QUrl::fromLocalFile(art_manual); } - if ((info.artist == last_artist || info.album_artist == last_album_artist) && info.album_name == last_album) - continue; + QString effective_albumartist = info.album_artist.isEmpty() ? info.artist : info.album_artist; + QString key; + if (!effective_albumartist.isEmpty()) { + key.append(effective_albumartist); + } + if (!directory.isEmpty()) { + if (!key.isEmpty()) key.append("-"); + key.append(directory); + } + if (!info.album_name.isEmpty()) { + if (!key.isEmpty()) key.append("-"); + key.append(info.album_name); + } - ret << info; + if (key.isEmpty()) continue; + + if (!albums.contains(key)) albums.insert(key, info); - last_album = info.album_name; - last_artist = info.artist; - last_album_artist = info.album_artist; } - return ret; + return albums.values(); }