@@ -20,8 +20,10 @@ with this program. If not, see <https://www.gnu.org/licenses/>
2020#include " RequestHandler.h"
2121
2222/* *
23- * Gets an array of all scenes in OBS.
23+ * Gets an array of scenes in OBS.
2424 *
25+ * @requestField ?canvasName | String | Canvas name to get the scenes from. If not specified, the main canvas will be used.
26+ *
2527 * @responseField currentProgramSceneName | String | Current program scene name. Can be `null` if internal state desync
2628 * @responseField currentProgramSceneUuid | String | Current program scene UUID. Can be `null` if internal state desync
2729 * @responseField currentPreviewSceneName | String | Current preview scene name. `null` if not in studio mode
@@ -35,29 +37,53 @@ with this program. If not, see <https://www.gnu.org/licenses/>
3537 * @api requests
3638 * @category scenes
3739 */
38- RequestResult RequestHandler::GetSceneList (const Request &)
40+ RequestResult RequestHandler::GetSceneList (const Request &request )
3941{
4042 json responseData;
41-
42- OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene ();
43- if (currentProgramScene) {
44- responseData[" currentProgramSceneName" ] = obs_source_get_name (currentProgramScene);
45- responseData[" currentProgramSceneUuid" ] = obs_source_get_uuid (currentProgramScene);
43+ RequestStatus::RequestStatus statusCode;
44+ std::string comment;
45+ OBSCanvasAutoRelease canvas = request.ValidateCanvas (" canvasName" , statusCode, comment);
46+ if (statusCode == RequestStatus::ResourceNotFound)
47+ return RequestResult::Error (statusCode, comment);
48+ if (canvas) {
49+ OBSSourceAutoRelease programSource = obs_canvas_get_channel (canvas, 0 );
50+ if (programSource && obs_source_get_type (programSource) == OBS_SOURCE_TYPE_TRANSITION) {
51+ OBSSourceAutoRelease activeSource = obs_transition_get_active_source (programSource);
52+ if (activeSource) {
53+ responseData[" currentProgramSceneName" ] = obs_source_get_name (activeSource);
54+ responseData[" currentProgramSceneUuid" ] = obs_source_get_uuid (activeSource);
55+ } else {
56+ responseData[" currentProgramSceneName" ] = nullptr ;
57+ responseData[" currentProgramSceneUuid" ] = nullptr ;
58+ }
59+ } else if (programSource && obs_source_is_scene (programSource)) {
60+ responseData[" currentProgramSceneName" ] = obs_source_get_name (programSource);
61+ responseData[" currentProgramSceneUuid" ] = obs_source_get_uuid (programSource);
62+ } else {
63+ responseData[" currentProgramSceneName" ] = nullptr ;
64+ responseData[" currentProgramSceneUuid" ] = nullptr ;
65+ }
4666 } else {
47- responseData[" currentProgramSceneName" ] = nullptr ;
48- responseData[" currentProgramSceneUuid" ] = nullptr ;
49- }
67+ OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene ();
68+ if (currentProgramScene) {
69+ responseData[" currentProgramSceneName" ] = obs_source_get_name (currentProgramScene);
70+ responseData[" currentProgramSceneUuid" ] = obs_source_get_uuid (currentProgramScene);
71+ } else {
72+ responseData[" currentProgramSceneName" ] = nullptr ;
73+ responseData[" currentProgramSceneUuid" ] = nullptr ;
74+ }
5075
51- OBSSourceAutoRelease currentPreviewScene = obs_frontend_get_current_preview_scene ();
52- if (currentPreviewScene) {
53- responseData[" currentPreviewSceneName" ] = obs_source_get_name (currentPreviewScene);
54- responseData[" currentPreviewSceneUuid" ] = obs_source_get_uuid (currentPreviewScene);
55- } else {
56- responseData[" currentPreviewSceneName" ] = nullptr ;
57- responseData[" currentPreviewSceneUuid" ] = nullptr ;
76+ OBSSourceAutoRelease currentPreviewScene = obs_frontend_get_current_preview_scene ();
77+ if (currentPreviewScene) {
78+ responseData[" currentPreviewSceneName" ] = obs_source_get_name (currentPreviewScene);
79+ responseData[" currentPreviewSceneUuid" ] = obs_source_get_uuid (currentPreviewScene);
80+ } else {
81+ responseData[" currentPreviewSceneName" ] = nullptr ;
82+ responseData[" currentPreviewSceneUuid" ] = nullptr ;
83+ }
5884 }
5985
60- responseData[" scenes" ] = Utils::Obs::ArrayHelper::GetSceneList ();
86+ responseData[" scenes" ] = Utils::Obs::ArrayHelper::GetSceneList (canvas );
6187
6288 return RequestResult::Success (responseData);
6389}
@@ -76,11 +102,16 @@ RequestResult RequestHandler::GetSceneList(const Request &)
76102 * @api requests
77103 * @category scenes
78104 */
79- RequestResult RequestHandler::GetGroupList (const Request &)
105+ RequestResult RequestHandler::GetGroupList (const Request &request )
80106{
81107 json responseData;
108+ RequestStatus::RequestStatus statusCode;
109+ std::string comment;
110+ OBSCanvasAutoRelease canvas = request.ValidateCanvas (" canvasName" , statusCode, comment);
111+ if (statusCode == RequestStatus::ResourceNotFound)
112+ return RequestResult::Error (statusCode, comment);
82113
83- responseData[" groups" ] = Utils::Obs::ArrayHelper::GetGroupList ();
114+ responseData[" groups" ] = Utils::Obs::ArrayHelper::GetGroupList (canvas );
84115
85116 return RequestResult::Success (responseData);
86117}
0 commit comments