ccddd1abcb
the VLC_RC.playing property is not very accurate right now and possibly switches to false, even if the video isn't finished.
159 lines
3.9 KiB
JavaScript
Executable File
159 lines
3.9 KiB
JavaScript
Executable File
//Get Child Process
|
|
var spawn = require('child_process').spawn;
|
|
|
|
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));
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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; |