diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 05528676..e07b099c 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -91,6 +91,7 @@ const QHash WSRequestHandler::messageMap { { "ToggleMute", &WSRequestHandler::ToggleMute }, { "SetMute", &WSRequestHandler::SetMute }, { "GetMute", &WSRequestHandler::GetMute }, + { "SetSourceName", &WSRequestHandler::SetSourceName }, { "SetSyncOffset", &WSRequestHandler::SetSyncOffset }, { "GetSyncOffset", &WSRequestHandler::GetSyncOffset }, { "GetSpecialSources", &WSRequestHandler::GetSpecialSources }, diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index e5f6e173..3ff9576b 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -108,6 +108,7 @@ class WSRequestHandler { RpcResponse ToggleMute(const RpcRequest&); RpcResponse SetMute(const RpcRequest&); RpcResponse GetMute(const RpcRequest&); + RpcResponse SetSourceName(const RpcRequest&); RpcResponse SetSyncOffset(const RpcRequest&); RpcResponse GetSyncOffset(const RpcRequest&); RpcResponse GetSpecialSources(const RpcRequest&); diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index c5d1cf9f..3a224205 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -341,6 +341,46 @@ RpcResponse WSRequestHandler::ToggleMute(const RpcRequest& request) return request.success(); } +/** +* Sets (aka rename) the name of a source. Also works with scenes since scenes are technically sources in OBS. +* +* Note: If the new name already exists as a source, OBS will automatically modify the name to not interfere. +* +* @param {String} `sourceName` Source name. +* @param {String} `newName` New source name. +* +* @api requests +* @name SetSourceName +* @category sources +* @since 4.8.0 +*/ +RpcResponse WSRequestHandler::SetSourceName(const RpcRequest& request) +{ + if (!request.hasField("sourceName") || !request.hasField("newName")) { + return request.failed("missing request parameters"); + } + + QString sourceName = obs_data_get_string(request.parameters(), "sourceName"); + QString newName = obs_data_get_string(request.parameters(), "newName"); + if (sourceName.isEmpty() || newName.isEmpty()) { + return request.failed("invalid request parameters"); + } + + OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); + if (!source) { + return request.failed("specified source doesn't exist"); + } + + OBSSourceAutoRelease existingSource = obs_get_source_by_name(newName.toUtf8()); + if (!existingSource) { // OBS is supposed to automatically rename colliding source names, but it doesn't. So this gets to be the solution for now. + obs_source_set_name(source, newName.toUtf8()); + + return request.success(); + } else { + return request.failed("a source with that newSourceName already exists"); + } +} + /** * Set the audio sync offset of a specified source. *