mirror of
https://github.com/onyx-and-iris/meld-cli.git
synced 2025-07-12 02:11:46 +00:00
198 lines
5.0 KiB
JavaScript
198 lines
5.0 KiB
JavaScript
import meowHelp from 'cli-meow-help'
|
|
import Table from 'cli-table3'
|
|
|
|
import { highlight, error } from './style.js'
|
|
|
|
const commands = {
|
|
list: {
|
|
desc: 'List all audio devices'
|
|
},
|
|
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,
|
|
desc: 'Manage audio settings in Meld',
|
|
defaults: false
|
|
})
|
|
|
|
function audioList (channel, showId) {
|
|
if (!channel.objects || !channel.objects.meld) {
|
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
|
}
|
|
|
|
const headers = [{ content: 'Audio Name', hAlign: 'center' }, { content: 'Muted', hAlign: 'center' }]
|
|
if (showId) {
|
|
headers.push({ content: 'ID', hAlign: 'center' })
|
|
}
|
|
const table = new Table({
|
|
style: {
|
|
head: ['none'],
|
|
compact: true
|
|
},
|
|
head: headers
|
|
})
|
|
|
|
const meld = channel.objects.meld
|
|
for (const [key, value] of Object.entries(meld.session.items)) {
|
|
if (value.type === 'track') {
|
|
if (showId) {
|
|
table.push([highlight(value.name), { content: value.muted ? highlight('✓') : '✗', hAlign: 'center' }, highlight(key)])
|
|
} else {
|
|
table.push([highlight(value.name), { content: value.muted ? highlight('✓') : '✗', hAlign: 'center' }])
|
|
}
|
|
}
|
|
}
|
|
|
|
if (table.length === 0) {
|
|
return Promise.resolve('No audio devices found.')
|
|
}
|
|
return Promise.resolve(table)
|
|
}
|
|
|
|
function audioMute (channel, audioName) {
|
|
if (!channel.objects || !channel.objects.meld) {
|
|
return Promise.reject(new Error(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 ${highlight(audioName)} is already muted.`)
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
meld.toggleMute(itemId)
|
|
.then(() => {
|
|
resolve(`Audio track ${highlight(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(`${highlight(audioName)} is ${isMuted ? 'muted' : 'unmuted'}`)
|
|
})
|
|
}
|
|
|
|
export {
|
|
audioHelp,
|
|
audioList,
|
|
audioMute,
|
|
audioUnmute,
|
|
audioToggle,
|
|
audioStatus
|
|
}
|