Adding basic control and position tracking of played file.
the VLC_RC.playing property is not very accurate right now and possibly switches to false, even if the video isn't finished.
This commit is contained in:
parent
831e06fe0b
commit
ccddd1abcb
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,6 +4,7 @@ logs
|
|||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
|
.vscode/
|
||||||
|
|
||||||
# Runtime data
|
# Runtime data
|
||||||
pids
|
pids
|
||||||
|
149
index.js
149
index.js
@ -1,32 +1,159 @@
|
|||||||
//Get Child Process
|
//Get Child Process
|
||||||
var spawn = require('child_process').spawn;
|
var spawn = require('child_process').spawn;
|
||||||
var VLC_RC = function(options) {
|
|
||||||
|
class VLC_RC {
|
||||||
|
constructor(options) {
|
||||||
this.options = options || {};
|
this.options = options || {};
|
||||||
if(!this.options.hasOwnProperty('verbose')) {
|
this.outData = "";
|
||||||
|
this.commandAnswer = [];
|
||||||
|
this.activeCommand = {callback:undefined};
|
||||||
|
this.commandQueue = []; //{command, callback}
|
||||||
|
this.startTime = undefined;
|
||||||
|
this.passedTime = undefined;
|
||||||
|
this.playing = false;
|
||||||
|
|
||||||
|
/*if(!this.options.hasOwnProperty('verbose')) {
|
||||||
this.options.verbose=false;
|
this.options.verbose=false;
|
||||||
}
|
}
|
||||||
if(!this.options.hasOwnProperty('debug')) {
|
if(!this.options.hasOwnProperty('debug')) {
|
||||||
this.options.debug=false;
|
this.options.debug=false;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
var args = [
|
var args = [
|
||||||
"-I rc", //Remote Control Interface
|
"-I rc", //Remote Control Interface
|
||||||
"--play-and-pause", //Pause at end of Movie
|
"--play-and-pause", //Pause at end of Movie
|
||||||
"--fullscreen" //Start in Fullscreen
|
//"--fullscreen" //Start in Fullscreen
|
||||||
];
|
];
|
||||||
this.vlc_process = spawn('vlc', args);
|
|
||||||
|
this.vlc_process = spawn('cvlc', args);
|
||||||
if(options.verbose) {
|
if(options.verbose) {
|
||||||
console.log("\x1b[37m\x1b[1m","VLC Process created","\x1b[21m");
|
console.log("\x1b[37m\x1b[1m","VLC Process created","\x1b[21m");
|
||||||
console.log("Options:");
|
console.log("Options:");
|
||||||
console.log("\x1b[44m\x1b[37m",this.options,"\x1b[0m");
|
console.log("\x1b[44m\x1b[37m",this.options,"\x1b[0m");
|
||||||
}
|
}
|
||||||
if(options.debug) {
|
if(options.debug) {
|
||||||
this.vlc_process.stdout.pipe(process.stdout);
|
this.debug = true;
|
||||||
this.vlc_process.stderr.pipe(process.stderr);
|
if(options.manual) {
|
||||||
|
process.stdin.on("data", (data)=>{
|
||||||
|
this.vlc_process.stdin.write(data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.debug = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.vlc_process.stdout.on("data", this.onStdOut.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
onStdOut(data) {
|
||||||
|
if(this.debug) process.stdout.write(data);
|
||||||
|
this.outData += data;
|
||||||
|
var line = "";
|
||||||
|
for(let i = 0; i < this.outData.length; i++){
|
||||||
|
if(this.outData[i] == "\n") { //New Line
|
||||||
|
if(line.length <= 0) continue;
|
||||||
|
this.commandAnswer.push(line);
|
||||||
|
line = "";
|
||||||
|
} else {
|
||||||
|
line += this.outData[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VLC_RC.prototype.hello = function() {
|
if(line[0] == ">") { //Neuer Befehr erwartet
|
||||||
//console.log(this.options);
|
if(this.activeCommand){
|
||||||
|
if(this.activeCommand.callback) this.activeCommand.callback(this.commandAnswer.slice(0));
|
||||||
|
this.activeCommand = undefined;
|
||||||
}
|
}
|
||||||
|
this.commandAnswer = [];
|
||||||
|
line = "";
|
||||||
|
this.nextCommand();
|
||||||
|
}
|
||||||
|
this.outData = line;
|
||||||
|
}
|
||||||
|
|
||||||
|
nextCommand(){
|
||||||
|
if(this.activeCommand != undefined) return;
|
||||||
|
if(this.commandQueue.length < 1) return;
|
||||||
|
var c = this.commandQueue[0];
|
||||||
|
this.activeCommand = c;
|
||||||
|
this.vlc_process.stdin.write(c.command + "\n");
|
||||||
|
if(this.debug) process.stdout.write(c.command + "\n");
|
||||||
|
this.commandQueue.splice(0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
runCommand(command, callback){
|
||||||
|
this.commandQueue.push({command:command, callback:callback});
|
||||||
|
this.nextCommand();
|
||||||
|
}
|
||||||
|
|
||||||
|
test() {
|
||||||
|
console.log(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadFile(path, callback) {
|
||||||
|
//ToDo remove all other files
|
||||||
|
this.runCommand("playlist", (data)=>{
|
||||||
|
data.forEach(function(element) {
|
||||||
|
var d = element.replace(/\D/g,'');
|
||||||
|
if(d.length < 1) return;
|
||||||
|
this.runCommand("delete " + d[0]);
|
||||||
|
}, this);
|
||||||
|
this.runCommand("enqueue " + path, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
play(callback) {
|
||||||
|
this.runCommand("play", ()=>{
|
||||||
|
this.playing = true;
|
||||||
|
if(this.passedTime) {
|
||||||
|
this.startTime = new Date().getTime() - this.passedTime();
|
||||||
|
} else {
|
||||||
|
this.startTime = new Date().getTime();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getTime(callback) {
|
||||||
|
this.getOrigTime((data)=>{
|
||||||
|
if(!this.startTime) return data;
|
||||||
|
var dif = new Date().getTime() - this.startTime;
|
||||||
|
var difr = Math.floor(dif/1000);
|
||||||
|
if(difr != data){
|
||||||
|
this.startTime = new Date().getTime() - data*1000;
|
||||||
|
return callback(data);
|
||||||
|
}
|
||||||
|
return callback(dif);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getOrigTime(callback) {
|
||||||
|
this.runCommand("get_time", (data)=>{
|
||||||
|
callback(Number(data));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pause(callback) {
|
||||||
|
this.runCommand("pause", ()=>{
|
||||||
|
this.passedTime = new Date().getTime() - this.startTime;
|
||||||
|
this.startTime = undefined;
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
stop(callback) {
|
||||||
|
this.runCommand("stop", callback);
|
||||||
|
this.startTime = undefined;
|
||||||
|
this.passedTime = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
getState(callback){
|
||||||
|
this.getOrigTime((time)=>{
|
||||||
|
this.runCommand("get_length", (data)=>{
|
||||||
|
if(time >= Number(data[0])) this.playing = false;
|
||||||
|
else this.playing = true;
|
||||||
|
callback(this.playing);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports.VLC_RC = VLC_RC;
|
module.exports.VLC_RC = VLC_RC;
|
||||||
|
|
||||||
|
|
||||||
|
12
package-lock.json
generated
Normal file
12
package-lock.json
generated
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "vlc_rc",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"dependencies": {
|
||||||
|
"another-telnet-client": {
|
||||||
|
"version": "0.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/another-telnet-client/-/another-telnet-client-0.1.3.tgz",
|
||||||
|
"integrity": "sha1-3me4Ehr7R39e0OAlkByyIqoONS0="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,7 +4,8 @@
|
|||||||
"description": "NodeJS Binding for the VLC Media Player remote control",
|
"description": "NodeJS Binding for the VLC Media Player remote control",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "node test.js",
|
||||||
|
"start": "node index.js"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -23,5 +24,8 @@
|
|||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/margau/node_vlc_rc/issues"
|
"url": "https://github.com/margau/node_vlc_rc/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/margau/node_vlc_rc#readme"
|
"homepage": "https://github.com/margau/node_vlc_rc#readme",
|
||||||
|
"dependencies": {
|
||||||
|
"another-telnet-client": "^0.1.3"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user