From 7618639e12e4240c45e8b597a0bce7427fb7c694 Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 1 Oct 2023 16:12:31 +0200 Subject: [PATCH] extracted artist handling --- src/libs/subsonic/impl/SubsonicResource.cpp | 33 ++++----------------- src/libs/subsonic/impl/responses/Album.cpp | 2 +- src/libs/subsonic/impl/responses/Album.hpp | 1 + src/libs/subsonic/impl/responses/Artist.cpp | 29 +++++++++++++++++- src/libs/subsonic/impl/responses/Artist.hpp | 2 ++ 5 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/libs/subsonic/impl/SubsonicResource.cpp b/src/libs/subsonic/impl/SubsonicResource.cpp index 53967d0a..9c5ce89a 100644 --- a/src/libs/subsonic/impl/SubsonicResource.cpp +++ b/src/libs/subsonic/impl/SubsonicResource.cpp @@ -323,27 +323,6 @@ trackBookmarkToResponseNode(const TrackBookmark::pointer& trackBookmark) return trackBookmarkNode; } -static -Response::Node -artistToResponseNode(const Artist::pointer& artist, Session& session, const User::pointer& user, bool id3) -{ - Response::Node artistNode; - - artistNode.setAttribute("id", idToString(artist->getId())); - artistNode.setAttribute("name", artist->getName()); - - if (id3) - { - const auto releases {Release::find(session, Release::FindParameters {}.setArtist(artist->getId()))}; - artistNode.setAttribute("albumCount", releases.results.size()); - } - - if (Service::get()->isStarred(user->getId(), artist->getId())) - artistNode.setAttribute("starred", reportedStarredDate); - - return artistNode; -} - static Response::Node clusterToResponseNode(const Cluster::pointer& cluster) @@ -816,7 +795,7 @@ handleGetArtistRequest(RequestContext& context) throw UserNotAuthorizedError {}; Response response {Response::createOkResponse(context.serverProtocolVersion)}; - Response::Node artistNode {artistToResponseNode(artist, context.dbSession, user, true /* id3 */)}; + Response::Node artistNode {createArtistNode(artist, context.dbSession, user, true /* id3 */)}; const auto releases {Release::find(context.dbSession, Release::FindParameters {}.setArtist(artist->getId()))}; for (const ReleaseId releaseId : releases.results) @@ -868,7 +847,7 @@ handleGetArtistInfoRequestCommon(RequestContext& context, bool id3) { const Artist::pointer similarArtist {Artist::find(context.dbSession, similarArtistId)}; if (similarArtist) - artistInfoNode.addArrayChild("similarArtist", artistToResponseNode(similarArtist, context.dbSession, user, id3)); + artistInfoNode.addArrayChild("similarArtist", createArtistNode(similarArtist, context.dbSession, user, id3)); } } @@ -919,7 +898,7 @@ handleGetMusicDirectoryRequest(RequestContext& context) for (const ArtistId rootArtistId : rootArtistIds.results) { const Artist::pointer artist {Artist::find(context.dbSession, rootArtistId)}; - directoryNode.addArrayChild("child", artistToResponseNode(artist, context.dbSession, user, false /* no id3 */)); + directoryNode.addArrayChild("child", createArtistNode(artist, context.dbSession, user, false /* no id3 */)); } } else if (artistId) @@ -1029,7 +1008,7 @@ handleGetArtistsRequestCommon(RequestContext& context, bool id3) indexNode.setAttribute("name", std::string {sortChar}); for (const Artist::pointer& artist :artists) - indexNode.addArrayChild("artist", artistToResponseNode(artist, context.dbSession, user, id3)); + indexNode.addArrayChild("artist", createArtistNode(artist, context.dbSession, user, id3)); } return response; @@ -1212,7 +1191,7 @@ handleGetStarredRequestCommon(RequestContext& context, bool id3) for (const ArtistId artistId : scrobbling.getStarredArtists(context.userId, {} /* clusters */, std::nullopt /* linkType */, ArtistSortMethod::BySortName, Range {}).results) { if (auto artist {Artist::find(context.dbSession, artistId)}) - starredNode.addArrayChild("artist", artistToResponseNode(artist, context.dbSession, user, id3)); + starredNode.addArrayChild("artist", createArtistNode(artist, context.dbSession, user, id3)); } for (const ReleaseId releaseId : scrobbling.getStarredReleases(context.userId, {} /* clusters */, Range {}).results) @@ -1439,7 +1418,7 @@ handleSearchRequestCommon(RequestContext& context, bool id3) for (const ArtistId artistId : artistIds.results) { const auto artist {Artist::find(context.dbSession, artistId)}; - searchResult2Node.addArrayChild("artist", artistToResponseNode(artist, context.dbSession, user, id3)); + searchResult2Node.addArrayChild("artist", createArtistNode(artist, context.dbSession, user, id3)); } } diff --git a/src/libs/subsonic/impl/responses/Album.cpp b/src/libs/subsonic/impl/responses/Album.cpp index 76e00a42..57de6642 100644 --- a/src/libs/subsonic/impl/responses/Album.cpp +++ b/src/libs/subsonic/impl/responses/Album.cpp @@ -31,7 +31,7 @@ namespace API::Subsonic { - static const std::string_view reportedDummyStarredDate {"2000-01-01T00:00:00"}; + static const std::string_view reportedDummyStarredDate{ "2000-01-01T00:00:00" }; using namespace Database; diff --git a/src/libs/subsonic/impl/responses/Album.hpp b/src/libs/subsonic/impl/responses/Album.hpp index 8002333c..c05c1f35 100644 --- a/src/libs/subsonic/impl/responses/Album.hpp +++ b/src/libs/subsonic/impl/responses/Album.hpp @@ -26,6 +26,7 @@ namespace Database { class Release; class User; + class Session; } namespace API::Subsonic diff --git a/src/libs/subsonic/impl/responses/Artist.cpp b/src/libs/subsonic/impl/responses/Artist.cpp index 60f435b8..f4b8448a 100644 --- a/src/libs/subsonic/impl/responses/Artist.cpp +++ b/src/libs/subsonic/impl/responses/Artist.cpp @@ -19,11 +19,19 @@ #include "responses/Artist.hpp" #include "services/database/Artist.hpp" +#include "services/database/Release.hpp" +#include "services/database/User.hpp" +#include "services/scrobbling/IScrobblingService.hpp" +#include "utils/Service.hpp" + +#include "SubsonicId.hpp" namespace API::Subsonic { + static const std::string_view reportedDummyStarredDate{ "2000-01-01T00:00:00" }; + using namespace Database; - + namespace utils { std::string joinArtistNames(const std::vector& artists) @@ -43,4 +51,23 @@ namespace API::Subsonic return StringUtils::joinStrings(names, ", "); } } + + Response::Node createArtistNode(const Artist::pointer& artist, Session& session, const User::pointer& user, bool id3) + { + Response::Node artistNode; + + artistNode.setAttribute("id", idToString(artist->getId())); + artistNode.setAttribute("name", artist->getName()); + + if (id3) + { + const auto releases{ Release::find(session, Release::FindParameters {}.setArtist(artist->getId())) }; + artistNode.setAttribute("albumCount", releases.results.size()); + } + + if (Service::get()->isStarred(user->getId(), artist->getId())) + artistNode.setAttribute("starred", reportedDummyStarredDate); // TODO handle date/time + + return artistNode; + } } \ No newline at end of file diff --git a/src/libs/subsonic/impl/responses/Artist.hpp b/src/libs/subsonic/impl/responses/Artist.hpp index 014e9a04..dd0ad10a 100644 --- a/src/libs/subsonic/impl/responses/Artist.hpp +++ b/src/libs/subsonic/impl/responses/Artist.hpp @@ -28,6 +28,7 @@ namespace Database { class Artist; class User; + class session; } namespace API::Subsonic @@ -36,4 +37,5 @@ namespace API::Subsonic { std::string joinArtistNames(const std::vector>& artists); } + Response::Node createArtistNode(const Database::ObjectPtr& artist, Database::Session& session, const Database::ObjectPtr& user, bool id3); } \ No newline at end of file