diff --git a/conf/lms.conf b/conf/lms.conf index 5544c62f..db539ab3 100644 --- a/conf/lms.conf +++ b/conf/lms.conf @@ -90,10 +90,6 @@ api-subsonic-support-password-auth = true; # Enable or disable token/salt authentication (params 'u', 's' and 't') api-subsonic-support-token-auth = true; -# Use this list to make the reported server version to 1.12.0 depending on the client's name -# Main usage is to make auto detections for the 'p' (password) parameter work -api-subsonic-old-server-protocol-clients = ("DSub"); - # List of clients for whom open subsonic extensions and extra fields are disabled api-open-subsonic-disabled-clients = ("DSub"); diff --git a/src/libs/subsonic/bench/SubsonicBench.cpp b/src/libs/subsonic/bench/SubsonicBench.cpp index eee953fd..93eaa8b5 100644 --- a/src/libs/subsonic/bench/SubsonicBench.cpp +++ b/src/libs/subsonic/bench/SubsonicBench.cpp @@ -29,7 +29,7 @@ namespace lms::api::subsonic::benchs { Response generateFakeResponse() { - Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; + Response response{ Response::createOkResponse() }; Response::Node& node{ response.createNode("MyNode") }; node.setAttribute("Attr1", "value1"); diff --git a/src/libs/subsonic/impl/AuthUtils.hpp b/src/libs/subsonic/impl/AuthUtils.hpp index f363589d..5b76bb17 100644 --- a/src/libs/subsonic/impl/AuthUtils.hpp +++ b/src/libs/subsonic/impl/AuthUtils.hpp @@ -68,4 +68,4 @@ namespace lms::api::subsonic::utils // Throws on error db::UserId authenticateUser(const Wt::Http::Request& request, db::Session& session, const SubsonicResourceConfig& config); -} // namespace lms::api::subsonic +} // namespace lms::api::subsonic::utils diff --git a/src/libs/subsonic/impl/ProtocolVersion.hpp b/src/libs/subsonic/impl/ProtocolVersion.hpp index 67f4f378..8ac7d99a 100644 --- a/src/libs/subsonic/impl/ProtocolVersion.hpp +++ b/src/libs/subsonic/impl/ProtocolVersion.hpp @@ -33,7 +33,7 @@ namespace lms::api::subsonic unsigned patch{}; }; - static inline constexpr ProtocolVersion defaultServerProtocolVersion{ 1, 16, 1 }; + static inline constexpr ProtocolVersion serverProtocolVersion{ 1, 16, 1 }; } // namespace lms::api::subsonic namespace lms::core::stringUtils diff --git a/src/libs/subsonic/impl/RequestContext.cpp b/src/libs/subsonic/impl/RequestContext.cpp index 755aac4b..723a86b4 100644 --- a/src/libs/subsonic/impl/RequestContext.cpp +++ b/src/libs/subsonic/impl/RequestContext.cpp @@ -50,10 +50,9 @@ namespace lms::api::subsonic , _clientName{ getMandatoryParameterAs(_request.getParameterMap(), "c") } , _clientProtocolVersion{ getMandatoryParameterAs(_request.getParameterMap(), "v") } , _responseFormat{ getParameterAs(request.getParameterMap(), "f").value_or("xml") == "json" ? ResponseFormat::json : ResponseFormat::xml } - , _serverProtocolVersion{ _config.serverProtocolVersionsByClient.contains(_clientName) ? _config.serverProtocolVersionsByClient.at(_clientName) : defaultServerProtocolVersion } , _isOpenSubsonicEnabled{ !_config.openSubsonicDisabledClients.contains(_clientName) } { - checkProtocolVersion(_clientProtocolVersion, _serverProtocolVersion); + checkProtocolVersion(_clientProtocolVersion, serverProtocolVersion); } RequestContext::~RequestContext() = default; @@ -93,11 +92,6 @@ namespace lms::api::subsonic return _clientName; } - ProtocolVersion RequestContext::getServerProtocolVersion() const - { - return _serverProtocolVersion; - } - ResponseFormat RequestContext::getResponseFormat() const { return _responseFormat; diff --git a/src/libs/subsonic/impl/RequestContext.hpp b/src/libs/subsonic/impl/RequestContext.hpp index fe4c496c..233f56a8 100644 --- a/src/libs/subsonic/impl/RequestContext.hpp +++ b/src/libs/subsonic/impl/RequestContext.hpp @@ -60,7 +60,6 @@ namespace lms::api::subsonic std::string getClientIpAddr() const; std::string_view getClientName() const; - ProtocolVersion getServerProtocolVersion() const; ResponseFormat getResponseFormat() const; bool isOpenSubsonicEnabled() const; @@ -74,7 +73,6 @@ namespace lms::api::subsonic const ProtocolVersion _clientProtocolVersion; const ResponseFormat _responseFormat; - const ProtocolVersion _serverProtocolVersion; const bool _isOpenSubsonicEnabled; }; } // namespace lms::api::subsonic diff --git a/src/libs/subsonic/impl/SubsonicResource.cpp b/src/libs/subsonic/impl/SubsonicResource.cpp index 169d62bf..28ff3117 100644 --- a/src/libs/subsonic/impl/SubsonicResource.cpp +++ b/src/libs/subsonic/impl/SubsonicResource.cpp @@ -373,7 +373,7 @@ namespace lms::api::subsonic } catch (const Error& e) { - writeResponse(Response::createFailedResponse(defaultServerProtocolVersion, e), ResponseFormat::xml); + writeResponse(Response::createFailedResponse(e), ResponseFormat::xml); throw; } @@ -407,7 +407,7 @@ namespace lms::api::subsonic } catch (const Error& e) { - Response resp{ Response::createFailedResponse(requestContext->getServerProtocolVersion(), e) }; + Response resp{ Response::createFailedResponse(e) }; writeResponse(resp, requestContext->getResponseFormat()); throw; } diff --git a/src/libs/subsonic/impl/SubsonicResourceConfig.cpp b/src/libs/subsonic/impl/SubsonicResourceConfig.cpp index 85e7a88a..576f41df 100644 --- a/src/libs/subsonic/impl/SubsonicResourceConfig.cpp +++ b/src/libs/subsonic/impl/SubsonicResourceConfig.cpp @@ -25,19 +25,6 @@ namespace lms::api::subsonic { namespace { - std::unordered_map readConfigProtocolVersions(core::IConfig& config) - { - std::unordered_map res; - - config.visitStrings("api-subsonic-old-server-protocol-clients", - [&](std::string_view client) { - res.emplace(std::string{ client }, ProtocolVersion{ .major = 1, .minor = 12, .patch = 0 }); - }, - { "DSub" }); - - return res; - } - std::unordered_set readOpenSubsonicDisabledClients(core::IConfig& config) { std::unordered_set res; @@ -55,7 +42,6 @@ namespace lms::api::subsonic SubsonicResourceConfig readSubsonicResourceConfig(core::IConfig& config) { return SubsonicResourceConfig{ - .serverProtocolVersionsByClient = readConfigProtocolVersions(config), .openSubsonicDisabledClients = readOpenSubsonicDisabledClients(config), .supportPasswordAuthentication = config.getBool("api-subsonic-support-password-auth", true), .supportTokenAuthentication = config.getBool("api-subsonic-support-token-auth", true) diff --git a/src/libs/subsonic/impl/SubsonicResourceConfig.hpp b/src/libs/subsonic/impl/SubsonicResourceConfig.hpp index da3401ca..2c456ebf 100644 --- a/src/libs/subsonic/impl/SubsonicResourceConfig.hpp +++ b/src/libs/subsonic/impl/SubsonicResourceConfig.hpp @@ -20,11 +20,8 @@ #pragma once #include -#include #include -#include "ProtocolVersion.hpp" - namespace lms::core { class IConfig; @@ -34,7 +31,6 @@ namespace lms::api::subsonic { struct SubsonicResourceConfig { - std::unordered_map serverProtocolVersionsByClient; std::unordered_set openSubsonicDisabledClients; bool supportPasswordAuthentication; bool supportTokenAuthentication; diff --git a/src/libs/subsonic/impl/SubsonicResponse.cpp b/src/libs/subsonic/impl/SubsonicResponse.cpp index cd05c007..f0c96c1f 100644 --- a/src/libs/subsonic/impl/SubsonicResponse.cpp +++ b/src/libs/subsonic/impl/SubsonicResponse.cpp @@ -302,23 +302,23 @@ namespace lms::api::subsonic os << '\"'; } - Response Response::createOkResponse(ProtocolVersion protocolVersion) + Response Response::createOkResponse() { - return createResponseCommon(protocolVersion); + return createResponseCommon(); } - Response Response::createFailedResponse(ProtocolVersion protocolVersion, const Error& error) + Response Response::createFailedResponse(const Error& error) { - return createResponseCommon(protocolVersion, &error); + return createResponseCommon(&error); } - Response Response::createResponseCommon(ProtocolVersion protocolVersion, const Error* error) + Response Response::createResponseCommon(const Error* error) { Response response; Node& responseNode{ response._root.createChild("subsonic-response") }; responseNode.setAttribute("status", error ? "failed" : "ok"); - responseNode.setVersionAttribute(protocolVersion); + responseNode.setVersionAttribute(serverProtocolVersion); if (error) { diff --git a/src/libs/subsonic/impl/SubsonicResponse.hpp b/src/libs/subsonic/impl/SubsonicResponse.hpp index 94d76898..070db870 100644 --- a/src/libs/subsonic/impl/SubsonicResponse.hpp +++ b/src/libs/subsonic/impl/SubsonicResponse.hpp @@ -312,8 +312,8 @@ namespace lms::api::subsonic map _childrenValues; }; - static Response createOkResponse(ProtocolVersion protocolVersion); - static Response createFailedResponse(ProtocolVersion protocolVersion, const Error& error); + static Response createOkResponse(); + static Response createFailedResponse(const Error& error); ~Response() = default; Response(const Response&) = delete; @@ -328,7 +328,7 @@ namespace lms::api::subsonic void write(std::ostream& os, ResponseFormat format) const; private: - static Response createResponseCommon(ProtocolVersion protocolVersion, const Error* error = nullptr); + static Response createResponseCommon(const Error* error = nullptr); class JsonSerializer { diff --git a/src/libs/subsonic/impl/endpoints/AlbumSongLists.cpp b/src/libs/subsonic/impl/endpoints/AlbumSongLists.cpp index 8ea5fac4..c814511d 100644 --- a/src/libs/subsonic/impl/endpoints/AlbumSongLists.cpp +++ b/src/libs/subsonic/impl/endpoints/AlbumSongLists.cpp @@ -163,7 +163,7 @@ namespace lms::api::subsonic throw NotImplementedGenericError{}; } - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& albumListNode{ response.createNode(id3 ? Response::Node::Key{ "albumList2" } : Response::Node::Key{ "albumList" }) }; for (const ReleaseId releaseId : releases) @@ -182,7 +182,7 @@ namespace lms::api::subsonic auto transaction{ context.getDbSession().createReadTransaction() }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& starredNode{ response.createNode(id3 ? Response::Node::Key{ "starred2" } : Response::Node::Key{ "starred" }) }; feedback::IFeedbackService& feedbackService{ *core::Service::get() }; @@ -238,7 +238,7 @@ namespace lms::api::subsonic if (size > defaultMaxCountSize) throw ParameterValueTooHighGenericError{ "size", defaultMaxCountSize }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& randomSongsNode{ response.createNode("randomSongs") }; auto transaction{ context.getDbSession().createReadTransaction() }; @@ -274,7 +274,7 @@ namespace lms::api::subsonic if (!genreObj) throw RequestedDataNotFoundError{}; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& songsByGenreNode{ response.createNode("songsByGenre") }; Track::FindParameters params; @@ -291,7 +291,7 @@ namespace lms::api::subsonic Response handleGetNowPlayingRequest(RequestContext& context) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& nowPlayingNode{ response.createNode("nowPlaying") }; scrobbling::IScrobblingService& scrobblingService{ *core::Service::get() }; diff --git a/src/libs/subsonic/impl/endpoints/Bookmarks.cpp b/src/libs/subsonic/impl/endpoints/Bookmarks.cpp index 7da14301..82c50465 100644 --- a/src/libs/subsonic/impl/endpoints/Bookmarks.cpp +++ b/src/libs/subsonic/impl/endpoints/Bookmarks.cpp @@ -38,7 +38,7 @@ namespace lms::api::subsonic const auto bookmarkIds{ db::TrackBookmark::find(context.getDbSession(), context.getUser()->getId()) }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& bookmarksNode{ response.createNode("bookmarks") }; for (const db::TrackBookmarkId bookmarkId : bookmarkIds) @@ -74,7 +74,7 @@ namespace lms::api::subsonic if (comment) bookmark.modify()->setComment(*comment); - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleDeleteBookmark(RequestContext& context) @@ -90,7 +90,7 @@ namespace lms::api::subsonic bookmark.remove(); - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } static db::PlayQueue::pointer getOrCreatePlayQueue(RequestContext& context) @@ -122,7 +122,7 @@ namespace lms::api::subsonic // PlayQueue makes use of a dedicated internal playlist static Response handleGetPlayQueueCommon(RequestContext& context, bool byIndex) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; const db::PlayQueue::pointer playQueue{ getOrCreatePlayQueue(context) }; assert(playQueue); @@ -204,7 +204,7 @@ namespace lms::api::subsonic playQueue.modify()->setLastModifiedDateTime(Wt::WDateTime::currentDateTime()); } - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleSavePlayQueue(RequestContext& context) diff --git a/src/libs/subsonic/impl/endpoints/Browsing.cpp b/src/libs/subsonic/impl/endpoints/Browsing.cpp index 0c3eb52a..504f362a 100644 --- a/src/libs/subsonic/impl/endpoints/Browsing.cpp +++ b/src/libs/subsonic/impl/endpoints/Browsing.cpp @@ -214,7 +214,7 @@ namespace lms::api::subsonic auto transaction{ context.getDbSession().createReadTransaction() }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& similarSongsNode{ response.createNode(id3 ? Response::Node::Key{ "similarSongs2" } : Response::Node::Key{ "similarSongs" }) }; for (const TrackId trackId : tracks) { @@ -244,7 +244,7 @@ namespace lms::api::subsonic Response handleGetMusicFoldersRequest(RequestContext& context) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& musicFoldersNode{ response.createNode("musicFolders") }; auto transaction{ context.getDbSession().createReadTransaction() }; @@ -263,7 +263,7 @@ namespace lms::api::subsonic // Optional params const MediaLibraryId mediaLibrary{ getParameterAs(context.getParameters(), "musicFolderId").value_or(MediaLibraryId{}) }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& indexesNode{ response.createNode("indexes") }; indexesNode.setAttribute("ignoredArticles", ""); indexesNode.setAttribute("lastModified", reportedDummyDateULong); // TODO report last file write? @@ -310,7 +310,7 @@ namespace lms::api::subsonic // Mandatory params const auto directoryId{ getMandatoryParameterAs(context.getParameters(), "id") }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& directoryNode{ response.createNode("directory") }; auto transaction{ context.getDbSession().createReadTransaction() }; @@ -374,7 +374,7 @@ namespace lms::api::subsonic Response handleGetGenresRequest(RequestContext& context) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& genresNode{ response.createNode("genres") }; @@ -392,7 +392,7 @@ namespace lms::api::subsonic // Optional params const MediaLibraryId mediaLibrary{ getParameterAs(context.getParameters(), "musicFolderId").value_or(MediaLibraryId{}) }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& artistsNode{ response.createNode("artists") }; artistsNode.setAttribute("ignoredArticles", ""); @@ -473,7 +473,7 @@ namespace lms::api::subsonic if (!artist) throw RequestedDataNotFoundError{}; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node artistNode{ createArtistNode(context, artist) }; auto addRelease{ [&](const Release::pointer& release) { @@ -505,7 +505,7 @@ namespace lms::api::subsonic if (!release) throw RequestedDataNotFoundError{}; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node albumNode{ createAlbumNode(context, release, true /* id3 */) }; const auto tracks{ Track::find(context.getDbSession(), Track::FindParameters{}.setRelease(id).setSortMethod(TrackSortMethod::Release)) }; @@ -528,7 +528,7 @@ namespace lms::api::subsonic if (!track) throw RequestedDataNotFoundError{}; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("song", createSongNode(context, track, context.getUser())); return response; @@ -542,7 +542,7 @@ namespace lms::api::subsonic // Optional params std::size_t count{ getParameterAs(context.getParameters(), "count").value_or(20) }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& artistInfoNode{ response.createNode(Response::Node::Key{ "artistInfo2" }) }; { @@ -601,7 +601,7 @@ namespace lms::api::subsonic { const db::DirectoryId directoryId{ getMandatoryParameterAs(context.getParameters(), "id") }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; { auto transaction{ context.getDbSession().createReadTransaction() }; @@ -616,7 +616,7 @@ namespace lms::api::subsonic { const db::ReleaseId releaseId{ getMandatoryParameterAs(context.getParameters(), "id") }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; { auto transaction{ context.getDbSession().createReadTransaction() }; @@ -648,7 +648,7 @@ namespace lms::api::subsonic auto transaction{ context.getDbSession().createReadTransaction() }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& topSongs{ response.createNode("topSongs") }; const auto artists{ Artist::find(context.getDbSession(), artistName) }; @@ -684,7 +684,7 @@ namespace lms::api::subsonic auto transaction{ context.getDbSession().createReadTransaction() }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; for (const auto& similarTrack : similarTracks) { @@ -715,7 +715,7 @@ namespace lms::api::subsonic auto transaction{ context.getDbSession().createReadTransaction() }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; for (const auto& pathTrack : pathTracks) { diff --git a/src/libs/subsonic/impl/endpoints/Jukebox.cpp b/src/libs/subsonic/impl/endpoints/Jukebox.cpp index 410de2cc..582abee6 100644 --- a/src/libs/subsonic/impl/endpoints/Jukebox.cpp +++ b/src/libs/subsonic/impl/endpoints/Jukebox.cpp @@ -71,7 +71,7 @@ namespace lms::api::subsonic Response handleJukeboxGet(RequestContext& context, jukebox::IJukeboxService& jukeboxService) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node jukeboxPlaylistNode{ createJukeboxStatusNode(jukeboxService) }; { @@ -88,9 +88,9 @@ namespace lms::api::subsonic return response; } - Response handleJukeboxStatus(RequestContext& context, jukebox::IJukeboxService& jukeboxService) + Response handleJukeboxStatus(RequestContext& /*context*/, jukebox::IJukeboxService& jukeboxService) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } @@ -103,25 +103,25 @@ namespace lms::api::subsonic jukeboxService.clearTracks(); jukeboxService.appendTracks(trackIds); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } - Response handleJukeboxStart(RequestContext& context, jukebox::IJukeboxService& jukeboxService) + Response handleJukeboxStart(RequestContext& /*context*/, jukebox::IJukeboxService& jukeboxService) { jukeboxService.resume(); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } - Response handleJukeboxStop(RequestContext& context, jukebox::IJukeboxService& jukeboxService) + Response handleJukeboxStop(RequestContext& /*context*/, jukebox::IJukeboxService& jukeboxService) { jukeboxService.pause(); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } @@ -134,7 +134,7 @@ namespace lms::api::subsonic // do not report potential range error jukeboxService.play(index, std::chrono::seconds{ offset }); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } @@ -145,16 +145,16 @@ namespace lms::api::subsonic jukeboxService.appendTracks(trackIds); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } - Response handleJukeboxClear(RequestContext& context, jukebox::IJukeboxService& jukeboxService) + Response handleJukeboxClear(RequestContext& /*context*/, jukebox::IJukeboxService& jukeboxService) { jukeboxService.clearTracks(); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } @@ -164,16 +164,16 @@ namespace lms::api::subsonic const auto index{ getMandatoryParameterAs(context.getParameters(), "index") }; jukeboxService.removeTrack(index); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } - Response handleJukeboxShuffle(RequestContext& context, jukebox::IJukeboxService& jukeboxService) + Response handleJukeboxShuffle(RequestContext& /*context*/, jukebox::IJukeboxService& jukeboxService) { jukeboxService.shuffleTracks(); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } @@ -186,7 +186,7 @@ namespace lms::api::subsonic jukeboxService.setVolume(gain); // consider gain is linear - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); return response; } diff --git a/src/libs/subsonic/impl/endpoints/MediaAnnotation.cpp b/src/libs/subsonic/impl/endpoints/MediaAnnotation.cpp index 6df094dc..35cb6431 100644 --- a/src/libs/subsonic/impl/endpoints/MediaAnnotation.cpp +++ b/src/libs/subsonic/impl/endpoints/MediaAnnotation.cpp @@ -130,7 +130,7 @@ namespace lms::api::subsonic for (const TrackId id : params.trackIds) core::Service::get()->star(context.getUser()->getId(), id); - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleUnstarRequest(RequestContext& context) @@ -152,7 +152,7 @@ namespace lms::api::subsonic for (const TrackId id : params.trackIds) core::Service::get()->unstar(context.getUser()->getId(), id); - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleSetRating(RequestContext& context) @@ -171,7 +171,7 @@ namespace lms::api::subsonic else if (const TrackId * trackId{ std::get_if(¶ms.id) }) core::Service::get()->setRating(context.getUser()->getId(), *trackId, params.rating); - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleScrobble(RequestContext& context) @@ -209,6 +209,6 @@ namespace lms::api::subsonic } } - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } } // namespace lms::api::subsonic \ No newline at end of file diff --git a/src/libs/subsonic/impl/endpoints/MediaLibraryScanning.cpp b/src/libs/subsonic/impl/endpoints/MediaLibraryScanning.cpp index 2c09c161..25d5dfaf 100644 --- a/src/libs/subsonic/impl/endpoints/MediaLibraryScanning.cpp +++ b/src/libs/subsonic/impl/endpoints/MediaLibraryScanning.cpp @@ -49,19 +49,19 @@ namespace lms::api::subsonic::Scan } } // namespace - Response handleGetScanStatus(RequestContext& context) + Response handleGetScanStatus(RequestContext& /*context*/) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("scanStatus", createStatusResponseNode()); return response; } - Response handleStartScan(RequestContext& context) + Response handleStartScan(RequestContext& /*context*/) { core::Service::get()->requestImmediateScan(); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("scanStatus", createStatusResponseNode()); return response; diff --git a/src/libs/subsonic/impl/endpoints/MediaRetrieval.cpp b/src/libs/subsonic/impl/endpoints/MediaRetrieval.cpp index 16458388..e6a0bb1d 100644 --- a/src/libs/subsonic/impl/endpoints/MediaRetrieval.cpp +++ b/src/libs/subsonic/impl/endpoints/MediaRetrieval.cpp @@ -236,7 +236,7 @@ namespace lms::api::subsonic std::string artistName{ getParameterAs(context.getParameters(), "artist").value_or("") }; std::string titleName{ getParameterAs(context.getParameters(), "title").value_or("") }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; // best effort search, as this API is really limited auto transaction{ context.getDbSession().createReadTransaction() }; @@ -269,7 +269,7 @@ namespace lms::api::subsonic // mandatory params db::TrackId id{ getMandatoryParameterAs(context.getParameters(), "id") }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& lyricsList{ response.createNode("lyricsList") }; lyricsList.createEmptyArrayChild("structuredLyrics"); diff --git a/src/libs/subsonic/impl/endpoints/Playlists.cpp b/src/libs/subsonic/impl/endpoints/Playlists.cpp index a9b606c3..3973a562 100644 --- a/src/libs/subsonic/impl/endpoints/Playlists.cpp +++ b/src/libs/subsonic/impl/endpoints/Playlists.cpp @@ -55,7 +55,7 @@ namespace lms::api::subsonic { auto transaction{ context.getDbSession().createReadTransaction() }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& playlistsNode{ response.createNode("playlists") }; auto addTrackList{ [&](const db::TrackList::pointer& trackList) { @@ -103,7 +103,7 @@ namespace lms::api::subsonic if (trackList->getUserId() != context.getUser()->getId() && trackList->getVisibility() != TrackList::Visibility::Public) throw RequestedDataNotFoundError{}; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node playlistNode{ createPlaylistNode(context, trackList) }; auto entries{ trackList->getEntries() }; @@ -156,7 +156,7 @@ namespace lms::api::subsonic context.getDbSession().create(track, trackList); } - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node playlistNode{ createPlaylistNode(context, trackList) }; auto entries{ trackList->getEntries() }; @@ -213,7 +213,7 @@ namespace lms::api::subsonic context.getDbSession().create(track, trackList); } - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleDeletePlaylistRequest(RequestContext& context) @@ -227,6 +227,6 @@ namespace lms::api::subsonic trackList.remove(); - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } } // namespace lms::api::subsonic \ No newline at end of file diff --git a/src/libs/subsonic/impl/endpoints/Podcast.cpp b/src/libs/subsonic/impl/endpoints/Podcast.cpp index 389462c1..13ebd833 100644 --- a/src/libs/subsonic/impl/endpoints/Podcast.cpp +++ b/src/libs/subsonic/impl/endpoints/Podcast.cpp @@ -37,7 +37,7 @@ namespace lms::api::subsonic const bool includeEpisodes{ getParameterAs(context.getParameters(), "includeEpisodes").value_or(true) }; const std::optional podcastId{ getParameterAs(context.getParameters(), "id") }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& podcastsNode{ response.createNode("podcasts") }; podcastsNode.createEmptyArrayChild("channel"); @@ -66,7 +66,7 @@ namespace lms::api::subsonic std::size_t count{ getParameterAs(context.getParameters(), "count").value_or(20) }; count = std::min(count, 100); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& newestPodcastsNode{ response.createNode("newestPodcasts") }; newestPodcastsNode.createEmptyArrayChild("episode"); @@ -84,11 +84,11 @@ namespace lms::api::subsonic return response; } - Response handleRefreshPodcasts(RequestContext& context) + Response handleRefreshPodcasts(RequestContext& /*context*/) { core::Service::get()->refreshPodcasts(); - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleCreatePodcastChannel(RequestContext& context) @@ -102,7 +102,7 @@ namespace lms::api::subsonic // no effect if podcast already exists core::Service::get()->addPodcast(url); - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleDeletePodcastChannel(RequestContext& context) @@ -113,7 +113,7 @@ namespace lms::api::subsonic if (!core::Service::get()->removePodcast(podcastId)) throw RequestedDataNotFoundError{}; - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleDeletePodcastEpisode(RequestContext& context) @@ -124,7 +124,7 @@ namespace lms::api::subsonic if (!core::Service::get()->deletePodcastEpisode(episodeId)) throw RequestedDataNotFoundError{}; - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleDownloadPodcastEpisode(RequestContext& context) @@ -135,7 +135,7 @@ namespace lms::api::subsonic if (!core::Service::get()->downloadPodcastEpisode(episodeId)) throw RequestedDataNotFoundError{}; - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } Response handleGetPodcastEpisode(RequestContext& context) @@ -143,7 +143,7 @@ namespace lms::api::subsonic // Mandatory parameters const db::PodcastEpisodeId episodeId{ getMandatoryParameterAs(context.getParameters(), "id") }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; auto transaction{ context.getDbSession().createReadTransaction() }; diff --git a/src/libs/subsonic/impl/endpoints/Searching.cpp b/src/libs/subsonic/impl/endpoints/Searching.cpp index e6ab740c..3f178d9e 100644 --- a/src/libs/subsonic/impl/endpoints/Searching.cpp +++ b/src/libs/subsonic/impl/endpoints/Searching.cpp @@ -373,7 +373,7 @@ namespace lms::api::subsonic if (!query.empty()) keywords = core::stringUtils::splitString(query, ' '); - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& searchResultNode{ response.createNode(id3 ? "searchResult3" : "searchResult2") }; auto transaction{ context.getDbSession().createReadTransaction() }; diff --git a/src/libs/subsonic/impl/endpoints/System.cpp b/src/libs/subsonic/impl/endpoints/System.cpp index 5263dc17..32ff7b3e 100644 --- a/src/libs/subsonic/impl/endpoints/System.cpp +++ b/src/libs/subsonic/impl/endpoints/System.cpp @@ -26,14 +26,14 @@ namespace lms::api::subsonic { - Response handlePingRequest(RequestContext& context) + Response handlePingRequest(RequestContext& /*context*/) { - return Response::createOkResponse(context.getServerProtocolVersion()); + return Response::createOkResponse(); } - Response handleGetLicenseRequest(RequestContext& context) + Response handleGetLicenseRequest(RequestContext& /*context*/) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& licenseNode{ response.createNode("license") }; licenseNode.setAttribute("licenseExpires", "2035-09-03T14:46:43"); @@ -45,7 +45,7 @@ namespace lms::api::subsonic Response handleTokenInfoRequest(RequestContext& context) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& tokenInfoNode{ response.createNode("tokenInfo") }; auto transaction{ context.getDbSession().createReadTransaction() }; @@ -54,9 +54,9 @@ namespace lms::api::subsonic return response; } - Response handleGetOpenSubsonicExtensions(RequestContext& context) + Response handleGetOpenSubsonicExtensions(RequestContext& /*context*/) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; struct Extension { diff --git a/src/libs/subsonic/impl/endpoints/Transcoding.cpp b/src/libs/subsonic/impl/endpoints/Transcoding.cpp index 2ef4bc08..f8cc0014 100644 --- a/src/libs/subsonic/impl/endpoints/Transcoding.cpp +++ b/src/libs/subsonic/impl/endpoints/Transcoding.cpp @@ -84,7 +84,7 @@ namespace lms::api::subsonic const ClientInfo clientInfo{ parseClientInfoFromJson(context.getBody()) }; const AudioFileInfo audioFileInfo{ getAudioFileInfo(context.getDbSession(), audioFileId) }; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& transcodeNode{ response.createNode("transcodeDecision") }; { diff --git a/src/libs/subsonic/impl/endpoints/UserManagement.cpp b/src/libs/subsonic/impl/endpoints/UserManagement.cpp index 02b32e75..3812422d 100644 --- a/src/libs/subsonic/impl/endpoints/UserManagement.cpp +++ b/src/libs/subsonic/impl/endpoints/UserManagement.cpp @@ -50,7 +50,7 @@ namespace lms::api::subsonic if (!user) throw RequestedDataNotFoundError{}; - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; response.addNode("user", createUserNode(context, user)); return response; @@ -58,7 +58,7 @@ namespace lms::api::subsonic Response handleGetUsersRequest(RequestContext& context) { - Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; + Response response{ Response::createOkResponse() }; Response::Node& usersNode{ response.createNode("users") }; auto transaction{ context.getDbSession().createReadTransaction() }; diff --git a/src/libs/subsonic/test/AuthUtils.cpp b/src/libs/subsonic/test/AuthUtils.cpp index 22df0d03..bb2f976f 100644 --- a/src/libs/subsonic/test/AuthUtils.cpp +++ b/src/libs/subsonic/test/AuthUtils.cpp @@ -27,21 +27,18 @@ namespace lms::api::subsonic::utils::tests namespace { const SubsonicResourceConfig bothMechanismsSupported{ - .serverProtocolVersionsByClient = {}, .openSubsonicDisabledClients = {}, .supportPasswordAuthentication = true, .supportTokenAuthentication = true, }; const SubsonicResourceConfig noneSupported{ - .serverProtocolVersionsByClient = {}, .openSubsonicDisabledClients = {}, .supportPasswordAuthentication = false, .supportTokenAuthentication = false, }; const SubsonicResourceConfig passwordUnsupported{ - .serverProtocolVersionsByClient = {}, .openSubsonicDisabledClients = {}, .supportPasswordAuthentication = false, .supportTokenAuthentication = true, diff --git a/src/libs/subsonic/test/SubsonicResponse.cpp b/src/libs/subsonic/test/SubsonicResponse.cpp index 1d3f8cb7..a384e24e 100644 --- a/src/libs/subsonic/test/SubsonicResponse.cpp +++ b/src/libs/subsonic/test/SubsonicResponse.cpp @@ -25,7 +25,6 @@ #include "core/String.hpp" #include "core/Version.hpp" -#include "ProtocolVersion.hpp" #include "SubsonicResponse.hpp" namespace lms::api::subsonic::tests @@ -34,7 +33,7 @@ namespace lms::api::subsonic::tests { Response generateFakeResponse() { - Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; + Response response{ Response::createOkResponse() }; Response::Node& node{ response.createNode("MyNode") }; node.setAttribute("Attr1", "value1"); @@ -62,7 +61,7 @@ namespace lms::api::subsonic::tests TEST(SubsonicResponse, emptyJson) { - Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; + Response response{ Response::createOkResponse() }; std::ostringstream oss; response.write(oss, ResponseFormat::json); @@ -88,7 +87,7 @@ namespace lms::api::subsonic::tests TEST(SubsonicResponse, emptyXml) { - Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; + Response response{ Response::createOkResponse() }; std::ostringstream oss; response.write(oss, ResponseFormat::xml); @@ -116,7 +115,7 @@ namespace lms::api::subsonic::tests TEST(SubsonicResponse, jsonNaNAndInfinity) { - Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; + Response response{ Response::createOkResponse() }; Response::Node& node{ response.createNode("MyMath") }; node.setAttribute("finite", 1.25F);