Skip to content

Commit

Permalink
Add support for triggering server groups
Browse files Browse the repository at this point in the history
Signed-off-by: Axel Boberg <[email protected]>
  • Loading branch information
axelboberg committed Jan 13, 2024
1 parent 5954aee commit 6cb4e48
Showing 1 changed file with 64 additions and 25 deletions.
89 changes: 64 additions & 25 deletions plugins/caspar/lib/handlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,39 +15,39 @@ const Logger = require('../../../lib/Logger')
const logger = new Logger({ name: 'CasparPlugin' })

const PLAY_HANDLERS = {
'bridge.caspar.clear': item => {
return commands.sendCommand(item?.data?.caspar?.server, 'clear', item?.data?.caspar)
'bridge.caspar.clear': (serverId, item) => {
return commands.sendCommand(serverId, 'clear', item?.data?.caspar)
},
'bridge.caspar.amcp': item => {
return commands.sendString(item?.data?.caspar?.server, item?.data?.caspar?.amcp)
'bridge.caspar.amcp': (serverId, item) => {
return commands.sendString(serverId, item?.data?.caspar?.amcp)
},
'bridge.caspar.media': async item => {
await commands.sendCommand(item?.data?.caspar?.server, 'loadbg', item?.data?.caspar?.target, item?.data?.caspar?.loop, 0, undefined, undefined, undefined, item?.data?.caspar)
return commands.sendCommand(item?.data?.caspar?.server, 'playLoaded', '', item?.data?.caspar)
'bridge.caspar.media': async (serverId, item) => {
await commands.sendCommand(serverId, 'loadbg', item?.data?.caspar?.target, item?.data?.caspar?.loop, 0, undefined, undefined, undefined, item?.data?.caspar)
return commands.sendCommand(serverId, 'playLoaded', '', item?.data?.caspar)
},
'bridge.caspar.template': item => {
return commands.sendCommand(item?.data?.caspar?.server, 'cgAdd', item?.data?.caspar?.target, item?.data?.caspar?.templateData, true, item?.data?.caspar)
'bridge.caspar.template': (serverId, item) => {
return commands.sendCommand(serverId, 'cgAdd', item?.data?.caspar?.target, item?.data?.caspar?.templateData, true, item?.data?.caspar)
},
'bridge.caspar.template.update': item => {
return commands.sendCommand(item?.data?.caspar?.server, 'cgUpdate', item?.data?.caspar?.templateData, item?.data?.caspar)
'bridge.caspar.template.update': (serverId, item) => {
return commands.sendCommand(serverId, 'cgUpdate', item?.data?.caspar?.templateData, item?.data?.caspar)
},
'bridge.caspar.opacity': item => {
return commands.sendCommand(item?.data?.caspar?.server, 'mixerOpacity', item?.data?.caspar?.opacity, item?.data?.caspar)
'bridge.caspar.opacity': (serverId, item) => {
return commands.sendCommand(serverId, 'mixerOpacity', item?.data?.caspar?.opacity, item?.data?.caspar)
}
}

const STOP_HANDLERS = {
'bridge.caspar.media': item => {
return commands.sendCommand(item?.data?.caspar?.server, 'stop', item?.data?.caspar)
'bridge.caspar.media': (serverId, item) => {
return commands.sendCommand(serverId, 'stop', item?.data?.caspar)
},
'bridge.caspar.template': item => {
return commands.sendCommand(item?.data?.caspar?.server, 'cgStop', item?.data?.caspar)
'bridge.caspar.template': (serverId, item) => {
return commands.sendCommand(serverId, 'cgStop', item?.data?.caspar)
},
'bridge.caspar.template.update': item => {
return commands.sendCommand(item?.data?.caspar?.server, 'cgStop', item?.data?.caspar)
'bridge.caspar.template.update': (serverId, item) => {
return commands.sendCommand(serverId, 'cgStop', item?.data?.caspar)
},
'bridge.caspar.opacity': item => {
return commands.sendCommand(item?.data?.caspar?.server, 'mixerOpacity', '1.0', { ...(item?.data?.caspar || {}), transitionDuration: 0 })
'bridge.caspar.opacity': (serverId, item) => {
return commands.sendCommand(serverId, 'mixerOpacity', '1.0', { ...(item?.data?.caspar || {}), transitionDuration: 0 })
}
}

Expand All @@ -64,6 +64,17 @@ async function checkIsLive () {
return true
}

/**
* Get an array of server descriptors for a group
* @param { String } groupId
* @returns { Promise.<import('./commands').ServerDescription[]> }
*/
async function getServersByGroup (groupId = '') {
const index = groupId.split(':')[1]
const servers = await commands.listServers()
return servers.filter(server => server?.group === index)
}

/*
Register a listener for the item.play event and
call the matching handler for the item type
Expand All @@ -73,8 +84,22 @@ bridge.events.on('item.play', async item => {
return
}

PLAY_HANDLERS[item.type]?.(item)
.catch(err => logger.warn(err.message))
/*
Look up the server id to check if it's a group,
in that case play the item for all servers
in that group
*/
const servers = await getServersByGroup(item?.data?.caspar?.server)

if (servers.length > 0) {
for (const server of servers) {
PLAY_HANDLERS[item.type]?.(server?.id, item)
.catch(err => logger.warn(err.message))
}
} else {
PLAY_HANDLERS[item.type]?.(item?.data?.caspar?.server, item)
.catch(err => logger.warn(err.message))
}
})

/*
Expand All @@ -86,6 +111,20 @@ bridge.events.on('item.stop', async item => {
return
}

STOP_HANDLERS[item.type]?.(item)
.catch(err => logger.warn(err.message))
/*
Look up the server id to check if it's a group,
in that case stop the item for all servers
in that group
*/
const servers = await getServersByGroup(item?.data?.caspar?.server)

if (servers.length > 0) {
for (const server of servers) {
STOP_HANDLERS[item.type]?.(server?.id, item)
.catch(err => logger.warn(err.message))
}
} else {
STOP_HANDLERS[item.type]?.(item?.data?.caspar?.server, item)
.catch(err => logger.warn(err.message))
}
})

0 comments on commit 6cb4e48

Please sign in to comment.