Fixed output bug for values, added some optims
This commit is contained in:
@@ -58,7 +58,7 @@ namespace API::Subsonic
|
||||
_attributes[key] = std::string{ value };
|
||||
}
|
||||
|
||||
void Response::Node::addChild(Key key, Node node)
|
||||
void Response::Node::addChild(Key key, Node&& node)
|
||||
{
|
||||
assert(!_value);
|
||||
assert(_children.find(key) == std::cend(_children));
|
||||
@@ -72,7 +72,7 @@ namespace API::Subsonic
|
||||
_childrenArrays.emplace(key, std::vector<Node>{});
|
||||
}
|
||||
|
||||
void Response::Node::addArrayChild(Key key, Node node)
|
||||
void Response::Node::addArrayChild(Key key, Node&& node)
|
||||
{
|
||||
assert(!_value);
|
||||
assert(_children.find(key) == std::cend(_children));
|
||||
@@ -155,7 +155,7 @@ namespace API::Subsonic
|
||||
return response;
|
||||
}
|
||||
|
||||
void Response::addNode(Node::Key key, Node node)
|
||||
void Response::addNode(Node::Key key, Node&& node)
|
||||
{
|
||||
return _root._children["subsonic-response"].addChild(key, std::move(node));
|
||||
}
|
||||
@@ -266,7 +266,7 @@ namespace API::Subsonic
|
||||
if (!first)
|
||||
os << ',';
|
||||
|
||||
os << "value:";
|
||||
os << "\"value\":";
|
||||
serializeValue(os, *node._value);
|
||||
|
||||
first = false;
|
||||
|
||||
@@ -225,9 +225,9 @@ namespace API::Subsonic
|
||||
Node& createChild(Key key);
|
||||
Node& createArrayChild(Key key);
|
||||
|
||||
void addChild(Key key, Node node);
|
||||
void addChild(Key key, Node&& node);
|
||||
void createEmptyArrayChild(Key key);
|
||||
void addArrayChild(Key key, Node node);
|
||||
void addArrayChild(Key key, Node&& node);
|
||||
void createEmptyArrayValue(Key key);
|
||||
void addArrayValue(Key key, std::string_view value);
|
||||
void addArrayValue(Key key, long long value);
|
||||
@@ -255,7 +255,7 @@ namespace API::Subsonic
|
||||
Response(Response&&) = default;
|
||||
Response& operator=(Response&&) = default;
|
||||
|
||||
void addNode(Node::Key key, Node node);
|
||||
void addNode(Node::Key key, Node&& node);
|
||||
Node& createNode(Node::Key key);
|
||||
Node& createArrayNode(Node::Key key);
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace API::Subsonic
|
||||
for (const TrackListEntry::pointer& entry : entries)
|
||||
playlistNode.addArrayChild("entry", createSongNode(entry->getTrack(), context.dbSession, user));
|
||||
|
||||
response.addNode("playlist", playlistNode);
|
||||
response.addNode("playlist", std::move(playlistNode));
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ namespace API::Subsonic
|
||||
}
|
||||
|
||||
if (const Wt::WDateTime dateTime{ Service<Scrobbling::IScrobblingService>::get()->getStarredDateTime(user->getId(), release->getId()) }; dateTime.isValid())
|
||||
albumNode.setAttribute("starred", StringUtils::toISO8601String(dateTime)); // TODO report correct date/time
|
||||
albumNode.setAttribute("starred", StringUtils::toISO8601String(dateTime));
|
||||
|
||||
// OpenSubsonic specific fields (must always be set)
|
||||
if (!id3)
|
||||
@@ -160,33 +160,23 @@ namespace API::Subsonic
|
||||
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());
|
||||
}
|
||||
for (const auto& cluster : Cluster::find(dbSession, params).results)
|
||||
albumNode.addArrayValue(field, std::get<std::string>(cluster));
|
||||
}
|
||||
} };
|
||||
|
||||
addClusters("moods", "MOOD");
|
||||
|
||||
// Genres
|
||||
albumNode.createEmptyArrayChild("genres");
|
||||
if (genreClusterType)
|
||||
{
|
||||
albumNode.createEmptyArrayChild("genres");
|
||||
if (genreClusterType)
|
||||
{
|
||||
Cluster::FindParameters params;
|
||||
params.setRelease(release->getId());
|
||||
params.setClusterType(genreClusterType->getId());
|
||||
Cluster::FindParameters params;
|
||||
params.setRelease(release->getId());
|
||||
params.setClusterType(genreClusterType->getId());
|
||||
|
||||
for (const ClusterId clusterId : Cluster::find(dbSession, params).results)
|
||||
{
|
||||
Cluster::pointer cluster{ Cluster::find(dbSession, clusterId) };
|
||||
if (cluster)
|
||||
albumNode.addArrayChild("genres", createItemGenreNode(cluster));
|
||||
}
|
||||
}
|
||||
for (const auto& cluster : Cluster::find(dbSession, params).results)
|
||||
albumNode.addArrayChild("genres", createItemGenreNode(std::get<std::string>(cluster)));
|
||||
}
|
||||
|
||||
albumNode.createEmptyArrayChild("artists");
|
||||
|
||||
@@ -23,11 +23,11 @@
|
||||
|
||||
namespace API::Subsonic
|
||||
{
|
||||
Response::Node createItemGenreNode(const Database::Cluster::pointer& cluster)
|
||||
Response::Node createItemGenreNode(std::string_view name)
|
||||
{
|
||||
Response::Node genreNode;
|
||||
|
||||
genreNode.setAttribute("name", cluster->getName());
|
||||
genreNode.setAttribute("name", name);
|
||||
|
||||
return genreNode;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "services/database/Object.hpp"
|
||||
#include <string_view>
|
||||
#include "SubsonicResponse.hpp"
|
||||
|
||||
namespace Database
|
||||
@@ -29,5 +29,5 @@ namespace Database
|
||||
|
||||
namespace API::Subsonic
|
||||
{
|
||||
Response::Node createItemGenreNode(const Database::ObjectPtr<Database::Cluster>& cluster);
|
||||
Response::Node createItemGenreNode(std::string_view name);
|
||||
}
|
||||
|
||||
@@ -221,34 +221,23 @@ namespace API::Subsonic
|
||||
params.setTrack(track->getId());
|
||||
params.setClusterType(clusterType->getId());
|
||||
|
||||
for (const ClusterId clusterId : Cluster::find(dbSession, params).results)
|
||||
{
|
||||
Cluster::pointer cluster {Cluster::find(dbSession, clusterId)};
|
||||
if (cluster)
|
||||
trackResponse.addArrayValue(field, cluster->getName());
|
||||
}
|
||||
for (const auto& cluster : Cluster::find(dbSession, params).results)
|
||||
trackResponse.addArrayValue(field, std::get<std::string>(cluster));
|
||||
}
|
||||
} };
|
||||
|
||||
addClusters("moods", "MOOD");
|
||||
|
||||
// Genres
|
||||
trackResponse.createEmptyArrayChild("genres");
|
||||
if (genreClusterType)
|
||||
{
|
||||
trackResponse.createEmptyArrayChild("genres");
|
||||
Cluster::FindParameters params;
|
||||
params.setTrack(track->getId());
|
||||
params.setClusterType(genreClusterType->getId());
|
||||
|
||||
if (genreClusterType)
|
||||
{
|
||||
Cluster::FindParameters params;
|
||||
params.setTrack(track->getId());
|
||||
params.setClusterType(genreClusterType->getId());
|
||||
|
||||
for (const ClusterId clusterId : Cluster::find(dbSession, params).results)
|
||||
{
|
||||
Cluster::pointer cluster{ Cluster::find(dbSession, clusterId) };
|
||||
if (cluster)
|
||||
trackResponse.addArrayChild("genres", createItemGenreNode(cluster));
|
||||
}
|
||||
}
|
||||
for (const auto& cluster : Cluster::find(dbSession, params).results)
|
||||
trackResponse.addArrayChild("genres", createItemGenreNode(std::get<std::string>(cluster)));
|
||||
}
|
||||
|
||||
trackResponse.addChild("replayGain", createReplayGainNode(track));
|
||||
|
||||
Reference in New Issue
Block a user