From c3bd7ad4e5a136616fe30edfc028bd31ae870630 Mon Sep 17 00:00:00 2001 From: Lordmau5 Date: Tue, 11 Aug 2026 11:13:48 +0200 Subject: [PATCH] Add `obsPreviousSceneName` variable --- .../integrations/builtin/obs/obs-integration.ts | 2 ++ .../integrations/builtin/obs/obs-remote.ts | 8 ++++++++ .../builtin/obs/variables/previous-scene-name.ts | 15 +++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 src/backend/integrations/builtin/obs/variables/previous-scene-name.ts diff --git a/src/backend/integrations/builtin/obs/obs-integration.ts b/src/backend/integrations/builtin/obs/obs-integration.ts index 19a2265af..6b78cf5a7 100644 --- a/src/backend/integrations/builtin/obs/obs-integration.ts +++ b/src/backend/integrations/builtin/obs/obs-integration.ts @@ -44,6 +44,7 @@ import GroupNameEventFilter from "./filters/group-name-filter"; import SceneNameEventFilter from "./filters/scene-name-filter"; import { SceneNameVariable } from "./variables/scene-name-variable"; +import { PreviousSceneNameVariable } from "./variables/previous-scene-name"; import { SceneCollectionNameVariable } from "./variables/scene-collection-name"; import { IsConnectedVariable } from "./variables/is-connected"; import { IsStreamingVariable } from "./variables/is-streaming"; @@ -169,6 +170,7 @@ class ObsIntegration FilterManager.registerFilter(SceneNameEventFilter); ReplaceVariableManager.registerReplaceVariable(SceneNameVariable); + ReplaceVariableManager.registerReplaceVariable(PreviousSceneNameVariable); ReplaceVariableManager.registerReplaceVariable(SceneCollectionNameVariable); ReplaceVariableManager.registerReplaceVariable(IsConnectedVariable); ReplaceVariableManager.registerReplaceVariable(IsStreamingVariable); diff --git a/src/backend/integrations/builtin/obs/obs-remote.ts b/src/backend/integrations/builtin/obs/obs-remote.ts index a5aa6ae36..adcd51e0f 100644 --- a/src/backend/integrations/builtin/obs/obs-remote.ts +++ b/src/backend/integrations/builtin/obs/obs-remote.ts @@ -61,6 +61,8 @@ let groupInfos: Array = []; let previewSceneName: string | null; // The cached program scene name. let programSceneName: string; +// The cached previous program scene name. +let previousProgramSceneName: string; const TEXT_SOURCE_IDS = ["text_gdiplus_v2", "text_gdiplus_v3", "text_ft2_source_v2"]; @@ -179,6 +181,8 @@ async function setupRemoteListeners() { }); obs.on("SceneTransitionStarted", async ({ transitionName }) => { + previousProgramSceneName = programSceneName || ""; + programSceneName = (await obs.call("GetCurrentProgramScene"))?.sceneName || ""; eventManager?.triggerEvent( OBS_EVENT_SOURCE_ID, @@ -663,6 +667,10 @@ export function getCurrentSceneName(): string { return programSceneName; } +export function getPreviousSceneName(): string { + return previousProgramSceneName; +} + export async function setCurrentScene(sceneName: string): Promise { if (!connected) { return; diff --git a/src/backend/integrations/builtin/obs/variables/previous-scene-name.ts b/src/backend/integrations/builtin/obs/variables/previous-scene-name.ts new file mode 100644 index 000000000..160304e89 --- /dev/null +++ b/src/backend/integrations/builtin/obs/variables/previous-scene-name.ts @@ -0,0 +1,15 @@ +import { ReplaceVariable } from "../../../../../types/variables"; +import { getPreviousSceneName } from "../obs-remote"; + +export const PreviousSceneNameVariable: ReplaceVariable = { + definition: { + handle: "obsPreviousSceneName", + description: + "The name of the previous OBS scene. If OBS isn't running, it returns 'Unknown'.", + possibleDataOutput: ["text"], + categories: ["advanced", "integrations", "obs"] + }, + evaluator: () => { + return getPreviousSceneName() ?? "Unknown"; + } +};