diff --git a/src/requesthandler/RequestHandler.cpp b/src/requesthandler/RequestHandler.cpp index 26818a4c..e3ba574a 100644 --- a/src/requesthandler/RequestHandler.cpp +++ b/src/requesthandler/RequestHandler.cpp @@ -56,6 +56,8 @@ const std::unordered_map RequestHandler::_han {"GetSourceActive", &RequestHandler::GetSourceActive}, {"GetSourceScreenshot", &RequestHandler::GetSourceScreenshot}, {"SaveSourceScreenshot", &RequestHandler::SaveSourceScreenshot}, + {"GetSourcePrivateSettings", &RequestHandler::GetSourcePrivateSettings}, + {"SetSourcePrivateSettings", &RequestHandler::SetSourcePrivateSettings}, // Scenes {"GetSceneList", &RequestHandler::GetSceneList}, diff --git a/src/requesthandler/RequestHandler.h b/src/requesthandler/RequestHandler.h index d411f59b..40967ca0 100644 --- a/src/requesthandler/RequestHandler.h +++ b/src/requesthandler/RequestHandler.h @@ -74,6 +74,8 @@ class RequestHandler { RequestResult GetSourceActive(const Request&); RequestResult GetSourceScreenshot(const Request&); RequestResult SaveSourceScreenshot(const Request&); + RequestResult GetSourcePrivateSettings(const Request&); + RequestResult SetSourcePrivateSettings(const Request&); // Scenes RequestResult GetSceneList(const Request&); diff --git a/src/requesthandler/RequestHandler_SceneItems.cpp b/src/requesthandler/RequestHandler_SceneItems.cpp index c47621f9..4f25c7b2 100644 --- a/src/requesthandler/RequestHandler_SceneItems.cpp +++ b/src/requesthandler/RequestHandler_SceneItems.cpp @@ -675,8 +675,6 @@ RequestResult RequestHandler::GetSceneItemBlendMode(const Request& request) return RequestResult::Success(responseData); } - - /** * Sets the blend mode of a scene item. * diff --git a/src/requesthandler/RequestHandler_Sources.cpp b/src/requesthandler/RequestHandler_Sources.cpp index 53bee7ef..584a4143 100644 --- a/src/requesthandler/RequestHandler_Sources.cpp +++ b/src/requesthandler/RequestHandler_Sources.cpp @@ -312,3 +312,39 @@ RequestResult RequestHandler::SaveSourceScreenshot(const Request& request) return RequestResult::Success(); } + +// Intentionally undocumented +RequestResult RequestHandler::GetSourcePrivateSettings(const Request& request) +{ + RequestStatus::RequestStatus statusCode; + std::string comment; + OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment); + if (!source) + return RequestResult::Error(statusCode, comment); + + OBSDataAutoRelease privateSettings = obs_source_get_private_settings(source); + + json responseData; + responseData["sourceSettings"] = Utils::Json::ObsDataToJson(privateSettings); + + return RequestResult::Success(responseData); +} + +// Intentionally undocumented +RequestResult RequestHandler::SetSourcePrivateSettings(const Request& request) +{ + RequestStatus::RequestStatus statusCode; + std::string comment; + OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment); + if (!source || !request.ValidateObject("sourceSettings", statusCode, comment)) + return RequestResult::Error(statusCode, comment); + + OBSDataAutoRelease privateSettings = obs_source_get_private_settings(source); + + OBSDataAutoRelease newSettings = Utils::Json::JsonToObsData(request.RequestData["sourceSettings"]); + + // Always overlays to prevent destroying internal source data unintentionally + obs_data_apply(privateSettings, newSettings); + + return RequestResult::Success(); +}