diff --git a/src/backend/integrations/builtin/obs/effects/save-replay-buffer.ts b/src/backend/integrations/builtin/obs/effects/save-replay-buffer.ts new file mode 100644 index 000000000..5c0f5efab --- /dev/null +++ b/src/backend/integrations/builtin/obs/effects/save-replay-buffer.ts @@ -0,0 +1,27 @@ +import { EffectType } from "../../../../effects/models/effect-models"; +import { saveReplayBuffer } from "../obs-remote"; + +export const SaveReplayBufferEffectType: EffectType<{}> = { + definition: { + id: "firebot:obs-save-replay-buffer", + name: "Save OBS Replay Buffer", + description: "Tell OBS to save the replay buffer", + icon: "fad fa-redo-alt", + categories: ["common"], + }, + optionsTemplate: ` + +
+ Warning! This will only work if the replay buffer is enabled and active in OBS. +
+
+ `, + optionsController: () => {}, + optionsValidator: () => { + return []; + }, + onTriggerEvent: async () => { + saveReplayBuffer(); + return true; + }, +}; diff --git a/src/backend/integrations/builtin/obs/obs-integration.ts b/src/backend/integrations/builtin/obs/obs-integration.ts index 1b20b40ae..1114d9fdb 100644 --- a/src/backend/integrations/builtin/obs/obs-integration.ts +++ b/src/backend/integrations/builtin/obs/obs-integration.ts @@ -18,6 +18,7 @@ import { StartStreamEffectType } from "./effects/start-stream"; import { StopStreamEffectType } from "./effects/stop-stream"; import { StartVirtualCamEffectType } from "./effects/start-virtual-cam"; import { StopVirtualCamEffectType } from "./effects/stop-virtual-cam"; +import { SaveReplayBufferEffectType } from "./effects/save-replay-buffer"; import { SetOBSSourceTextEffectType } from "./effects/set-obs-source-text"; import { SetOBSBrowserSourceUrlEffectType } from "./effects/set-obs-browser-source-url"; import { SetOBSImageSourceFileEffectType } from "./effects/set-obs-image-source-file"; @@ -98,6 +99,7 @@ class ObsIntegration effectManager.registerEffect(StopStreamEffectType); effectManager.registerEffect(StartVirtualCamEffectType); effectManager.registerEffect(StopVirtualCamEffectType); + effectManager.registerEffect(SaveReplayBufferEffectType); effectManager.registerEffect(SetOBSSourceTextEffectType); effectManager.registerEffect(SetOBSBrowserSourceUrlEffectType); effectManager.registerEffect(SetOBSImageSourceFileEffectType); diff --git a/src/backend/integrations/builtin/obs/obs-remote.ts b/src/backend/integrations/builtin/obs/obs-remote.ts index 31d703ff1..d462756cd 100644 --- a/src/backend/integrations/builtin/obs/obs-remote.ts +++ b/src/backend/integrations/builtin/obs/obs-remote.ts @@ -533,6 +533,16 @@ export async function isRecording(): Promise { return isRunning; } +export async function saveReplayBuffer(): Promise { + try { + await obs.call("SaveReplayBuffer"); + } catch (error) { + logger.error("Failed to save OBS replay buffer", error); + return false; + } + + return true; +}; export type ObsRawResponse = { success: boolean; response?: string; }