diff --git a/src/libs/services/database/impl/Cluster.cpp b/src/libs/services/database/impl/Cluster.cpp index 1d000ef7..6acc874a 100644 --- a/src/libs/services/database/impl/Cluster.cpp +++ b/src/libs/services/database/impl/Cluster.cpp @@ -38,13 +38,17 @@ namespace Database auto query{ session.getDboSession().query("SELECT DISTINCT c.id FROM cluster c") }; - if (params.track.isValid()) + if (params.track.isValid() || params.release.isValid()) { query.join("track_cluster t_c ON t_c.cluster_id = c.id"); query.join("track t ON t.id = t_c.track_id"); - query.where("t.id = ?").bind(params.track); } + if (params.track.isValid()) + query.where("t.id = ?").bind(params.track); + if (params.release.isValid()) + query.where("t.release_id = ?").bind(params.release); + if (params.clusterType.isValid()) query.where("c.cluster_type_id = ?").bind(params.clusterType); diff --git a/src/libs/services/database/include/services/database/Cluster.hpp b/src/libs/services/database/include/services/database/Cluster.hpp index 049f1433..4f416e7f 100644 --- a/src/libs/services/database/include/services/database/Cluster.hpp +++ b/src/libs/services/database/include/services/database/Cluster.hpp @@ -26,8 +26,9 @@ #include #include -#include "services/database/Object.hpp" #include "services/database/ClusterId.hpp" +#include "services/database/Object.hpp" +#include "services/database/Release.hpp" #include "services/database/TrackId.hpp" #include "services/database/Types.hpp" @@ -46,10 +47,12 @@ namespace Database { Range range; ClusterTypeId clusterType; // if non empty, clusters that belong to this cluster type TrackId track; // if set, clusters involved in this track + ReleaseId release; // if set, clusters involved in this release FindParameters& setRange(Range _range) { range = _range; return *this; } FindParameters& setClusterType(ClusterTypeId _clusterType) { clusterType = _clusterType; return *this; } FindParameters& setTrack(TrackId _track) { track = _track; return *this; } + FindParameters& setRelease(ReleaseId _release) { release = _release; return *this; } }; Cluster() = default; diff --git a/src/libs/services/database/test/Cluster.cpp b/src/libs/services/database/test/Cluster.cpp index 5ed5f649..d9caa140 100644 --- a/src/libs/services/database/test/Cluster.cpp +++ b/src/libs/services/database/test/Cluster.cpp @@ -314,6 +314,14 @@ TEST_F(DatabaseFixture, Cluster_singleTrackSingleReleaseSingleCluster) } } + { + auto transaction{ session.createSharedTransaction() }; + + auto clusters{ Cluster::find(session, Cluster::FindParameters{}.setRelease(release.getId())) }; + ASSERT_EQ(clusters.results.size(), 1); + EXPECT_EQ(clusters.results.front(), cluster.getId()); + } + { auto transaction{ session.createSharedTransaction() }; diff --git a/src/libs/subsonic/impl/responses/Album.cpp b/src/libs/subsonic/impl/responses/Album.cpp index 4aba2d16..9e3dc615 100644 --- a/src/libs/subsonic/impl/responses/Album.cpp +++ b/src/libs/subsonic/impl/responses/Album.cpp @@ -98,6 +98,29 @@ namespace API::Subsonic std::optional mbid {release->getMBID()}; albumNode.setAttribute("musicBrainzId", mbid ? mbid->getAsString() : ""); } + + auto addClusters{ [&](std::string_view field, std::string_view clusterTypeName) + { + albumNode.createEmptyArrayValue(field); + + ClusterType::pointer clusterType{ ClusterType::find(dbSession, clusterTypeName) }; + if (clusterType) + { + Cluster::FindParameters params; + params.setRelease(release->getId()); + params.setClusterType(clusterType->getId()); + + for (const ClusterId clusterId : Cluster::find(dbSession, params).results) + { + Cluster::pointer cluster {Cluster::find(dbSession, clusterId)}; + if (cluster) + albumNode.addArrayValue(field, cluster->getName()); + } + } + } }; + + addClusters("genres", "GENRE"); + addClusters("moods", "MOOD"); return albumNode; }