From 8aa4473cd2e1450f6af6d4af420736596364ee05 Mon Sep 17 00:00:00 2001 From: Dario Ernst Date: Sat, 16 Apr 2016 23:32:33 +0200 Subject: [PATCH] Fix socket connection handling --- server/server.js | 129 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 106 insertions(+), 23 deletions(-) diff --git a/server/server.js b/server/server.js index 34474b8..f465df1 100644 --- a/server/server.js +++ b/server/server.js @@ -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); });