Do not log not implemented commands as errors, fixes #11
This commit is contained in:
@@ -1656,6 +1656,13 @@ handleUpdatePlaylistRequest(RequestContext& context)
|
|||||||
return Response::createOkResponse();
|
return Response::createOkResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
Response
|
||||||
|
handleNotImplemented(RequestContext&)
|
||||||
|
{
|
||||||
|
throw NotImplementedGenericError {};
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
Av::Encoding
|
Av::Encoding
|
||||||
userTranscodeFormatToAvEncoding(AudioFormat format)
|
userTranscodeFormatToAvEncoding(AudioFormat format)
|
||||||
@@ -1796,49 +1803,118 @@ struct RequestEntryPointInfo
|
|||||||
bool mustBeAdmin;
|
bool mustBeAdmin;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::map<std::string, RequestEntryPointInfo> requestEntryPoints
|
static std::unordered_map<std::string, RequestEntryPointInfo> requestEntryPoints
|
||||||
{
|
{
|
||||||
{"changePassword", {handleChangePassword, false}},
|
// System
|
||||||
{"createPlaylist", {handleCreatePlaylistRequest, false}},
|
{"ping", {handlePingRequest, false}},
|
||||||
{"createUser", {handleCreateUserRequest, true}},
|
{"getLicense", {handleGetLicenseRequest, false}},
|
||||||
{"deletePlaylist", {handleDeletePlaylistRequest, false}},
|
|
||||||
{"deleteUser", {handleDeleteUserRequest, true}},
|
// Browsing
|
||||||
{"getAlbumList", {handleGetAlbumListRequest, false}},
|
{"getMusicFolders", {handleGetMusicFoldersRequest, false}},
|
||||||
{"getAlbumList2", {handleGetAlbumList2Request, false}},
|
{"getIndexes", {handleGetIndexesRequest, false}},
|
||||||
{"getAlbum", {handleGetAlbumRequest, false}},
|
{"getMusicDirectory", {handleGetMusicDirectoryRequest, false}},
|
||||||
|
{"getGenres", {handleGetGenresRequest, false}},
|
||||||
|
{"getArtists", {handleGetArtistsRequest, false}},
|
||||||
{"getArtist", {handleGetArtistRequest, false}},
|
{"getArtist", {handleGetArtistRequest, false}},
|
||||||
|
{"getAlbum", {handleGetAlbumRequest, false}},
|
||||||
|
{"getSong", {handleNotImplemented, false}},
|
||||||
|
{"getVideos", {handleNotImplemented, false}},
|
||||||
{"getArtistInfo", {handleGetArtistInfoRequest, false}},
|
{"getArtistInfo", {handleGetArtistInfoRequest, false}},
|
||||||
{"getArtistInfo2", {handleGetArtistInfo2Request, false}},
|
{"getArtistInfo2", {handleGetArtistInfo2Request, false}},
|
||||||
{"getArtists", {handleGetArtistsRequest, false}},
|
{"getAlbumInfo", {handleNotImplemented, false}},
|
||||||
{"getGenres", {handleGetGenresRequest, false}},
|
{"getAlbumInfo2", {handleNotImplemented, false}},
|
||||||
{"getIndexes", {handleGetIndexesRequest, false}},
|
|
||||||
{"getLicense", {handleGetLicenseRequest, false}},
|
|
||||||
{"getMusicDirectory", {handleGetMusicDirectoryRequest, false}},
|
|
||||||
{"getMusicFolders", {handleGetMusicFoldersRequest, false}},
|
|
||||||
{"getRandomSongs", {handleGetRandomSongsRequest, false}},
|
|
||||||
{"getSimilarSongs", {handleGetSimilarSongsRequest, false}},
|
{"getSimilarSongs", {handleGetSimilarSongsRequest, false}},
|
||||||
{"getSimilarSongs2", {handleGetSimilarSongs2Request, false}},
|
{"getSimilarSongs2", {handleGetSimilarSongs2Request, false}},
|
||||||
|
{"getTopSongs", {handleNotImplemented, false}},
|
||||||
|
|
||||||
|
// Album/song lists
|
||||||
|
{"getAlbumList", {handleGetAlbumListRequest, false}},
|
||||||
|
{"getAlbumList2", {handleGetAlbumList2Request, false}},
|
||||||
|
{"getRandomSongs", {handleGetRandomSongsRequest, false}},
|
||||||
|
{"getSongsByGenre", {handleGetSongsByGenreRequest, false}},
|
||||||
|
{"getNowPlaying", {handleNotImplemented, false}},
|
||||||
{"getStarred", {handleGetStarredRequest, false}},
|
{"getStarred", {handleGetStarredRequest, false}},
|
||||||
{"getStarred2", {handleGetStarred2Request, false}},
|
{"getStarred2", {handleGetStarred2Request, false}},
|
||||||
{"getPlaylist", {handleGetPlaylistRequest, false}},
|
|
||||||
{"getPlaylists", {handleGetPlaylistsRequest, false}},
|
// Searching
|
||||||
{"getSongsByGenre", {handleGetSongsByGenreRequest, false}},
|
{"search", {handleNotImplemented, false}},
|
||||||
{"getUser", {handleGetUserRequest, false}},
|
|
||||||
{"getUsers", {handleGetUsersRequest, true}},
|
|
||||||
{"ping", {handlePingRequest, false}},
|
|
||||||
{"search2", {handleSearch2Request, false}},
|
{"search2", {handleSearch2Request, false}},
|
||||||
{"search3", {handleSearch3Request, false}},
|
{"search3", {handleSearch3Request, false}},
|
||||||
|
|
||||||
|
// Playlists
|
||||||
|
{"getPlaylists", {handleGetPlaylistsRequest, false}},
|
||||||
|
{"getPlaylist", {handleGetPlaylistRequest, false}},
|
||||||
|
{"createPlaylist", {handleCreatePlaylistRequest, false}},
|
||||||
|
{"updatePlaylist", {handleUpdatePlaylistRequest, false}},
|
||||||
|
{"deletePlaylist", {handleDeletePlaylistRequest, false}},
|
||||||
|
|
||||||
|
// Media retrieval
|
||||||
|
{"download", {handleNotImplemented, false}},
|
||||||
|
{"hls", {handleNotImplemented, false}},
|
||||||
|
{"getCaptions", {handleNotImplemented, false}},
|
||||||
|
{"getLyrics", {handleNotImplemented, false}},
|
||||||
|
{"getAvatar", {handleNotImplemented, false}},
|
||||||
|
|
||||||
|
// Media annotation
|
||||||
{"star", {handleStarRequest, false}},
|
{"star", {handleStarRequest, false}},
|
||||||
{"unstar", {handleUnstarRequest, false}},
|
{"unstar", {handleUnstarRequest, false}},
|
||||||
|
{"setRating", {handleNotImplemented, false}},
|
||||||
|
{"scrobble", {handleNotImplemented, false}},
|
||||||
|
|
||||||
|
// Sharing
|
||||||
|
{"getShares", {handleNotImplemented, false}},
|
||||||
|
{"createShares", {handleNotImplemented, false}},
|
||||||
|
{"updateShare", {handleNotImplemented, false}},
|
||||||
|
{"deleteShare", {handleNotImplemented, false}},
|
||||||
|
|
||||||
|
// Podcast
|
||||||
|
{"getPodcasts", {handleNotImplemented, false}},
|
||||||
|
{"getNewestPodcasts", {handleNotImplemented, false}},
|
||||||
|
{"refreshPodcasts", {handleNotImplemented, false}},
|
||||||
|
{"createPodcastChannel", {handleNotImplemented, false}},
|
||||||
|
{"deletePodcastChannel", {handleNotImplemented, false}},
|
||||||
|
{"deletePodcastEpisode", {handleNotImplemented, false}},
|
||||||
|
{"downloadPodcastEpisode", {handleNotImplemented, false}},
|
||||||
|
|
||||||
|
// Jukebox
|
||||||
|
{"jukeboxControl", {handleNotImplemented, false}},
|
||||||
|
|
||||||
|
// Internet radio
|
||||||
|
{"getInternetRadioStations", {handleNotImplemented, false}},
|
||||||
|
{"createInternetRadioStation", {handleNotImplemented, false}},
|
||||||
|
{"updateInternetRadioStation", {handleNotImplemented, false}},
|
||||||
|
{"deleteInternetRadioStation", {handleNotImplemented, false}},
|
||||||
|
|
||||||
|
// Chat
|
||||||
|
{"getChatMessages", {handleNotImplemented, false}},
|
||||||
|
{"addChatMessages", {handleNotImplemented, false}},
|
||||||
|
|
||||||
|
// User management
|
||||||
|
{"getUser", {handleGetUserRequest, false}},
|
||||||
|
{"getUsers", {handleGetUsersRequest, true}},
|
||||||
|
{"createUser", {handleCreateUserRequest, true}},
|
||||||
{"updateUser", {handleUpdateUserRequest, true}},
|
{"updateUser", {handleUpdateUserRequest, true}},
|
||||||
{"updatePlaylist", {handleUpdatePlaylistRequest, false}},
|
{"deleteUser", {handleDeleteUserRequest, true}},
|
||||||
|
{"changePassword", {handleChangePassword, false}},
|
||||||
|
|
||||||
|
// Bookmarks
|
||||||
|
{"getBookmarks", {handleNotImplemented, false}},
|
||||||
|
{"createBookmarks", {handleNotImplemented, false}},
|
||||||
|
{"deleteBookmarks", {handleNotImplemented, false}},
|
||||||
|
{"getPlayQueue", {handleNotImplemented, false}},
|
||||||
|
{"savePlayQueue", {handleNotImplemented, false}},
|
||||||
|
|
||||||
|
// Media library scanning
|
||||||
|
{"getScanStatus", {handleNotImplemented, true}},
|
||||||
|
{"startScan", {handleNotImplemented, true}},
|
||||||
};
|
};
|
||||||
|
|
||||||
using MediaRetrievalHandlerFunc = std::function<MediaRetrievalResult(RequestContext&, Wt::Http::ResponseContinuation*)>;
|
using MediaRetrievalHandlerFunc = std::function<MediaRetrievalResult(RequestContext&, Wt::Http::ResponseContinuation*)>;
|
||||||
static std::map<std::string, MediaRetrievalHandlerFunc> mediaRetrievalHandlers
|
static std::unordered_map<std::string, MediaRetrievalHandlerFunc> mediaRetrievalHandlers
|
||||||
{
|
{
|
||||||
{"stream", handleStream},
|
// Media retrieval
|
||||||
{"getCoverArt", handleGetCoverArt},
|
{"getCoverArt", handleGetCoverArt},
|
||||||
|
{"stream", handleStream},
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1930,7 +2006,16 @@ SubsonicResource::handleRequest(const Wt::Http::Request &request, Wt::Http::Resp
|
|||||||
}
|
}
|
||||||
|
|
||||||
LMS_LOG(API_SUBSONIC, ERROR) << "Unhandled command '" << requestPath << "'";
|
LMS_LOG(API_SUBSONIC, ERROR) << "Unhandled command '" << requestPath << "'";
|
||||||
throw NotImplementedGenericError {};
|
throw UnknownEntryPointGenericError {};
|
||||||
|
}
|
||||||
|
catch (const NotImplementedGenericError& e)
|
||||||
|
{
|
||||||
|
LMS_LOG(API_SUBSONIC, INFO) << "Command '" << requestPath << "'"
|
||||||
|
<< ", params = [" << parameterMapToDebugString(request.getParameterMap()) << "]"
|
||||||
|
<< ", code = " << static_cast<int>(e.getCode()) << ", msg = '" << static_cast<const Error&>(e).getMessage() << "'";
|
||||||
|
Response resp {Response::createFailedResponse(e)};
|
||||||
|
resp.write(response.out(), format);
|
||||||
|
response.setMimeType(ResponseFormatToMimeType(format));
|
||||||
}
|
}
|
||||||
catch (const Error& e)
|
catch (const Error& e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -135,6 +135,11 @@ class NotImplementedGenericError : public GenericError
|
|||||||
std::string getMessage() const override { return "Not implemented"; }
|
std::string getMessage() const override { return "Not implemented"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class UnknownEntryPointGenericError : public GenericError
|
||||||
|
{
|
||||||
|
std::string getMessage() const override { return "Unknown API method"; }
|
||||||
|
};
|
||||||
|
|
||||||
class PasswordTooWeakGenericError : public GenericError
|
class PasswordTooWeakGenericError : public GenericError
|
||||||
{
|
{
|
||||||
std::string getMessage() const override { return "Password too weak"; }
|
std::string getMessage() const override { return "Password too weak"; }
|
||||||
|
|||||||
Reference in New Issue
Block a user