Subsonic API: added genres/moods tags for albums
This commit is contained in:
@@ -38,13 +38,17 @@ namespace Database
|
|||||||
|
|
||||||
auto query{ session.getDboSession().query<ClusterId>("SELECT DISTINCT c.id FROM cluster c") };
|
auto query{ session.getDboSession().query<ClusterId>("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_cluster t_c ON t_c.cluster_id = c.id");
|
||||||
query.join("track t ON t.id = t_c.track_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())
|
if (params.clusterType.isValid())
|
||||||
query.where("c.cluster_type_id = ?").bind(params.clusterType);
|
query.where("c.cluster_type_id = ?").bind(params.clusterType);
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,9 @@
|
|||||||
#include <Wt/Dbo/Dbo.h>
|
#include <Wt/Dbo/Dbo.h>
|
||||||
#include <Wt/WDateTime.h>
|
#include <Wt/WDateTime.h>
|
||||||
|
|
||||||
#include "services/database/Object.hpp"
|
|
||||||
#include "services/database/ClusterId.hpp"
|
#include "services/database/ClusterId.hpp"
|
||||||
|
#include "services/database/Object.hpp"
|
||||||
|
#include "services/database/Release.hpp"
|
||||||
#include "services/database/TrackId.hpp"
|
#include "services/database/TrackId.hpp"
|
||||||
#include "services/database/Types.hpp"
|
#include "services/database/Types.hpp"
|
||||||
|
|
||||||
@@ -46,10 +47,12 @@ namespace Database {
|
|||||||
Range range;
|
Range range;
|
||||||
ClusterTypeId clusterType; // if non empty, clusters that belong to this cluster type
|
ClusterTypeId clusterType; // if non empty, clusters that belong to this cluster type
|
||||||
TrackId track; // if set, clusters involved in this track
|
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& setRange(Range _range) { range = _range; return *this; }
|
||||||
FindParameters& setClusterType(ClusterTypeId _clusterType) { clusterType = _clusterType; return *this; }
|
FindParameters& setClusterType(ClusterTypeId _clusterType) { clusterType = _clusterType; return *this; }
|
||||||
FindParameters& setTrack(TrackId _track) { track = _track; return *this; }
|
FindParameters& setTrack(TrackId _track) { track = _track; return *this; }
|
||||||
|
FindParameters& setRelease(ReleaseId _release) { release = _release; return *this; }
|
||||||
};
|
};
|
||||||
|
|
||||||
Cluster() = default;
|
Cluster() = default;
|
||||||
|
|||||||
@@ -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() };
|
auto transaction{ session.createSharedTransaction() };
|
||||||
|
|
||||||
|
|||||||
@@ -98,6 +98,29 @@ namespace API::Subsonic
|
|||||||
std::optional<UUID> mbid {release->getMBID()};
|
std::optional<UUID> mbid {release->getMBID()};
|
||||||
albumNode.setAttribute("musicBrainzId", mbid ? mbid->getAsString() : "");
|
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;
|
return albumNode;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user