implement audio commands

This commit is contained in:
onyx-and-iris 2025-06-30 12:28:59 +01:00
parent 660fdc7ffe
commit 19a2bc8448
3 changed files with 241 additions and 2 deletions

View File

@ -2,6 +2,7 @@
import cli from "./utils/cli.js"; import cli from "./utils/cli.js";
import { sceneHelp, sceneList, sceneSwitch, sceneCurrent } from "./utils/scene.js"; import { sceneHelp, sceneList, sceneSwitch, sceneCurrent } from "./utils/scene.js";
import { audioHelp, audioMute, audioUnmute, audioToggle, audioStatus } from "./utils/audio.js";
import { QWebChannel } from "qwebchannel"; import { QWebChannel } from "qwebchannel";
@ -26,8 +27,8 @@ socket.onopen = function() {
process.exit(0); process.exit(0);
} }
const subcommand = input[1]; const sceneCommand = input[1];
switch (subcommand) { switch (sceneCommand) {
case "list": case "list":
channel = new QWebChannel(socket, function (channel) { channel = new QWebChannel(socket, function (channel) {
sceneList(channel) sceneList(channel)
@ -94,6 +95,91 @@ socket.onopen = function() {
socket.close(); socket.close();
process.exit(0); 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);
}
} }
} catch (error) { } catch (error) {
console.error("Error handling CLI flags:", error); console.error("Error handling CLI flags:", error);

150
utils/audio.js Normal file
View File

@ -0,0 +1,150 @@
import meowHelp from "cli-meow-help";
const commands = {
mute: {
desc: "Mute the audio",
},
unmute: {
desc: "Unmute the audio",
},
toggle: {
desc: "Toggle audio mute state",
},
status: {
desc: "Show current audio status",
},
}
const flags = {
help: {
type: "boolean",
shortFlag: "h",
desc: "Display help information"
},
};
const audioHelp = meowHelp({
name: "meld-cli audio",
flags,
commands,
description: "Manage audio settings in Meld",
defaults: false,
});
function audioMute(channel, audioName) {
if (!channel.objects || !channel.objects.meld) {
return Promise.reject(new Error("Meld object not found in channel."));
}
const meld = channel.objects.meld;
let itemId;
let isMuted;
for (const [key, value] of Object.entries(meld.session.items)) {
if (value.type === "track" && value.name === audioName) {
itemId = key;
isMuted = value.muted;
break;
}
}
if (!itemId) {
return Promise.reject(new Error(`No audio device with name ${audioName} found.`));
}
if (isMuted) {
return Promise.resolve(`Audio track ${audioName} is already muted.`);
}
return new Promise((resolve, reject) => {
meld.toggleMute(itemId)
.then(() => {
resolve(`Audio track ${audioName} has been muted.`);
})
.catch((err) => {
reject(new Error(`Error muting audio track: ${err}`));
});
})
}
function audioUnmute(channel, audioName) {
if (!channel.objects || !channel.objects.meld) {
return Promise.reject(new Error("Meld object not found in channel."));
}
const meld = channel.objects.meld;
let itemId;
let isMuted;
for (const [key, value] of Object.entries(meld.session.items)) {
if (value.type === "track" && value.name === audioName) {
itemId = key;
isMuted = value.muted;
break;
}
}
if (!itemId) {
return Promise.reject(new Error("No audio track found."));
}
if (!isMuted) {
return Promise.resolve(`Audio track ${audioName} is already unmuted.`);
}
return new Promise((resolve, reject) => {
meld.toggleMute(itemId)
.then(() => {
resolve(`Audio track ${audioName} has been unmuted.`);
})
.catch((err) => {
reject(new Error(`Error unmuting audio track: ${err}`));
});
});
}
function audioToggle(channel, audioName) {
if (!channel.objects || !channel.objects.meld) {
return Promise.reject(new Error("Meld object not found in channel."));
}
const meld = channel.objects.meld;
let itemId;
let isMuted;
for (const [key, value] of Object.entries(meld.session.items)) {
if (value.type === "track" && value.name === audioName) {
itemId = key;
isMuted = value.muted;
break;
}
}
if (!itemId) {
return Promise.reject(new Error(`No audio device with name ${audioName} found.`));
}
return new Promise((resolve, reject) => {
meld.toggleMute(itemId)
.then(() => {
const status = isMuted ? "unmuted" : "muted";
resolve(`Audio track ${audioName} has been ${status}.`);
})
.catch((err) => {
reject(new Error(`Error toggling audio track: ${err}`));
});
});
}
function audioStatus(channel, audioName) {
if (!channel.objects || !channel.objects.meld) {
return Promise.reject(new Error("Meld object not found in channel."));
}
const meld = channel.objects.meld;
let itemId;
let isMuted;
for (const [key, value] of Object.entries(meld.session.items)) {
if (value.type === "track" && value.name === audioName) {
itemId = key;
isMuted = value.muted;
break;
}
}
if (!itemId) {
return Promise.reject(new Error(`No audio device with name ${audioName} found.`));
}
return new Promise((resolve, reject) => {
resolve(isMuted);
});
}
export { audioHelp, audioMute, audioUnmute, audioToggle, audioStatus }

View File

@ -5,6 +5,9 @@ const commands = {
scene: { scene: {
desc: "Manage scenes", desc: "Manage scenes",
}, },
audio: {
desc: "Manage audio settings",
},
}; };
const flags = { const flags = {