meld-cli/index.js

311 lines
15 KiB
JavaScript
Executable File

#!/usr/bin/env node
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";
const address = process.env.MELD_CLI_HOST || "localhost";
const port = process.env.MELD_CLI_PORT || 13376;
const input = cli.input;
const flags = cli.flags;
var socket = new WebSocket(`ws://${address}:${port}`);
socket.onopen = function() {
let channel;
(() => {
try {
switch (input[0]) {
case "scene":
if (flags.help) {
console.log(sceneHelp);
socket.close();
process.exit(0);
}
const sceneCommand = input[1];
switch (sceneCommand) {
case "list":
channel = new QWebChannel(socket, function (channel) {
sceneList(channel)
.then((scenes) => {
if (scenes.length === 0) {
console.log("No scenes found.");
} else {
console.log("Available scenes:");
scenes.forEach(scene => {
console.log(`- ${scene.name} (ID: ${scene.id})`);
});
}
socket.close();
process.exit(0);
})
.catch((err) => {
console.error(`${err}`);
socket.close();
process.exit(1);
});
});
break;
case "switch":
const sceneName = input[2];
if (!sceneName) {
console.error("Error: Scene name is required for the switch command.");
process.exit(1);
}
channel = new QWebChannel(socket, function (channel) {
sceneSwitch(channel, sceneName)
.then(() => {
socket.close();
process.exit(0);
})
.catch((err) => {
console.error(`${err}`);
socket.close();
process.exit(1);
});
});
break;
case "current":
channel = new QWebChannel(socket, function (channel) {
sceneCurrent(channel)
.then((currentScene) => {
if (currentScene) {
console.log(`Current scene: ${currentScene.name} (ID: ${currentScene.id})`);
} else {
console.log("No current scene found.");
}
socket.close();
process.exit(0);
})
.catch((err) => {
console.error(`${err}`);
socket.close();
process.exit(1);
});
});
break;
default:
console.log(sceneHelp);
socket.close();
process.exit(0);
}
case "audio":
if (flags.help) {
console.log(audioHelp);
socket.close();
process.exit(0);
}
const audioCommand = input[1];
const audioName = input[2];
switch (audioCommand) {
case "mute":
if (!audioName) {
console.error("Error: Audio name is required for the mute command.");
process.exit(1);
}
channel = new QWebChannel(socket, function (channel) {
audioMute(channel, audioName)
.then((message) => {
console.log(message);
socket.close();
process.exit(0);
})
.catch((err) => {
console.error(`${err}`);
socket.close();
process.exit(1);
});
});
break;
case "unmute":
if (!audioName) {
console.error("Error: Audio name is required for the mute command.");
process.exit(1);
}
channel = new QWebChannel(socket, function (channel) {
audioUnmute(channel, audioName)
.then((message) => {
console.log(message);
socket.close();
process.exit(0);
})
.catch((err) => {
console.error(`${err}`);
socket.close();
process.exit(1);
});
});
break;
case "toggle":
channel = new QWebChannel(socket, function (channel) {
audioToggle(channel, audioName)
.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) {
audioStatus(channel, audioName)
.then((status) => {
console.log(`${audioName} is ${status ? "muted" : "unmuted"}`);
socket.close();
process.exit(0);
})
.catch((err) => {
console.error(`Error fetching audio status: ${err}`);
socket.close();
process.exit(1);
});
});
break;
default:
console.log(audioHelp);
socket.close();
process.exit(0);
}
case "stream":
if (flags.help) {
console.log(streamHelp);
socket.close();
process.exit(0);
}
const streamCommand = input[1];
switch (streamCommand) {
case "start":
channel = new QWebChannel(socket, function (channel) {
streamStart(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) {
streamStop(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) {
streamStatus(channel)
.then((isStreaming) => {
console.log(`Streaming is currently ${isStreaming ? "active" : "inactive"}`);
socket.close();
process.exit(0);
})
.catch((err) => {
console.error(`Error fetching stream status: ${err}`);
socket.close();
process.exit(1);
});
});
break;
default:
console.log(streamHelp);
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);
}
})();
};