From f9ec415ea4c4a2543a2aa84ed367edbb05acc4c2 Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Mon, 30 Jun 2025 12:57:11 +0100 Subject: [PATCH] implement record commands --- index.js | 61 ++++++++++++++++++++++++++++++++++++ utils/cli.js | 3 ++ utils/record.js | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 utils/record.js diff --git a/index.js b/index.js index b5b9019..b731928 100755 --- a/index.js +++ b/index.js @@ -4,6 +4,7 @@ import cli from "./utils/cli.js"; import { sceneHelp, sceneList, sceneSwitch, sceneCurrent } from "./utils/scene.js"; import { audioHelp, audioMute, audioUnmute, audioToggle, audioStatus } from "./utils/audio.js"; import { streamHelp, streamStart, streamStop, streamStatus } from "./utils/stream.js"; +import { recordHelp, recordStart, recordStop, recordStatus } from "./utils/record.js"; import { QWebChannel } from "qwebchannel"; @@ -241,6 +242,66 @@ socket.onopen = function() { socket.close(); process.exit(0); } + + case "record": + if (flags.help) { + console.log(recordHelp); + socket.close(); + process.exit(0); + } + + const recordCommand = input[1]; + switch (recordCommand) { + case "start": + channel = new QWebChannel(socket, function (channel) { + recordStart(channel) + .then((message) => { + console.log(message); + socket.close(); + process.exit(0); + }) + .catch((err) => { + console.error(`${err}`); + socket.close(); + process.exit(1); + }); + }); + break; + case "stop": + channel = new QWebChannel(socket, function (channel) { + recordStop(channel) + .then((message) => { + console.log(message); + socket.close(); + process.exit(0); + }) + .catch((err) => { + console.error(`${err}`); + socket.close(); + process.exit(1); + }); + }); + break; + case "status": + channel = new QWebChannel(socket, function (channel) { + recordStatus(channel) + .then((isRecording) => { + console.log(`Recording is currently ${isRecording ? "active" : "inactive"}`); + socket.close(); + process.exit(0); + }) + .catch((err) => { + console.error(`Error fetching recording status: ${err}`); + socket.close(); + process.exit(1); + }); + }); + break; + default: + console.log(recordHelp); + socket.close(); + process.exit(0); + } } } catch (error) { console.error("Error handling CLI flags:", error); diff --git a/utils/cli.js b/utils/cli.js index c6025e5..964b65d 100644 --- a/utils/cli.js +++ b/utils/cli.js @@ -11,6 +11,9 @@ const commands = { stream: { desc: "Manage streaming", }, + record: { + desc: "Manage recording", + }, }; const flags = { diff --git a/utils/record.js b/utils/record.js new file mode 100644 index 0000000..491e54b --- /dev/null +++ b/utils/record.js @@ -0,0 +1,82 @@ +import meowHelp from "cli-meow-help"; + +const commands = { + start: { + desc: "Start streaming", + }, + stop: { + desc: "Stop streaming", + }, + status: { + desc: "Show the current streaming status", + }, +}; + +const flags = { + help: { + type: "boolean", + shortFlag: "h", + desc: "Display help information", + }, +}; + +const recordHelp = meowHelp({ + name: "meld-cli record", + flags, + commands, + description: "Manage recording in Meld", + defaults: false, +}); + +function recordStart(channel) { + if (!channel.objects || !channel.objects.meld) { + return Promise.reject(new Error("Meld object not found in channel.")); + } + + const meld = channel.objects.meld; + if (meld.isRecording) { + return Promise.reject(new Error("Recording is already active.")); + } + + return new Promise((resolve, reject) => { + meld.toggleRecord() + .then(() => { + resolve("Recording started successfully."); + }) + .catch((err) => { + reject(err); + }); + }); +} + +function recordStop(channel) { + if (!channel.objects || !channel.objects.meld) { + return Promise.reject(new Error("Meld object not found in channel.")); + } + + const meld = channel.objects.meld; + if (!meld.isRecording) { + return Promise.reject(new Error("Recording is not currently active.")); + } + + return new Promise((resolve, reject) => { + meld.toggleRecord() + .then(() => { + resolve("Recording stopped successfully."); + }) + .catch((err) => { + reject(err); + }); + }); +} + +function recordStatus(channel) { + if (!channel.objects || !channel.objects.meld) { + return Promise.reject(new Error("Meld object not found in channel.")); + } + + const meld = channel.objects.meld; + return Promise.resolve(meld.isRecording); +} + +export { recordHelp, recordStart, recordStop, recordStatus }; \ No newline at end of file