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*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.vscode/
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
|
175
index.js
175
index.js
@ -1,32 +1,159 @@
|
||||
//Get Child Process
|
||||
var spawn = require('child_process').spawn;
|
||||
var VLC_RC = function(options) {
|
||||
this.options = options || {};
|
||||
if(!this.options.hasOwnProperty('verbose')) {
|
||||
this.options.verbose=false;
|
||||
|
||||
class VLC_RC {
|
||||
constructor(options) {
|
||||
this.options = options || {};
|
||||
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;
|
||||
}
|
||||
if(!this.options.hasOwnProperty('debug')) {
|
||||
this.options.debug=false;
|
||||
}*/
|
||||
|
||||
var args = [
|
||||
"-I rc", //Remote Control Interface
|
||||
"--play-and-pause", //Pause at end of Movie
|
||||
//"--fullscreen" //Start in Fullscreen
|
||||
];
|
||||
|
||||
this.vlc_process = spawn('cvlc', args);
|
||||
if(options.verbose) {
|
||||
console.log("\x1b[37m\x1b[1m","VLC Process created","\x1b[21m");
|
||||
console.log("Options:");
|
||||
console.log("\x1b[44m\x1b[37m",this.options,"\x1b[0m");
|
||||
}
|
||||
if(options.debug) {
|
||||
this.debug = true;
|
||||
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));
|
||||
}
|
||||
if(!this.options.hasOwnProperty('debug')) {
|
||||
this.options.debug=false;
|
||||
|
||||
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];
|
||||
}
|
||||
}
|
||||
if(line[0] == ">") { //Neuer Befehr erwartet
|
||||
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;
|
||||
}
|
||||
var args = [
|
||||
"-I rc", //Remote Control Interface
|
||||
"--play-and-pause", //Pause at end of Movie
|
||||
"--fullscreen" //Start in Fullscreen
|
||||
];
|
||||
this.vlc_process = spawn('vlc', args);
|
||||
if(options.verbose) {
|
||||
console.log("\x1b[37m\x1b[1m","VLC Process created","\x1b[21m");
|
||||
console.log("Options:");
|
||||
console.log("\x1b[44m\x1b[37m",this.options,"\x1b[0m");
|
||||
|
||||
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);
|
||||
}
|
||||
if(options.debug) {
|
||||
this.vlc_process.stdout.pipe(process.stdout);
|
||||
this.vlc_process.stderr.pipe(process.stderr);
|
||||
|
||||
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);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
VLC_RC.prototype.hello = function() {
|
||||
//console.log(this.options);
|
||||
}
|
||||
|
||||
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",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
"test": "node test.js",
|
||||
"start": "node index.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -23,5 +24,8 @@
|
||||
"bugs": {
|
||||
"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