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 STUF var socketPath = '/home/daddel9/.mpv-sock'; var log = bunyan.createLogger({name: 'MpvRemote'}); // SETUP var server = restify.createServer(); server.pre(restify.pre.sanitizePath()); // Serve static files server.get(/\/client\/?.*/, restify.serveStatic({ directory: __dirname })); // 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("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("add", ["volume", req.params.amount]) .then(function() { res.send({"success":true}); return next(false); }, function(reason) { res.send({"success":false, "reason": reason}); return next(false); }); }); server.get('/playpause', function (req, res, next) { log.info("playpause "); writeCommand("cycle", ["pause"]) .then(function() { res.send({"success":true}); return next(false); }, function(reason) { res.send({"success":false, "reason": reason}); return next(false); }); }); server.get('/muteunmute', function (req, res, next) { log.info("muteunmute "); writeCommand("cycle", ["mute"]) .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); });