From 96bd4141fdd4fc4e0c8d06f9c7174dc99a8f863e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Sun, 29 Nov 2020 12:22:21 +0100 Subject: [PATCH 1/2] events: add recordingFilename property to RecordingStarted, RecordingStopping and RecordingStopped --- src/Utils.cpp | 23 +++++++++++++++++++++++ src/Utils.h | 2 ++ src/WSEvents.cpp | 23 +++++++++++++++++++---- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/Utils.cpp b/src/Utils.cpp index cd197519..5140a7ae 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -696,6 +696,29 @@ bool Utils::SetFilenameFormatting(const char* filenameFormatting) { return true; } +const char* Utils::GetCurrentRecordingFilename() +{ + OBSOutputAutoRelease recordingOutput = obs_frontend_get_recording_output(); + if (!recordingOutput) { + return nullptr; + } + + OBSDataAutoRelease settings = obs_output_get_settings(recordingOutput); + + // mimicks the behavior of BasicOutputHandler::GetRecordingFilename : + // try to fetch the path from the "url" property, then try "path" if the first one + // didn't yield any result + OBSDataItemAutoRelease item = obs_data_item_byname(settings, "url"); + if (!item) { + item = obs_data_item_byname(settings, "path"); + if (!item) { + return nullptr; + } + } + + return obs_data_item_get_string(item); +} + // Transform properties copy-pasted from WSRequestHandler_SceneItems.cpp because typedefs can't be extended yet /** diff --git a/src/Utils.h b/src/Utils.h index 0851a8ea..47a19f2d 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -85,6 +85,8 @@ namespace Utils { const char* GetFilenameFormatting(); bool SetFilenameFormatting(const char* filenameFormatting); + const char* GetCurrentRecordingFilename(); + QString nsToTimestamp(uint64_t ns); struct AddSourceData { obs_source_t *source; diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp index ce27798d..80b565f7 100644 --- a/src/WSEvents.cpp +++ b/src/WSEvents.cpp @@ -678,7 +678,10 @@ void WSEvents::OnStreamStopped() { /** * A request to start recording has been issued. - * + * + * Note: `recordingFilename` is not provided in this event because this information + * is not available at the time this event is emitted. + * * @api events * @name RecordingStarting * @category recording @@ -691,37 +694,49 @@ void WSEvents::OnRecordingStarting() { /** * Recording started successfully. * + * @return {String} `recordingFilename` Absolute path to the file of the current recording. + * * @api events * @name RecordingStarted * @category recording * @since 0.3 */ void WSEvents::OnRecordingStarted() { - broadcastUpdate("RecordingStarted"); + OBSDataAutoRelease data = obs_data_create(); + obs_data_set_string(data, "recordingFilename", Utils::GetCurrentRecordingFilename()); + broadcastUpdate("RecordingStarted", data); } /** * A request to stop recording has been issued. * + * @return {String} `recordingFilename` Absolute path to the file of the current recording. + * * @api events * @name RecordingStopping * @category recording * @since 0.3 */ void WSEvents::OnRecordingStopping() { - broadcastUpdate("RecordingStopping"); + OBSDataAutoRelease data = obs_data_create(); + obs_data_set_string(data, "recordingFilename", Utils::GetCurrentRecordingFilename()); + broadcastUpdate("RecordingStopping", data); } /** * Recording stopped successfully. * + * @return {String} `recordingFilename` Absolute path to the file of the current recording. + * * @api events * @name RecordingStopped * @category recording * @since 0.3 */ void WSEvents::OnRecordingStopped() { - broadcastUpdate("RecordingStopped"); + OBSDataAutoRelease data = obs_data_create(); + obs_data_set_string(data, "recordingFilename", Utils::GetCurrentRecordingFilename()); + broadcastUpdate("RecordingStopped", data); } /** From a137ccd8ba2b396940a0066ffcb58b4fafbc35cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Sun, 29 Nov 2020 12:24:49 +0100 Subject: [PATCH 2/2] requests(GetRecordingStatus): add recordingFilename property --- src/WSRequestHandler_Recording.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/WSRequestHandler_Recording.cpp b/src/WSRequestHandler_Recording.cpp index 24aba87a..db0c529d 100644 --- a/src/WSRequestHandler_Recording.cpp +++ b/src/WSRequestHandler_Recording.cpp @@ -21,6 +21,7 @@ RpcResponse ifCanPause(const RpcRequest& request, std::function c * @return {boolean} `isRecording` Current recording status. * @return {boolean} `isRecordingPaused` Whether the recording is paused or not. * @return {String (optional)} `recordTimecode` Time elapsed since recording started (only present if currently recording). + * @return {String (optional)} `recordingFilename` Absolute path to the recording file (only present if currently recording). * * @api requests * @name GetRecordingStatus @@ -37,6 +38,7 @@ RpcResponse WSRequestHandler::GetRecordingStatus(const RpcRequest& request) { if (obs_frontend_recording_active()) { QString recordingTimecode = events->getRecordingTimecode(); obs_data_set_string(data, "recordTimecode", recordingTimecode.toUtf8().constData()); + obs_data_set_string(data, "recordingFilename", Utils::GetCurrentRecordingFilename()); } return request.success(data);