|
|
|
|
@ -2,10 +2,19 @@ var restify = require('restify');
|
|
|
|
|
var bunyan = require('bunyan');
|
|
|
|
|
var Q = require("q");
|
|
|
|
|
var FS = require("q-io/fs");
|
|
|
|
|
const net = require('net');
|
|
|
|
|
|
|
|
|
|
String.prototype.format = function() {
|
|
|
|
|
var formatted = this;
|
|
|
|
|
for (var i = 0; i < arguments.length; i++) {
|
|
|
|
|
var regexp = new RegExp('\\{'+i+'\\}', 'gi');
|
|
|
|
|
formatted = formatted.replace(regexp, arguments[i]);
|
|
|
|
|
}
|
|
|
|
|
return formatted;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// CONNECTIONS AND STUFF
|
|
|
|
|
var fifoPath = '/home/daddel9/.mpv-fifo';
|
|
|
|
|
// CONNECTIONS AND STUF
|
|
|
|
|
var socketPath = '/home/daddel9/.mpv-sock';
|
|
|
|
|
var log = bunyan.createLogger({name: 'MpvRemote'});
|
|
|
|
|
|
|
|
|
|
// SETUP
|
|
|
|
|
@ -19,34 +28,108 @@ server.get(/\/client\/?.*/, restify.serveStatic({
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Mockup Methods
|
|
|
|
|
// /seek/:time — seeks relative
|
|
|
|
|
// /seek/:time/:mode — seeks with mode, modes [relative|absolute|absolute-percent|relative-percent|exact|keyframes]
|
|
|
|
|
// /seek-chapter/:where — seeks to prev (where=-x) or next (where=+x) chapter
|
|
|
|
|
// Cödê
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
global.mpvdata = [];
|
|
|
|
|
global.mpvsocket = null;
|
|
|
|
|
global.mpvisConnected = false;
|
|
|
|
|
global.mpvconnect = function() {
|
|
|
|
|
defer = Q.defer();
|
|
|
|
|
|
|
|
|
|
log.info("socket is {0} isConnected is {1}".format(global.mpvsocket, global.mpvisConnected));
|
|
|
|
|
if(global.mpvisConnected) {
|
|
|
|
|
defer.resolve(global.mpvsocket);
|
|
|
|
|
return defer.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sock = net.connect(socketPath);
|
|
|
|
|
|
|
|
|
|
sock.on("connect", function() {
|
|
|
|
|
log.info("socket had connect event");
|
|
|
|
|
global.mpvsocket = sock;
|
|
|
|
|
global.mpvisConnected=true;
|
|
|
|
|
defer.resolve(sock)
|
|
|
|
|
});
|
|
|
|
|
sock.on("error", function(err) {
|
|
|
|
|
global.mpvisConnected=false;
|
|
|
|
|
defer.reject(err)
|
|
|
|
|
});
|
|
|
|
|
sock.on("end", function() {
|
|
|
|
|
global.mpvisConnected=false;
|
|
|
|
|
defer.reject(new Error("socket ended"))
|
|
|
|
|
});
|
|
|
|
|
sock.on("data", function(dta) {
|
|
|
|
|
log.info("had data '{0}'".format(dta));
|
|
|
|
|
global.mpvdata.push(dta)
|
|
|
|
|
});
|
|
|
|
|
return defer.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function buildCommand(cmd, params) {
|
|
|
|
|
paramsStr="";
|
|
|
|
|
params.forEach(function(val, idx, arr) {
|
|
|
|
|
paramsStr = paramsStr+', "{0}"'.format(val);
|
|
|
|
|
})
|
|
|
|
|
ret = '{ "command": [ "{0}"{1} ] }\n'.format(cmd, paramsStr);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function writeCommand(cmd, params) {
|
|
|
|
|
defer = Q.defer();
|
|
|
|
|
global.mpvconnect()
|
|
|
|
|
.then( function(sock) {
|
|
|
|
|
log.info("can write in "+sock);
|
|
|
|
|
try {
|
|
|
|
|
cmdStr = buildCommand(cmd, params);
|
|
|
|
|
log.info("trying to write cmd '{0}' to sock".format(cmdStr));
|
|
|
|
|
sock.write(cmdStr);
|
|
|
|
|
defer.resolve();
|
|
|
|
|
} catch(e) {
|
|
|
|
|
log.error("got error "+e);
|
|
|
|
|
defer.reject(e);
|
|
|
|
|
}
|
|
|
|
|
}, function(reason) {
|
|
|
|
|
defer.reject(reason);
|
|
|
|
|
});
|
|
|
|
|
return defer.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// /seekTime/:time — seeks relative
|
|
|
|
|
// /seekPercent/:percent — seeks percent absolute
|
|
|
|
|
// /seekChapter/:where — seeks to prev (where=-x) or next (where=+x) chapter
|
|
|
|
|
// /volume/:amount — increases (amount=+x) or decreases (amount=-x) volume
|
|
|
|
|
// /progress — show osd progress
|
|
|
|
|
// /playpause — toggles playing
|
|
|
|
|
// /muteunmute — toggles muting
|
|
|
|
|
|
|
|
|
|
// server.get('/seek/:time', function (req, res, next) {
|
|
|
|
|
// log.info("Seeking "+req.params['time']+" now.");
|
|
|
|
|
// return FS.write( fifoPath, '{ "command": ["seek", "10"] }\n' )
|
|
|
|
|
// .then(function () {
|
|
|
|
|
// log.info("wrote seek 10 to "+fifoPath);
|
|
|
|
|
// res.send({'success':true});
|
|
|
|
|
// return next(false);
|
|
|
|
|
// }, function(reason) {
|
|
|
|
|
// log.info("failed because "+reason);
|
|
|
|
|
// });
|
|
|
|
|
// log.info("after then");
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
server.get('/seek/:time/:mode', function (req, res, next) {
|
|
|
|
|
log.info("Seeking "+req.params['time']+" with mode "+req.params['mode']+" now.");
|
|
|
|
|
res.send({'success':true});
|
|
|
|
|
return;
|
|
|
|
|
server.get('/seek/:time', function (req, res, next) {
|
|
|
|
|
log.info("seek "+req.params.time);
|
|
|
|
|
writeCommand("seek", [req.params.time])
|
|
|
|
|
.then(function() {
|
|
|
|
|
res.send({"success":true});
|
|
|
|
|
return next(false);
|
|
|
|
|
}, function(reason) {
|
|
|
|
|
res.send({"success":false, "reason": reason});
|
|
|
|
|
return next(false);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
server.get('/volume/:amount', function (req, res, next) {
|
|
|
|
|
log.info("volume "+req.params.amount);
|
|
|
|
|
writeCommand("", [req.params.amount])
|
|
|
|
|
.then(function() {
|
|
|
|
|
res.send({"success":true});
|
|
|
|
|
return next(false);
|
|
|
|
|
}, function(reason) {
|
|
|
|
|
res.send({"success":false, "reason": reason});
|
|
|
|
|
return next(false);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
server.listen(8080, function() {
|
|
|
|
|
console.log('%s listening at %s', server.name, server.url);
|
|
|
|
|
});
|
|
|
|
|
|