node-red-contrib-pi-omxplayer
Version:
A Node-RED node to control OMXPlayer on the Raspberry pi
189 lines (178 loc) • 6.62 kB
JavaScript
const omxp = require('omxplayer-controll');
module.exports = function(RED) {
function omxControl(config) {
RED.nodes.createNode(this, config);
var node = this;
node.filename = config.filename;
node.audiooutput = config.audiooutput;
node.blackbackground = config.blackbackground;
node.disablekeys = config.disablekeys;
node.disableosd = config.disableosd;
node.disableghostbox = config.disableghostbox;
node.loop = config.loop;
node.subtitlepath = config.subtitlepath;
var opts = {
'audioOutput': node.audiooutput || 'hdmi',
'blackBackground': node.blackbackground,
'disableKeys': node.disablekeys,
'disableOnScreenDisplay': node.disableosd,
'disableGhostbox': node.disableghostbox,
'loop': node.loop,
'subtitlePath': node.subtitlepath || '',
'startAt': 0,
'startVolume': 0.8,
'closeOtherPlayers': true //Should close other players if necessary
};
node.on('input', msg => {
var filename = node.filename || msg.filename || "";
if (msg.payload == 'open') {
if (filename == ""){
node.warn('No filename provided.');
return;
} else {
omxp.open(filename, opts);
}
}
if (msg.payload == 'playpause') {
omxp.playPause(err => {
if (err){
node.error(err, msg);
} else {
setTimeout(updateStatus, 100);
}
});
}
if (msg.payload == 'pause') {
omxp.pause(err => {
if (err) {
node.error(err, msg);
} else {
setTimeout(updateStatus, 100);
}
});
}
if (msg.payload == 'stop') {
omxp.stop(err => {
if (err) {
node.error(err, msg);
} else {
node.status({fill:"red",shape:"dot",text:"Stopped"});
}
});
}
if (msg.payload == 'volumeup') {
omxp.volumeUp(err => {
if (err) node.error(err, msg);
});
}
if (msg.payload == 'volumedown') {
omxp.volumeDown(err => {
if (err) node.error(err, msg);
});
}
if (msg.payload == 'getduration') {
omxp.getDuration((err, duration) => {
if (duration) {
msg.status = {};
msg.status.duration = duration;
node.send(msg);
} else {
node.error(err);
}
});
}
if (msg.payload == 'getposition') {
omxp.getPosition((err, position) => {
if (position) {
msg.status = {};
msg.status.pos = position;
node.send(msg);
} else {
node.error(err);
}
});
}
if (msg.payload == 'getstatus') {
omxp.getStatus((err, status) => {
if (status) {
msg.status = {};
msg.status.status = status;
node.send(msg);
} else {
node.error(err);
}
});
}
if (msg.payload == 'getvolume') {
omxp.getVolume((err, volume) => {
if (volume) {
msg.status = {};
msg.status.vol = volume;
node.send(msg);
} else {
node.error(err);
}
});
}
if (msg.payload.startsWith('setvolume')) {
var volume = parseFloat(msg.payload.split(' ')[1]);
if (volume > 1) volume = 1;
if (volume < 0) volume = 0;
omxp.setVolume(volume, (err, volume) => {
if (err) node.error(err);
});
}
if (msg.payload.startsWith('setposition')) {
var position = parseInt(msg.payload.split(' ')[1]);
omxp.setPosition(position, err => {
if (err) node.error(err);
});
}
});
function updateStatus() {
omxp.getStatus((err, status) => {
if (status) {
switch (status) {
case 'Playing':
node.status({fill:"green",shape:"dot",text:"Playing"});
break;
case 'Stopped':
node.status({fill:"red",shape:"dot",text:"Stopped"});
break;
case 'Paused':
node.status({fill:"gray",shape:"dot",text:"Paused"});
break;
}
}
});
}
omxp.on('changeStatus', (status) => {
switch (status.status) {
case 'Playing':
node.status({fill:"green",shape:"dot",text:"Playing"});
break;
case 'Stopped':
node.status({fill:"red",shape:"dot",text:"Stopped"});
break;
case 'Paused':
node.status({fill:"gray",shape:"dot",text:"Paused"});
break;
}
var msg = {};
msg.status = status;
node.send(msg);
});
omxp.on('finish', () => {
node.status({fill:"red",shape:"dot",text:"Stopped"});
var msg = {};
msg.status = {};
msg.status.status = 'Stopped';
node.send(msg);
});
node.on('close', () => {
omxp.removeAllListeners('finish');
omxp.removeAllListeners('changeStatus');
});
}
RED.nodes.registerType("rpi-omxplayer", omxControl);
};