Removed now useless config option

This commit is contained in:
emeric
2026-07-14 23:42:32 +02:00
parent b767913b64
commit 340711daad
26 changed files with 95 additions and 129 deletions
-4
View File
@@ -90,10 +90,6 @@ api-subsonic-support-password-auth = true;
# Enable or disable token/salt authentication (params 'u', 's' and 't') # Enable or disable token/salt authentication (params 'u', 's' and 't')
api-subsonic-support-token-auth = true; 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 # List of clients for whom open subsonic extensions and extra fields are disabled
api-open-subsonic-disabled-clients = ("DSub"); api-open-subsonic-disabled-clients = ("DSub");
+1 -1
View File
@@ -29,7 +29,7 @@ namespace lms::api::subsonic::benchs
{ {
Response generateFakeResponse() Response generateFakeResponse()
{ {
Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; Response response{ Response::createOkResponse() };
Response::Node& node{ response.createNode("MyNode") }; Response::Node& node{ response.createNode("MyNode") };
node.setAttribute("Attr1", "value1"); node.setAttribute("Attr1", "value1");
+1 -1
View File
@@ -68,4 +68,4 @@ namespace lms::api::subsonic::utils
// Throws on error // Throws on error
db::UserId authenticateUser(const Wt::Http::Request& request, db::Session& session, const SubsonicResourceConfig& config); db::UserId authenticateUser(const Wt::Http::Request& request, db::Session& session, const SubsonicResourceConfig& config);
} // namespace lms::api::subsonic } // namespace lms::api::subsonic::utils
+1 -1
View File
@@ -33,7 +33,7 @@ namespace lms::api::subsonic
unsigned patch{}; unsigned patch{};
}; };
static inline constexpr ProtocolVersion defaultServerProtocolVersion{ 1, 16, 1 }; static inline constexpr ProtocolVersion serverProtocolVersion{ 1, 16, 1 };
} // namespace lms::api::subsonic } // namespace lms::api::subsonic
namespace lms::core::stringUtils namespace lms::core::stringUtils
+1 -7
View File
@@ -50,10 +50,9 @@ namespace lms::api::subsonic
, _clientName{ getMandatoryParameterAs<std::string>(_request.getParameterMap(), "c") } , _clientName{ getMandatoryParameterAs<std::string>(_request.getParameterMap(), "c") }
, _clientProtocolVersion{ getMandatoryParameterAs<ProtocolVersion>(_request.getParameterMap(), "v") } , _clientProtocolVersion{ getMandatoryParameterAs<ProtocolVersion>(_request.getParameterMap(), "v") }
, _responseFormat{ getParameterAs<std::string>(request.getParameterMap(), "f").value_or("xml") == "json" ? ResponseFormat::json : ResponseFormat::xml } , _responseFormat{ getParameterAs<std::string>(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) } , _isOpenSubsonicEnabled{ !_config.openSubsonicDisabledClients.contains(_clientName) }
{ {
checkProtocolVersion(_clientProtocolVersion, _serverProtocolVersion); checkProtocolVersion(_clientProtocolVersion, serverProtocolVersion);
} }
RequestContext::~RequestContext() = default; RequestContext::~RequestContext() = default;
@@ -93,11 +92,6 @@ namespace lms::api::subsonic
return _clientName; return _clientName;
} }
ProtocolVersion RequestContext::getServerProtocolVersion() const
{
return _serverProtocolVersion;
}
ResponseFormat RequestContext::getResponseFormat() const ResponseFormat RequestContext::getResponseFormat() const
{ {
return _responseFormat; return _responseFormat;
@@ -60,7 +60,6 @@ namespace lms::api::subsonic
std::string getClientIpAddr() const; std::string getClientIpAddr() const;
std::string_view getClientName() const; std::string_view getClientName() const;
ProtocolVersion getServerProtocolVersion() const;
ResponseFormat getResponseFormat() const; ResponseFormat getResponseFormat() const;
bool isOpenSubsonicEnabled() const; bool isOpenSubsonicEnabled() const;
@@ -74,7 +73,6 @@ namespace lms::api::subsonic
const ProtocolVersion _clientProtocolVersion; const ProtocolVersion _clientProtocolVersion;
const ResponseFormat _responseFormat; const ResponseFormat _responseFormat;
const ProtocolVersion _serverProtocolVersion;
const bool _isOpenSubsonicEnabled; const bool _isOpenSubsonicEnabled;
}; };
} // namespace lms::api::subsonic } // namespace lms::api::subsonic
+2 -2
View File
@@ -373,7 +373,7 @@ namespace lms::api::subsonic
} }
catch (const Error& e) catch (const Error& e)
{ {
writeResponse(Response::createFailedResponse(defaultServerProtocolVersion, e), ResponseFormat::xml); writeResponse(Response::createFailedResponse(e), ResponseFormat::xml);
throw; throw;
} }
@@ -407,7 +407,7 @@ namespace lms::api::subsonic
} }
catch (const Error& e) catch (const Error& e)
{ {
Response resp{ Response::createFailedResponse(requestContext->getServerProtocolVersion(), e) }; Response resp{ Response::createFailedResponse(e) };
writeResponse(resp, requestContext->getResponseFormat()); writeResponse(resp, requestContext->getResponseFormat());
throw; throw;
} }
@@ -25,19 +25,6 @@ namespace lms::api::subsonic
{ {
namespace namespace
{ {
std::unordered_map<std::string, ProtocolVersion> readConfigProtocolVersions(core::IConfig& config)
{
std::unordered_map<std::string, ProtocolVersion> 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<std::string> readOpenSubsonicDisabledClients(core::IConfig& config) std::unordered_set<std::string> readOpenSubsonicDisabledClients(core::IConfig& config)
{ {
std::unordered_set<std::string> res; std::unordered_set<std::string> res;
@@ -55,7 +42,6 @@ namespace lms::api::subsonic
SubsonicResourceConfig readSubsonicResourceConfig(core::IConfig& config) SubsonicResourceConfig readSubsonicResourceConfig(core::IConfig& config)
{ {
return SubsonicResourceConfig{ return SubsonicResourceConfig{
.serverProtocolVersionsByClient = readConfigProtocolVersions(config),
.openSubsonicDisabledClients = readOpenSubsonicDisabledClients(config), .openSubsonicDisabledClients = readOpenSubsonicDisabledClients(config),
.supportPasswordAuthentication = config.getBool("api-subsonic-support-password-auth", true), .supportPasswordAuthentication = config.getBool("api-subsonic-support-password-auth", true),
.supportTokenAuthentication = config.getBool("api-subsonic-support-token-auth", true) .supportTokenAuthentication = config.getBool("api-subsonic-support-token-auth", true)
@@ -20,11 +20,8 @@
#pragma once #pragma once
#include <string> #include <string>
#include <unordered_map>
#include <unordered_set> #include <unordered_set>
#include "ProtocolVersion.hpp"
namespace lms::core namespace lms::core
{ {
class IConfig; class IConfig;
@@ -34,7 +31,6 @@ namespace lms::api::subsonic
{ {
struct SubsonicResourceConfig struct SubsonicResourceConfig
{ {
std::unordered_map<std::string, ProtocolVersion> serverProtocolVersionsByClient;
std::unordered_set<std::string> openSubsonicDisabledClients; std::unordered_set<std::string> openSubsonicDisabledClients;
bool supportPasswordAuthentication; bool supportPasswordAuthentication;
bool supportTokenAuthentication; bool supportTokenAuthentication;
+6 -6
View File
@@ -302,23 +302,23 @@ namespace lms::api::subsonic
os << '\"'; 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; Response response;
Node& responseNode{ response._root.createChild("subsonic-response") }; Node& responseNode{ response._root.createChild("subsonic-response") };
responseNode.setAttribute("status", error ? "failed" : "ok"); responseNode.setAttribute("status", error ? "failed" : "ok");
responseNode.setVersionAttribute(protocolVersion); responseNode.setVersionAttribute(serverProtocolVersion);
if (error) if (error)
{ {
+3 -3
View File
@@ -312,8 +312,8 @@ namespace lms::api::subsonic
map<Key, ValuesType> _childrenValues; map<Key, ValuesType> _childrenValues;
}; };
static Response createOkResponse(ProtocolVersion protocolVersion); static Response createOkResponse();
static Response createFailedResponse(ProtocolVersion protocolVersion, const Error& error); static Response createFailedResponse(const Error& error);
~Response() = default; ~Response() = default;
Response(const Response&) = delete; Response(const Response&) = delete;
@@ -328,7 +328,7 @@ namespace lms::api::subsonic
void write(std::ostream& os, ResponseFormat format) const; void write(std::ostream& os, ResponseFormat format) const;
private: private:
static Response createResponseCommon(ProtocolVersion protocolVersion, const Error* error = nullptr); static Response createResponseCommon(const Error* error = nullptr);
class JsonSerializer class JsonSerializer
{ {
@@ -163,7 +163,7 @@ namespace lms::api::subsonic
throw NotImplementedGenericError{}; 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" }) }; Response::Node& albumListNode{ response.createNode(id3 ? Response::Node::Key{ "albumList2" } : Response::Node::Key{ "albumList" }) };
for (const ReleaseId releaseId : releases) for (const ReleaseId releaseId : releases)
@@ -182,7 +182,7 @@ namespace lms::api::subsonic
auto transaction{ context.getDbSession().createReadTransaction() }; 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" }) }; Response::Node& starredNode{ response.createNode(id3 ? Response::Node::Key{ "starred2" } : Response::Node::Key{ "starred" }) };
feedback::IFeedbackService& feedbackService{ *core::Service<feedback::IFeedbackService>::get() }; feedback::IFeedbackService& feedbackService{ *core::Service<feedback::IFeedbackService>::get() };
@@ -238,7 +238,7 @@ namespace lms::api::subsonic
if (size > defaultMaxCountSize) if (size > defaultMaxCountSize)
throw ParameterValueTooHighGenericError{ "size", defaultMaxCountSize }; throw ParameterValueTooHighGenericError{ "size", defaultMaxCountSize };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& randomSongsNode{ response.createNode("randomSongs") }; Response::Node& randomSongsNode{ response.createNode("randomSongs") };
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
@@ -274,7 +274,7 @@ namespace lms::api::subsonic
if (!genreObj) if (!genreObj)
throw RequestedDataNotFoundError{}; throw RequestedDataNotFoundError{};
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& songsByGenreNode{ response.createNode("songsByGenre") }; Response::Node& songsByGenreNode{ response.createNode("songsByGenre") };
Track::FindParameters params; Track::FindParameters params;
@@ -291,7 +291,7 @@ namespace lms::api::subsonic
Response handleGetNowPlayingRequest(RequestContext& context) Response handleGetNowPlayingRequest(RequestContext& context)
{ {
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& nowPlayingNode{ response.createNode("nowPlaying") }; Response::Node& nowPlayingNode{ response.createNode("nowPlaying") };
scrobbling::IScrobblingService& scrobblingService{ *core::Service<scrobbling::IScrobblingService>::get() }; scrobbling::IScrobblingService& scrobblingService{ *core::Service<scrobbling::IScrobblingService>::get() };
@@ -38,7 +38,7 @@ namespace lms::api::subsonic
const auto bookmarkIds{ db::TrackBookmark::find(context.getDbSession(), context.getUser()->getId()) }; 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") }; Response::Node& bookmarksNode{ response.createNode("bookmarks") };
for (const db::TrackBookmarkId bookmarkId : bookmarkIds) for (const db::TrackBookmarkId bookmarkId : bookmarkIds)
@@ -74,7 +74,7 @@ namespace lms::api::subsonic
if (comment) if (comment)
bookmark.modify()->setComment(*comment); bookmark.modify()->setComment(*comment);
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleDeleteBookmark(RequestContext& context) Response handleDeleteBookmark(RequestContext& context)
@@ -90,7 +90,7 @@ namespace lms::api::subsonic
bookmark.remove(); bookmark.remove();
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
static db::PlayQueue::pointer getOrCreatePlayQueue(RequestContext& context) static db::PlayQueue::pointer getOrCreatePlayQueue(RequestContext& context)
@@ -122,7 +122,7 @@ namespace lms::api::subsonic
// PlayQueue makes use of a dedicated internal playlist // PlayQueue makes use of a dedicated internal playlist
static Response handleGetPlayQueueCommon(RequestContext& context, bool byIndex) static Response handleGetPlayQueueCommon(RequestContext& context, bool byIndex)
{ {
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
const db::PlayQueue::pointer playQueue{ getOrCreatePlayQueue(context) }; const db::PlayQueue::pointer playQueue{ getOrCreatePlayQueue(context) };
assert(playQueue); assert(playQueue);
@@ -204,7 +204,7 @@ namespace lms::api::subsonic
playQueue.modify()->setLastModifiedDateTime(Wt::WDateTime::currentDateTime()); playQueue.modify()->setLastModifiedDateTime(Wt::WDateTime::currentDateTime());
} }
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleSavePlayQueue(RequestContext& context) Response handleSavePlayQueue(RequestContext& context)
+15 -15
View File
@@ -214,7 +214,7 @@ namespace lms::api::subsonic
auto transaction{ context.getDbSession().createReadTransaction() }; 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" }) }; Response::Node& similarSongsNode{ response.createNode(id3 ? Response::Node::Key{ "similarSongs2" } : Response::Node::Key{ "similarSongs" }) };
for (const TrackId trackId : tracks) for (const TrackId trackId : tracks)
{ {
@@ -244,7 +244,7 @@ namespace lms::api::subsonic
Response handleGetMusicFoldersRequest(RequestContext& context) Response handleGetMusicFoldersRequest(RequestContext& context)
{ {
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& musicFoldersNode{ response.createNode("musicFolders") }; Response::Node& musicFoldersNode{ response.createNode("musicFolders") };
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
@@ -263,7 +263,7 @@ namespace lms::api::subsonic
// Optional params // Optional params
const MediaLibraryId mediaLibrary{ getParameterAs<MediaLibraryId>(context.getParameters(), "musicFolderId").value_or(MediaLibraryId{}) }; const MediaLibraryId mediaLibrary{ getParameterAs<MediaLibraryId>(context.getParameters(), "musicFolderId").value_or(MediaLibraryId{}) };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& indexesNode{ response.createNode("indexes") }; Response::Node& indexesNode{ response.createNode("indexes") };
indexesNode.setAttribute("ignoredArticles", ""); indexesNode.setAttribute("ignoredArticles", "");
indexesNode.setAttribute("lastModified", reportedDummyDateULong); // TODO report last file write? indexesNode.setAttribute("lastModified", reportedDummyDateULong); // TODO report last file write?
@@ -310,7 +310,7 @@ namespace lms::api::subsonic
// Mandatory params // Mandatory params
const auto directoryId{ getMandatoryParameterAs<DirectoryId>(context.getParameters(), "id") }; const auto directoryId{ getMandatoryParameterAs<DirectoryId>(context.getParameters(), "id") };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& directoryNode{ response.createNode("directory") }; Response::Node& directoryNode{ response.createNode("directory") };
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
@@ -374,7 +374,7 @@ namespace lms::api::subsonic
Response handleGetGenresRequest(RequestContext& context) Response handleGetGenresRequest(RequestContext& context)
{ {
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& genresNode{ response.createNode("genres") }; Response::Node& genresNode{ response.createNode("genres") };
@@ -392,7 +392,7 @@ namespace lms::api::subsonic
// Optional params // Optional params
const MediaLibraryId mediaLibrary{ getParameterAs<MediaLibraryId>(context.getParameters(), "musicFolderId").value_or(MediaLibraryId{}) }; const MediaLibraryId mediaLibrary{ getParameterAs<MediaLibraryId>(context.getParameters(), "musicFolderId").value_or(MediaLibraryId{}) };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& artistsNode{ response.createNode("artists") }; Response::Node& artistsNode{ response.createNode("artists") };
artistsNode.setAttribute("ignoredArticles", ""); artistsNode.setAttribute("ignoredArticles", "");
@@ -473,7 +473,7 @@ namespace lms::api::subsonic
if (!artist) if (!artist)
throw RequestedDataNotFoundError{}; throw RequestedDataNotFoundError{};
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node artistNode{ createArtistNode(context, artist) }; Response::Node artistNode{ createArtistNode(context, artist) };
auto addRelease{ [&](const Release::pointer& release) { auto addRelease{ [&](const Release::pointer& release) {
@@ -505,7 +505,7 @@ namespace lms::api::subsonic
if (!release) if (!release)
throw RequestedDataNotFoundError{}; throw RequestedDataNotFoundError{};
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node albumNode{ createAlbumNode(context, release, true /* id3 */) }; Response::Node albumNode{ createAlbumNode(context, release, true /* id3 */) };
const auto tracks{ Track::find(context.getDbSession(), Track::FindParameters{}.setRelease(id).setSortMethod(TrackSortMethod::Release)) }; const auto tracks{ Track::find(context.getDbSession(), Track::FindParameters{}.setRelease(id).setSortMethod(TrackSortMethod::Release)) };
@@ -528,7 +528,7 @@ namespace lms::api::subsonic
if (!track) if (!track)
throw RequestedDataNotFoundError{}; throw RequestedDataNotFoundError{};
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("song", createSongNode(context, track, context.getUser())); response.addNode("song", createSongNode(context, track, context.getUser()));
return response; return response;
@@ -542,7 +542,7 @@ namespace lms::api::subsonic
// Optional params // Optional params
std::size_t count{ getParameterAs<std::size_t>(context.getParameters(), "count").value_or(20) }; std::size_t count{ getParameterAs<std::size_t>(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" }) }; Response::Node& artistInfoNode{ response.createNode(Response::Node::Key{ "artistInfo2" }) };
{ {
@@ -601,7 +601,7 @@ namespace lms::api::subsonic
{ {
const db::DirectoryId directoryId{ getMandatoryParameterAs<db::DirectoryId>(context.getParameters(), "id") }; const db::DirectoryId directoryId{ getMandatoryParameterAs<db::DirectoryId>(context.getParameters(), "id") };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
{ {
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
@@ -616,7 +616,7 @@ namespace lms::api::subsonic
{ {
const db::ReleaseId releaseId{ getMandatoryParameterAs<db::ReleaseId>(context.getParameters(), "id") }; const db::ReleaseId releaseId{ getMandatoryParameterAs<db::ReleaseId>(context.getParameters(), "id") };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
{ {
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
@@ -648,7 +648,7 @@ namespace lms::api::subsonic
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& topSongs{ response.createNode("topSongs") }; Response::Node& topSongs{ response.createNode("topSongs") };
const auto artists{ Artist::find(context.getDbSession(), artistName) }; const auto artists{ Artist::find(context.getDbSession(), artistName) };
@@ -684,7 +684,7 @@ namespace lms::api::subsonic
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
for (const auto& similarTrack : similarTracks) for (const auto& similarTrack : similarTracks)
{ {
@@ -715,7 +715,7 @@ namespace lms::api::subsonic
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
for (const auto& pathTrack : pathTracks) for (const auto& pathTrack : pathTracks)
{ {
+16 -16
View File
@@ -71,7 +71,7 @@ namespace lms::api::subsonic
Response handleJukeboxGet(RequestContext& context, jukebox::IJukeboxService& jukeboxService) Response handleJukeboxGet(RequestContext& context, jukebox::IJukeboxService& jukeboxService)
{ {
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node jukeboxPlaylistNode{ createJukeboxStatusNode(jukeboxService) }; Response::Node jukeboxPlaylistNode{ createJukeboxStatusNode(jukeboxService) };
{ {
@@ -88,9 +88,9 @@ namespace lms::api::subsonic
return response; 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)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
@@ -103,25 +103,25 @@ namespace lms::api::subsonic
jukeboxService.clearTracks(); jukeboxService.clearTracks();
jukeboxService.appendTracks(trackIds); jukeboxService.appendTracks(trackIds);
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
Response handleJukeboxStart(RequestContext& context, jukebox::IJukeboxService& jukeboxService) Response handleJukeboxStart(RequestContext& /*context*/, jukebox::IJukeboxService& jukeboxService)
{ {
jukeboxService.resume(); jukeboxService.resume();
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
Response handleJukeboxStop(RequestContext& context, jukebox::IJukeboxService& jukeboxService) Response handleJukeboxStop(RequestContext& /*context*/, jukebox::IJukeboxService& jukeboxService)
{ {
jukeboxService.pause(); jukeboxService.pause();
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
@@ -134,7 +134,7 @@ namespace lms::api::subsonic
// do not report potential range error // do not report potential range error
jukeboxService.play(index, std::chrono::seconds{ offset }); jukeboxService.play(index, std::chrono::seconds{ offset });
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
@@ -145,16 +145,16 @@ namespace lms::api::subsonic
jukeboxService.appendTracks(trackIds); jukeboxService.appendTracks(trackIds);
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
Response handleJukeboxClear(RequestContext& context, jukebox::IJukeboxService& jukeboxService) Response handleJukeboxClear(RequestContext& /*context*/, jukebox::IJukeboxService& jukeboxService)
{ {
jukeboxService.clearTracks(); jukeboxService.clearTracks();
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
@@ -164,16 +164,16 @@ namespace lms::api::subsonic
const auto index{ getMandatoryParameterAs<std::size_t>(context.getParameters(), "index") }; const auto index{ getMandatoryParameterAs<std::size_t>(context.getParameters(), "index") };
jukeboxService.removeTrack(index); jukeboxService.removeTrack(index);
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
Response handleJukeboxShuffle(RequestContext& context, jukebox::IJukeboxService& jukeboxService) Response handleJukeboxShuffle(RequestContext& /*context*/, jukebox::IJukeboxService& jukeboxService)
{ {
jukeboxService.shuffleTracks(); jukeboxService.shuffleTracks();
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
@@ -186,7 +186,7 @@ namespace lms::api::subsonic
jukeboxService.setVolume(gain); // consider gain is linear jukeboxService.setVolume(gain); // consider gain is linear
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService)); response.addNode("jukeboxStatus", createJukeboxStatusNode(jukeboxService));
return response; return response;
} }
@@ -130,7 +130,7 @@ namespace lms::api::subsonic
for (const TrackId id : params.trackIds) for (const TrackId id : params.trackIds)
core::Service<feedback::IFeedbackService>::get()->star(context.getUser()->getId(), id); core::Service<feedback::IFeedbackService>::get()->star(context.getUser()->getId(), id);
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleUnstarRequest(RequestContext& context) Response handleUnstarRequest(RequestContext& context)
@@ -152,7 +152,7 @@ namespace lms::api::subsonic
for (const TrackId id : params.trackIds) for (const TrackId id : params.trackIds)
core::Service<feedback::IFeedbackService>::get()->unstar(context.getUser()->getId(), id); core::Service<feedback::IFeedbackService>::get()->unstar(context.getUser()->getId(), id);
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleSetRating(RequestContext& context) Response handleSetRating(RequestContext& context)
@@ -171,7 +171,7 @@ namespace lms::api::subsonic
else if (const TrackId * trackId{ std::get_if<TrackId>(&params.id) }) else if (const TrackId * trackId{ std::get_if<TrackId>(&params.id) })
core::Service<feedback::IFeedbackService>::get()->setRating(context.getUser()->getId(), *trackId, params.rating); core::Service<feedback::IFeedbackService>::get()->setRating(context.getUser()->getId(), *trackId, params.rating);
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleScrobble(RequestContext& context) Response handleScrobble(RequestContext& context)
@@ -209,6 +209,6 @@ namespace lms::api::subsonic
} }
} }
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
} // namespace lms::api::subsonic } // namespace lms::api::subsonic
@@ -49,19 +49,19 @@ namespace lms::api::subsonic::Scan
} }
} // namespace } // namespace
Response handleGetScanStatus(RequestContext& context) Response handleGetScanStatus(RequestContext& /*context*/)
{ {
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("scanStatus", createStatusResponseNode()); response.addNode("scanStatus", createStatusResponseNode());
return response; return response;
} }
Response handleStartScan(RequestContext& context) Response handleStartScan(RequestContext& /*context*/)
{ {
core::Service<IScannerService>::get()->requestImmediateScan(); core::Service<IScannerService>::get()->requestImmediateScan();
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("scanStatus", createStatusResponseNode()); response.addNode("scanStatus", createStatusResponseNode());
return response; return response;
@@ -236,7 +236,7 @@ namespace lms::api::subsonic
std::string artistName{ getParameterAs<std::string>(context.getParameters(), "artist").value_or("") }; std::string artistName{ getParameterAs<std::string>(context.getParameters(), "artist").value_or("") };
std::string titleName{ getParameterAs<std::string>(context.getParameters(), "title").value_or("") }; std::string titleName{ getParameterAs<std::string>(context.getParameters(), "title").value_or("") };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
// best effort search, as this API is really limited // best effort search, as this API is really limited
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
@@ -269,7 +269,7 @@ namespace lms::api::subsonic
// mandatory params // mandatory params
db::TrackId id{ getMandatoryParameterAs<db::TrackId>(context.getParameters(), "id") }; db::TrackId id{ getMandatoryParameterAs<db::TrackId>(context.getParameters(), "id") };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& lyricsList{ response.createNode("lyricsList") }; Response::Node& lyricsList{ response.createNode("lyricsList") };
lyricsList.createEmptyArrayChild("structuredLyrics"); lyricsList.createEmptyArrayChild("structuredLyrics");
@@ -55,7 +55,7 @@ namespace lms::api::subsonic
{ {
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& playlistsNode{ response.createNode("playlists") }; Response::Node& playlistsNode{ response.createNode("playlists") };
auto addTrackList{ [&](const db::TrackList::pointer& trackList) { 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) if (trackList->getUserId() != context.getUser()->getId() && trackList->getVisibility() != TrackList::Visibility::Public)
throw RequestedDataNotFoundError{}; throw RequestedDataNotFoundError{};
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node playlistNode{ createPlaylistNode(context, trackList) }; Response::Node playlistNode{ createPlaylistNode(context, trackList) };
auto entries{ trackList->getEntries() }; auto entries{ trackList->getEntries() };
@@ -156,7 +156,7 @@ namespace lms::api::subsonic
context.getDbSession().create<TrackListEntry>(track, trackList); context.getDbSession().create<TrackListEntry>(track, trackList);
} }
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node playlistNode{ createPlaylistNode(context, trackList) }; Response::Node playlistNode{ createPlaylistNode(context, trackList) };
auto entries{ trackList->getEntries() }; auto entries{ trackList->getEntries() };
@@ -213,7 +213,7 @@ namespace lms::api::subsonic
context.getDbSession().create<TrackListEntry>(track, trackList); context.getDbSession().create<TrackListEntry>(track, trackList);
} }
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleDeletePlaylistRequest(RequestContext& context) Response handleDeletePlaylistRequest(RequestContext& context)
@@ -227,6 +227,6 @@ namespace lms::api::subsonic
trackList.remove(); trackList.remove();
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
} // namespace lms::api::subsonic } // namespace lms::api::subsonic
+9 -9
View File
@@ -37,7 +37,7 @@ namespace lms::api::subsonic
const bool includeEpisodes{ getParameterAs<bool>(context.getParameters(), "includeEpisodes").value_or(true) }; const bool includeEpisodes{ getParameterAs<bool>(context.getParameters(), "includeEpisodes").value_or(true) };
const std::optional<db::PodcastId> podcastId{ getParameterAs<db::PodcastId>(context.getParameters(), "id") }; const std::optional<db::PodcastId> podcastId{ getParameterAs<db::PodcastId>(context.getParameters(), "id") };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& podcastsNode{ response.createNode("podcasts") }; Response::Node& podcastsNode{ response.createNode("podcasts") };
podcastsNode.createEmptyArrayChild("channel"); podcastsNode.createEmptyArrayChild("channel");
@@ -66,7 +66,7 @@ namespace lms::api::subsonic
std::size_t count{ getParameterAs<std::size_t>(context.getParameters(), "count").value_or(20) }; std::size_t count{ getParameterAs<std::size_t>(context.getParameters(), "count").value_or(20) };
count = std::min<std::size_t>(count, 100); count = std::min<std::size_t>(count, 100);
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& newestPodcastsNode{ response.createNode("newestPodcasts") }; Response::Node& newestPodcastsNode{ response.createNode("newestPodcasts") };
newestPodcastsNode.createEmptyArrayChild("episode"); newestPodcastsNode.createEmptyArrayChild("episode");
@@ -84,11 +84,11 @@ namespace lms::api::subsonic
return response; return response;
} }
Response handleRefreshPodcasts(RequestContext& context) Response handleRefreshPodcasts(RequestContext& /*context*/)
{ {
core::Service<podcast::IPodcastService>::get()->refreshPodcasts(); core::Service<podcast::IPodcastService>::get()->refreshPodcasts();
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleCreatePodcastChannel(RequestContext& context) Response handleCreatePodcastChannel(RequestContext& context)
@@ -102,7 +102,7 @@ namespace lms::api::subsonic
// no effect if podcast already exists // no effect if podcast already exists
core::Service<podcast::IPodcastService>::get()->addPodcast(url); core::Service<podcast::IPodcastService>::get()->addPodcast(url);
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleDeletePodcastChannel(RequestContext& context) Response handleDeletePodcastChannel(RequestContext& context)
@@ -113,7 +113,7 @@ namespace lms::api::subsonic
if (!core::Service<podcast::IPodcastService>::get()->removePodcast(podcastId)) if (!core::Service<podcast::IPodcastService>::get()->removePodcast(podcastId))
throw RequestedDataNotFoundError{}; throw RequestedDataNotFoundError{};
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleDeletePodcastEpisode(RequestContext& context) Response handleDeletePodcastEpisode(RequestContext& context)
@@ -124,7 +124,7 @@ namespace lms::api::subsonic
if (!core::Service<podcast::IPodcastService>::get()->deletePodcastEpisode(episodeId)) if (!core::Service<podcast::IPodcastService>::get()->deletePodcastEpisode(episodeId))
throw RequestedDataNotFoundError{}; throw RequestedDataNotFoundError{};
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleDownloadPodcastEpisode(RequestContext& context) Response handleDownloadPodcastEpisode(RequestContext& context)
@@ -135,7 +135,7 @@ namespace lms::api::subsonic
if (!core::Service<podcast::IPodcastService>::get()->downloadPodcastEpisode(episodeId)) if (!core::Service<podcast::IPodcastService>::get()->downloadPodcastEpisode(episodeId))
throw RequestedDataNotFoundError{}; throw RequestedDataNotFoundError{};
return Response::createOkResponse(context.getServerProtocolVersion()); return Response::createOkResponse();
} }
Response handleGetPodcastEpisode(RequestContext& context) Response handleGetPodcastEpisode(RequestContext& context)
@@ -143,7 +143,7 @@ namespace lms::api::subsonic
// Mandatory parameters // Mandatory parameters
const db::PodcastEpisodeId episodeId{ getMandatoryParameterAs<db::PodcastEpisodeId>(context.getParameters(), "id") }; const db::PodcastEpisodeId episodeId{ getMandatoryParameterAs<db::PodcastEpisodeId>(context.getParameters(), "id") };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
@@ -373,7 +373,7 @@ namespace lms::api::subsonic
if (!query.empty()) if (!query.empty())
keywords = core::stringUtils::splitString(query, ' '); keywords = core::stringUtils::splitString(query, ' ');
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& searchResultNode{ response.createNode(id3 ? "searchResult3" : "searchResult2") }; Response::Node& searchResultNode{ response.createNode(id3 ? "searchResult3" : "searchResult2") };
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
+7 -7
View File
@@ -26,14 +26,14 @@
namespace lms::api::subsonic 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") }; Response::Node& licenseNode{ response.createNode("license") };
licenseNode.setAttribute("licenseExpires", "2035-09-03T14:46:43"); licenseNode.setAttribute("licenseExpires", "2035-09-03T14:46:43");
@@ -45,7 +45,7 @@ namespace lms::api::subsonic
Response handleTokenInfoRequest(RequestContext& context) Response handleTokenInfoRequest(RequestContext& context)
{ {
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& tokenInfoNode{ response.createNode("tokenInfo") }; Response::Node& tokenInfoNode{ response.createNode("tokenInfo") };
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
@@ -54,9 +54,9 @@ namespace lms::api::subsonic
return response; return response;
} }
Response handleGetOpenSubsonicExtensions(RequestContext& context) Response handleGetOpenSubsonicExtensions(RequestContext& /*context*/)
{ {
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
struct Extension struct Extension
{ {
@@ -84,7 +84,7 @@ namespace lms::api::subsonic
const ClientInfo clientInfo{ parseClientInfoFromJson(context.getBody()) }; const ClientInfo clientInfo{ parseClientInfoFromJson(context.getBody()) };
const AudioFileInfo audioFileInfo{ getAudioFileInfo(context.getDbSession(), audioFileId) }; const AudioFileInfo audioFileInfo{ getAudioFileInfo(context.getDbSession(), audioFileId) };
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& transcodeNode{ response.createNode("transcodeDecision") }; Response::Node& transcodeNode{ response.createNode("transcodeDecision") };
{ {
@@ -50,7 +50,7 @@ namespace lms::api::subsonic
if (!user) if (!user)
throw RequestedDataNotFoundError{}; throw RequestedDataNotFoundError{};
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
response.addNode("user", createUserNode(context, user)); response.addNode("user", createUserNode(context, user));
return response; return response;
@@ -58,7 +58,7 @@ namespace lms::api::subsonic
Response handleGetUsersRequest(RequestContext& context) Response handleGetUsersRequest(RequestContext& context)
{ {
Response response{ Response::createOkResponse(context.getServerProtocolVersion()) }; Response response{ Response::createOkResponse() };
Response::Node& usersNode{ response.createNode("users") }; Response::Node& usersNode{ response.createNode("users") };
auto transaction{ context.getDbSession().createReadTransaction() }; auto transaction{ context.getDbSession().createReadTransaction() };
-3
View File
@@ -27,21 +27,18 @@ namespace lms::api::subsonic::utils::tests
namespace namespace
{ {
const SubsonicResourceConfig bothMechanismsSupported{ const SubsonicResourceConfig bothMechanismsSupported{
.serverProtocolVersionsByClient = {},
.openSubsonicDisabledClients = {}, .openSubsonicDisabledClients = {},
.supportPasswordAuthentication = true, .supportPasswordAuthentication = true,
.supportTokenAuthentication = true, .supportTokenAuthentication = true,
}; };
const SubsonicResourceConfig noneSupported{ const SubsonicResourceConfig noneSupported{
.serverProtocolVersionsByClient = {},
.openSubsonicDisabledClients = {}, .openSubsonicDisabledClients = {},
.supportPasswordAuthentication = false, .supportPasswordAuthentication = false,
.supportTokenAuthentication = false, .supportTokenAuthentication = false,
}; };
const SubsonicResourceConfig passwordUnsupported{ const SubsonicResourceConfig passwordUnsupported{
.serverProtocolVersionsByClient = {},
.openSubsonicDisabledClients = {}, .openSubsonicDisabledClients = {},
.supportPasswordAuthentication = false, .supportPasswordAuthentication = false,
.supportTokenAuthentication = true, .supportTokenAuthentication = true,
+4 -5
View File
@@ -25,7 +25,6 @@
#include "core/String.hpp" #include "core/String.hpp"
#include "core/Version.hpp" #include "core/Version.hpp"
#include "ProtocolVersion.hpp"
#include "SubsonicResponse.hpp" #include "SubsonicResponse.hpp"
namespace lms::api::subsonic::tests namespace lms::api::subsonic::tests
@@ -34,7 +33,7 @@ namespace lms::api::subsonic::tests
{ {
Response generateFakeResponse() Response generateFakeResponse()
{ {
Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; Response response{ Response::createOkResponse() };
Response::Node& node{ response.createNode("MyNode") }; Response::Node& node{ response.createNode("MyNode") };
node.setAttribute("Attr1", "value1"); node.setAttribute("Attr1", "value1");
@@ -62,7 +61,7 @@ namespace lms::api::subsonic::tests
TEST(SubsonicResponse, emptyJson) TEST(SubsonicResponse, emptyJson)
{ {
Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; Response response{ Response::createOkResponse() };
std::ostringstream oss; std::ostringstream oss;
response.write(oss, ResponseFormat::json); response.write(oss, ResponseFormat::json);
@@ -88,7 +87,7 @@ namespace lms::api::subsonic::tests
TEST(SubsonicResponse, emptyXml) TEST(SubsonicResponse, emptyXml)
{ {
Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; Response response{ Response::createOkResponse() };
std::ostringstream oss; std::ostringstream oss;
response.write(oss, ResponseFormat::xml); response.write(oss, ResponseFormat::xml);
@@ -116,7 +115,7 @@ namespace lms::api::subsonic::tests
TEST(SubsonicResponse, jsonNaNAndInfinity) TEST(SubsonicResponse, jsonNaNAndInfinity)
{ {
Response response{ Response::createOkResponse(defaultServerProtocolVersion) }; Response response{ Response::createOkResponse() };
Response::Node& node{ response.createNode("MyMath") }; Response::Node& node{ response.createNode("MyMath") };
node.setAttribute("finite", 1.25F); node.setAttribute("finite", 1.25F);