From 0ca2d8b34ca7cd2e9412ca48d7587e0284877f61 Mon Sep 17 00:00:00 2001 From: emeric Date: Thu, 31 Oct 2024 15:50:17 +0100 Subject: [PATCH] Subsonci API: added getAlbmInfo support --- src/libs/subsonic/CMakeLists.txt | 1 + src/libs/subsonic/impl/SubsonicResource.cpp | 4 +- .../subsonic/impl/entrypoints/Browsing.cpp | 32 +++++++++++++ .../subsonic/impl/entrypoints/Browsing.hpp | 2 + .../subsonic/impl/responses/AlbumInfo.cpp | 47 +++++++++++++++++++ .../subsonic/impl/responses/AlbumInfo.hpp | 36 ++++++++++++++ 6 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 src/libs/subsonic/impl/responses/AlbumInfo.cpp create mode 100644 src/libs/subsonic/impl/responses/AlbumInfo.hpp diff --git a/src/libs/subsonic/CMakeLists.txt b/src/libs/subsonic/CMakeLists.txt index 7d9f81e6..fdc51c3b 100644 --- a/src/libs/subsonic/CMakeLists.txt +++ b/src/libs/subsonic/CMakeLists.txt @@ -11,6 +11,7 @@ add_library(lmssubsonic SHARED impl/entrypoints/System.cpp impl/entrypoints/UserManagement.cpp impl/responses/Album.cpp + impl/responses/AlbumInfo.cpp impl/responses/Artist.cpp impl/responses/Bookmark.cpp impl/responses/Contributor.cpp diff --git a/src/libs/subsonic/impl/SubsonicResource.cpp b/src/libs/subsonic/impl/SubsonicResource.cpp index bf034115..5e2d10cc 100644 --- a/src/libs/subsonic/impl/SubsonicResource.cpp +++ b/src/libs/subsonic/impl/SubsonicResource.cpp @@ -170,8 +170,8 @@ namespace lms::api::subsonic { "/getVideos", { handleNotImplemented } }, { "/getArtistInfo", { handleNotImplemented } }, { "/getArtistInfo2", { handleGetArtistInfo2Request } }, - { "/getAlbumInfo", { handleNotImplemented } }, - { "/getAlbumInfo2", { handleNotImplemented } }, + { "/getAlbumInfo", { handleGetAlbumInfo } }, + { "/getAlbumInfo2", { handleGetAlbumInfo2 } }, { "/getSimilarSongs", { handleGetSimilarSongsRequest } }, { "/getSimilarSongs2", { handleGetSimilarSongs2Request } }, { "/getTopSongs", { handleGetTopSongs } }, diff --git a/src/libs/subsonic/impl/entrypoints/Browsing.cpp b/src/libs/subsonic/impl/entrypoints/Browsing.cpp index 135f5765..4607c712 100644 --- a/src/libs/subsonic/impl/entrypoints/Browsing.cpp +++ b/src/libs/subsonic/impl/entrypoints/Browsing.cpp @@ -38,6 +38,7 @@ #include "SubsonicId.hpp" #include "Utils.hpp" #include "responses/Album.hpp" +#include "responses/AlbumInfo.hpp" #include "responses/Artist.hpp" #include "responses/Genre.hpp" #include "responses/Song.hpp" @@ -560,6 +561,37 @@ namespace lms::api::subsonic return response; } + Response handleGetAlbumInfo(RequestContext& context) + { + const db::DirectoryId directoryId{ getMandatoryParameterAs(context.parameters, "id") }; + + Response response{ Response::createOkResponse(context.serverProtocolVersion) }; + + { + auto transaction{ context.dbSession.createReadTransaction() }; + + if (db::Release::pointer release{ getReleaseFromDirectory(context.dbSession, directoryId) }) + response.addNode("albumInfo", createAlbumInfoNode(context, release)); + } + return response; + } + + Response handleGetAlbumInfo2(RequestContext& context) + { + const db::ReleaseId releaseId{ getMandatoryParameterAs(context.parameters, "id") }; + + Response response{ Response::createOkResponse(context.serverProtocolVersion) }; + + { + auto transaction{ context.dbSession.createReadTransaction() }; + + if (db::Release::pointer release{ db::Release::find(context.dbSession, releaseId) }) + response.addNode("albumInfo", createAlbumInfoNode(context, release)); + } + + return response; + } + Response handleGetSimilarSongsRequest(RequestContext& context) { return handleGetSimilarSongsRequestCommon(context, false /* no id3 */); diff --git a/src/libs/subsonic/impl/entrypoints/Browsing.hpp b/src/libs/subsonic/impl/entrypoints/Browsing.hpp index 48a0f09b..f0db9e58 100644 --- a/src/libs/subsonic/impl/entrypoints/Browsing.hpp +++ b/src/libs/subsonic/impl/entrypoints/Browsing.hpp @@ -34,6 +34,8 @@ namespace lms::api::subsonic Response handleGetSongRequest(RequestContext& context); Response handleGetArtistInfoRequest(RequestContext& context); Response handleGetArtistInfo2Request(RequestContext& context); + Response handleGetAlbumInfo(RequestContext& context); + Response handleGetAlbumInfo2(RequestContext& context); Response handleGetSimilarSongsRequest(RequestContext& context); Response handleGetSimilarSongs2Request(RequestContext& context); Response handleGetTopSongs(RequestContext& context); diff --git a/src/libs/subsonic/impl/responses/AlbumInfo.cpp b/src/libs/subsonic/impl/responses/AlbumInfo.cpp new file mode 100644 index 00000000..4d3a4e5a --- /dev/null +++ b/src/libs/subsonic/impl/responses/AlbumInfo.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2024 Emeric Poupon + * + * This file is part of LMS. + * + * LMS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LMS. If not, see . + */ + +#include "AlbumInfo.hpp" + +#include "database/Release.hpp" + +#include "RequestContext.hpp" + +namespace lms::api::subsonic +{ + Response::Node createAlbumInfoNode(RequestContext& context, const db::ObjectPtr& release) + { + Response::Node albumInfo; + + if (const auto releaseMBID{ release->getMBID() }) + { + switch (context.responseFormat) + { + case ResponseFormat::json: + albumInfo.setAttribute("musicBrainzId", releaseMBID->getAsString()); + break; + case ResponseFormat::xml: + albumInfo.createChild("musicBrainzId").setValue(releaseMBID->getAsString()); + break; + } + } + + return albumInfo; + } +} // namespace lms::api::subsonic \ No newline at end of file diff --git a/src/libs/subsonic/impl/responses/AlbumInfo.hpp b/src/libs/subsonic/impl/responses/AlbumInfo.hpp new file mode 100644 index 00000000..fac1c759 --- /dev/null +++ b/src/libs/subsonic/impl/responses/AlbumInfo.hpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2024 Emeric Poupon + * + * This file is part of LMS. + * + * LMS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LMS. If not, see . + */ + +#pragma once + +#include "database/Object.hpp" + +#include "SubsonicResponse.hpp" + +namespace lms::db +{ + class Release; +} // namespace lms::db + +namespace lms::api::subsonic +{ + struct RequestContext; + + Response::Node createAlbumInfoNode(RequestContext& context, const db::ObjectPtr& release); +} // namespace lms::api::subsonic \ No newline at end of file