filo_caspar/api/casparcg/client.mjs

109 lines
2.8 KiB
JavaScript

import CasparConnection from 'casparcg-connection'
const CasparCG = CasparConnection.CasparCG
const AMCP = CasparConnection.AMCP
const timeoutDuration = 5000
let io
let logger
let connection
let casparIsPlaying
let casparIsConnected
let currentHost
export function initialise(log, db, socket) {
io = socket.socket
logger = log
db = db
connect(db)
}
export function connect(db) {
currentHost = db.get('settings').value().casparhost
casparIsPlaying = false
casparIsConnected = false
logger.info('CasparCG: Connectiong to', currentHost + ':' + 5250)
connection = new CasparCG({
host: currentHost,
port: 5250,
queueMode: 2,
autoReconnectInterval: timeoutDuration,
onError: err => {
logger.error(err, 'CasparCG: Error')
},
onConnectionStatus: data => {
if (casparIsPlaying) return
casparIsConnected = data.connected
if (!casparIsConnected) {
logger.warn(`CasparCG: connection down, retrying in ${timeoutDuration / 1000} seconds`)
io.emit('casparcg.status', currentStatus())
}
},
onConnected: async connected => {
if (casparIsPlaying) return
logger.info('CasparCG: connected', connected)
if (!casparIsPlaying) {
startPlaying(db).then()
} else {
logger.warn('CasparCG: Stopped from starting play again.')
}
},
})
}
export function currentStatus(e) {
return {
connected: casparIsConnected,
playing: casparIsPlaying,
error: e,
}
}
export async function startPlaying(db) {
let ip = db.get('settings').value().casparplayhost
// Check if we lost connection while attempting to start playing
if (!connection.connected) {
logger.error('CasparCG: Attempted to play but connection was lost')
}
let success = false
try {
// Send a play command
let command = `PLAY 1-100 [HTML] "http://${ip}/client.html" CUT 1 LINEAR RIGHT`
logger.info(`CasparCG Command: ${command}`)
await connection.do(new AMCP.CustomCommand(command))
success = true
} catch (e) {
// Weird error where it throws an error despite a successful play command on reconnect
if (e && e.responseProtocol && e.responseProtocol.code >= 200 && e.responseProtocol.code < 300) {
success = true
} else {
logger.error(e, 'CasparCG: Error starting play on client')
}
}
if (success) {
casparIsPlaying = true
// We are playing, notify all clients
io.emit('casparcg.status', currentStatus())
logger.info('CasparCG: client is up and playing')
/* console.log(connection)
for (var key in connection) {
console.log(key, '=', typeof(connection[key]))
} */
connection.autoConnect = false
// connection.close()
} else {
// Unknown error occured
casparIsPlaying = false
io.emit('casparcg.status', currentStatus(e))
}
}