mirror of
https://github.com/onyx-and-iris/meld-cli.git
synced 2025-07-12 10:21:45 +00:00
implement audio commands
This commit is contained in:
parent
660fdc7ffe
commit
19a2bc8448
90
index.js
90
index.js
@ -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
150
utils/audio.js
Normal 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 }
|
@ -5,6 +5,9 @@ const commands = {
|
|||||||
scene: {
|
scene: {
|
||||||
desc: "Manage scenes",
|
desc: "Manage scenes",
|
||||||
},
|
},
|
||||||
|
audio: {
|
||||||
|
desc: "Manage audio settings",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const flags = {
|
const flags = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user