gopro-js
Version:
A Promise based JavaScript GoPro Controller/API Wrapper (Unofficial)
247 lines (210 loc) • 8.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _axios = require('axios');
var _axios2 = _interopRequireDefault(_axios);
var _macAddress = require('mac-address');
var _macAddress2 = _interopRequireDefault(_macAddress);
var _GpControlValues = require('./GpControlValues');
var _GpControlValues2 = _interopRequireDefault(_GpControlValues);
var _utils = require('./utils');
var _errors = require('./errors');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var EMPTY = 'empty';
var RETRIES = 10;
var RETRY_DELAY = 200;
var dgram = void 0;
try {
dgram = require('dgram');
} catch (_) {
dgram = EMPTY; // Browser does not support dgram
}
var GpControlAPI = function () {
function GpControlAPI() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
ip = _ref.ip,
mac = _ref.mac;
_classCallCheck(this, GpControlAPI);
this.ip = ip || '10.5.5.9';
this._bufferMac(mac);
}
_createClass(GpControlAPI, [{
key: 'discover',
value: function discover() {
var _this = this;
return this.request().then(function (_ref2) {
var info = _ref2.info;
return {
model: info.model_name,
mac: _this._bufferMac(info.ap_mac)
};
});
}
}, {
key: 'request',
value: function request() {
var _this2 = this;
var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref3$port = _ref3.port,
port = _ref3$port === undefined ? '' : _ref3$port,
_ref3$endpoint = _ref3.endpoint,
endpoint = _ref3$endpoint === undefined ? 'gpControl' : _ref3$endpoint,
_ref3$busyCheck = _ref3.busyCheck,
busyCheck = _ref3$busyCheck === undefined ? true : _ref3$busyCheck,
_ref3$retries = _ref3.retries,
retries = _ref3$retries === undefined ? RETRIES : _ref3$retries;
var url = 'http://' + this.ip + (0, _utils.prefixedStr)(port, ':') + '/gp/' + endpoint + (0, _utils.prefixedStr)(path, '/');
var promise = function promise() {
return _axios2.default.get(url, { timeout: 5000 }).catch(function () {
return new _errors.NotFoundError();
}).then(function (r) {
return r.data;
});
};
var retry = function retry() {
return _this2.request(path, { endpoint: endpoint, port: port, retries: retries - 1, busyCheck: busyCheck });
};
if (!busyCheck) return promise();else if (retries === 0) return new _errors.PromiseError('Camera is Busy.');else return this.status('System.BUSY').then(function (busy) {
return busy ? _this2.delay(RETRY_DELAY).then(retry).then(promise) : promise();
});
}
}, {
key: '_command',
value: function _command(path, options) {
return this.request('command' + (0, _utils.prefixedStr)(path, '/'), options);
}
}, {
key: 'delay',
value: function delay(t) {
return new Promise(function (resolve) {
return setTimeout(resolve, t);
});
}
}, {
key: 'status',
value: function status(path) {
return this.request('status', { busyCheck: false }).then(function (s) {
if (!path) return Promise.resolve(s);
var _valueFinder = (0, _utils.valueFinder)(_GpControlValues2.default, 'Status.' + path),
value = _valueFinder.value;
value = value && s.status[value];
if (value !== undefined) return Promise.resolve(value);else return new _errors.PromiseError('Invalid \'Status.' + path + '\'');
});
}
}, {
key: 'mode',
value: function mode(_mode, submode) {
var m = (0, _utils.valueFinder)(_GpControlValues2.default, 'Mode.' + _mode).value;
if (m !== undefined && !submode) return this._command('mode?p=' + m);
var s = (0, _utils.valueFinder)(_GpControlValues2.default, 'Mode.' + _mode + '.SubMode.' + submode).value;
if ((m && s) !== undefined) return this._command('sub_mode?mode=' + m + '&sub_mode=' + (s || 0));
return new _errors.PromiseError('Invalid \'Mode.' + _mode + '\' or \'Mode.' + _mode + '.SubMode.' + submode + '\'');
}
}, {
key: 'set',
value: function set(path) {
var fullPath = 'Mode.' + path;
var _valueFinder2 = (0, _utils.valueFinder)(_GpControlValues2.default, fullPath),
value = _valueFinder2.value,
setting = _valueFinder2.setting;
if ((value && setting) !== undefined) return this.request('setting/' + setting + '/' + value);else return new _errors.PromiseError('Invalid setting \'' + fullPath + '\'');
}
}, {
key: 'shutter',
value: function shutter() {
var _this3 = this;
var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var duration = arguments[1];
var click = function click() {
var on = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
return _this3._command('shutter?p=' + (on ? 1 : 0), { busyCheck: false });
};
var start = function start() {
return delay > 0 ? _this3.delay(delay).then(click) : click();
};
if (!duration) return start();else return start().then(function () {
return _this3.delay(duration);
}).then(function () {
return click(false);
});
}
}, {
key: 'powerOff',
value: function powerOff() {
return this._command('system/sleep');
}
}, {
key: 'listMedia',
value: function listMedia() {
return this.request('', { endpoint: 'gpMediaList', port: 8080 });
}
}, {
key: 'deleteLast',
value: function deleteLast() {
var _this4 = this;
var files = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
var promise = Promise.resolve();
for (var i = 0; i < files; i += 1) {
promise = promise.then(function () {
return _this4._command('storage/delete/last');
});
}
return promise;
}
}, {
key: 'deleteFile',
value: function deleteFile(folder, file) {
return this._command('storage/delete?p=' + folder + '/' + file);
}
}, {
key: 'deleteAll',
value: function deleteAll() {
return this._command('storage/delete/all');
}
}, {
key: '_bufferMac',
value: function _bufferMac(macAddress) {
if (macAddress instanceof Buffer && macAddress.length === _macAddress2.default.LENGTH) this.mac = macAddress;else if (macAddress instanceof Array) {
this.mac = macAddress.length === _macAddress2.default.LENGTH && Buffer.from(macAddress);
} else if (macAddress) {
this.mac = _macAddress2.default.toBuffer(macAddress.replace(/^(..)(..)(..)(..)(..)(..)$/, '$1:$2:$3:$4:$5:$6'));
}
return this.mac;
}
}, {
key: 'powerOn',
value: function powerOn() {
var _this5 = this;
if (dgram === EMPTY) return new _errors.PromiseError('powerOn not supported on browser yet.');else if (!this.mac) return new _errors.PromiseError('Invalid MAC Address.');
return Promise.resolve().then(function () {
var _ref4 = [new Buffer(102), _this5.mac.length],
message = _ref4[0],
size = _ref4[1];
for (var i = 0; i < 6; i += 1) {
message[i] = 0xff;
}for (var j = 0; j < 16; j += 1) {
var c = 6 + j * size;
for (var k = 0; k < size; k += 1) {
message[c + k] = _this5.mac[k];
}
}
var socket = dgram.createSocket('udp4');
var send = function send(port) {
var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
return socket.close();
};
return socket.send(message, 0, message.length, port, _this5.ip, callback);
};
send(9, function () {
return send(7);
});
});
}
}]);
return GpControlAPI;
}();
exports.default = GpControlAPI;