nicolive-api
Version:
api client for live.nicovideo.jp
351 lines (292 loc) • 11.5 kB
JavaScript
'use strict';
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 _request = require('request');
var _request2 = _interopRequireDefault(_request);
var _cheerio = require('cheerio');
var _cheerio2 = _interopRequireDefault(_cheerio);
var _querystring = require('querystring');
var _querystring2 = _interopRequireDefault(_querystring);
var _AlertViewer = require('./viewer/AlertViewer');
var _AlertViewer2 = _interopRequireDefault(_AlertViewer);
var _Manager = require('./Manager');
var _Manager2 = _interopRequireDefault(_Manager);
var _Community = require('./Community');
var _Community2 = _interopRequireDefault(_Community);
var _User = require('./User');
var _User2 = _interopRequireDefault(_User);
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 NicoliveAPI = function () {
_createClass(NicoliveAPI, null, [{
key: 'login',
value: function login(_ref) {
var email = _ref.email,
password = _ref.password;
return new Promise(function (resolve, reject) {
_request2.default.post({
url: 'https://secure.nicovideo.jp/secure/login',
form: {
mail_tel: email,
password: password
}
}, function (err, res) {
if (err) reject(err);
var cookies = res.headers['set-cookie'];
var cookie = cookies.find(function (cookie) {
return cookie.indexOf('user_session=user_session') === 0;
}) || '';
var userSession = cookie.slice(0, cookie.indexOf(';') + 1);
if (!userSession) reject('Invalid user');
var client = new NicoliveAPI(userSession);
client.email = email;
client.password = password;
resolve(client);
});
});
}
}]);
function NicoliveAPI(cookie) {
_classCallCheck(this, NicoliveAPI);
this.cookie = cookie;
}
_createClass(NicoliveAPI, [{
key: 'getPostKey',
value: function getPostKey(thread, lastRes) {
var _this = this;
return new Promise(function (resolve, reject) {
var query = _querystring2.default.stringify({
thread: thread,
block_no: Math.floor((parseInt(lastRes) + 1) / 100)
});
(0, _request2.default)({
url: 'http://live.nicovideo.jp/api/getpostkey?' + query,
headers: {
Cookie: _this.cookie
}
}, function (err, res, body) {
if (err) reject(err);
var postKey = body.split('=').pop();
if (postKey === '') reject('fail');
resolve(postKey);
});
});
}
}, {
key: 'getAlertTicket',
value: function getAlertTicket() {
var _this2 = this;
return new Promise(function (resolve, reject) {
_request2.default.post({
url: 'https://secure.nicovideo.jp/secure/login?site=nicolive_antenna',
form: {
mail: _this2.email,
password: _this2.password
}
}, function (err, res, body) {
if (err) reject(err);
var alertTicket = (0, _cheerio2.default)(body);
if (alertTicket['1'].attribs['status'] !== 'ok') reject('fail');
resolve(alertTicket.find('ticket').eq(0).text());
});
});
}
}, {
key: 'getPlayerStatus',
value: function getPlayerStatus(liveId) {
var _this3 = this;
return new Promise(function (resolve, reject) {
(0, _request2.default)({
url: 'http://live.nicovideo.jp/api/getplayerstatus/' + liveId,
headers: {
Cookie: _this3.cookie
}
}, function (err, res, body) {
if (err) reject(err);
var playerStatus = (0, _cheerio2.default)(body);
var errMessage = playerStatus.find('error code').text();
if (errMessage.length) reject(errMessage);
var ms = playerStatus.find('ms');
var stream = playerStatus.find('stream');
var user = playerStatus.find('user');
resolve({
stream: {
title: stream.find('title').eq(0).text(),
description: stream.find('description').eq(0).text(),
default_community: stream.find('default_community').eq(0).text(),
watch_count: stream.find('watch_count').eq(0).text(),
comment_count: stream.find('comment_count').eq(0).text(),
open_time: stream.find('open_time').eq(0).text()
},
ms: {
addr: ms.find('addr').eq(0).text(),
port: ms.find('port').eq(0).text(),
thread: ms.find('thread').eq(0).text()
},
user: {
user_id: user.find('user_id').eq(0).text(),
nickname: user.find('nickname').eq(0).text(),
premium: user.find('is_premium').eq(0).text(),
room_label: user.find('room_label').eq(0).text(),
room_seetno: user.find('room_seetno').eq(0).text()
},
version: '20061206',
res_from: 0,
mail: '184'
});
});
});
}
}, {
key: 'getAlertStatus',
value: function getAlertStatus(ticket) {
return new Promise(function (resolve, reject) {
_request2.default.post({
url: 'http://live.nicovideo.jp/api/getalertstatus',
form: { ticket: ticket }
}, function (err, res, body) {
if (err) reject(err);
var alertStatus = (0, _cheerio2.default)(body);
if (alertStatus['2'].attribs['status'] !== 'ok') reject('fail');
var communities = alertStatus.find('community_id');
var communityIds = [];
for (var i = 0, len = communities.length; i < len; i++) {
var element = (0, _cheerio2.default)(communities[i]);
communityIds.push(element.text());
}
resolve({
user_hash: alertStatus.find('user_hash').eq(0).text(),
addr: alertStatus.find('addr').eq(0).text(),
port: alertStatus.find('port').eq(0).text(),
thread: alertStatus.find('thread').eq(0).text(),
communityIds: communityIds
});
});
});
}
}, {
key: 'getStreamInfo',
value: function getStreamInfo(liveId) {
var _this4 = this;
return new Promise(function (resolve, reject) {
(0, _request2.default)({
url: 'http://live.nicovideo.jp/api/getstreaminfo/lv' + liveId,
headers: {
Cookie: _this4.cookie
}
}, function (err, res, body) {
if (err) reject(err);
var streamInfo = (0, _cheerio2.default)(body);
if (streamInfo['2'].attribs['status'] === 'fail') reject('fail');
resolve({
contentId: 'lv' + liveId,
title: streamInfo.find('title').eq(0).text(),
description: streamInfo.find('description').eq(0).text(),
providerType: streamInfo.find('provider_type').eq(0).text(),
defaultCommunity: streamInfo.find('default_community').eq(0).text(),
name: streamInfo.find('name').eq(0).text(),
thumbnail: streamInfo.find('thumbnail').eq(0).text()
});
});
});
}
}, {
key: 'getCommunityInfo',
value: function getCommunityInfo(communityId) {
var _this5 = this;
return new Promise(function (resolve, reject) {
(0, _request2.default)({
url: 'http://api.ce.nicovideo.jp/api/v1/community.info?id=' + communityId,
headers: {
Cookie: _this5.cookie
}
}, function (err, res, body) {
if (err) reject(err);
var data = (0, _cheerio2.default)(body);
var error = data.find('error');
if (error.length !== 0) {
reject({
code: error.find('code').eq(0).text(),
description: error.find('description').eq(0).text()
});
}
resolve(new _Community2.default({
global_id: data.find('global_id').eq(0).text(),
name: data.find('name').eq(0).text(),
description: data.find('description').eq(0).text(),
level: data.find('level').eq(0).text(),
thumbnail: data.find('thumbnail').eq(0).text()
}));
});
});
}
}, {
key: 'getUserInfo',
value: function getUserInfo(userId) {
return new Promise(function (resolve, reject) {
(0, _request2.default)({
url: 'http://api.ce.nicovideo.jp/api/v1/user.info?user_id=' + userId
}, function (err, res, body) {
if (err) reject(err);
var data = (0, _cheerio2.default)(body);
var error = data.find('error');
if (error.length !== 0) {
reject({
code: error.find('code').eq(0).text(),
description: error.find('description').eq(0).text()
});
}
resolve(new _User2.default({
user_id: data.find('id').eq(0).text(),
nickname: data.find('nickname').eq(0).text(),
thumbnail_url: data.find('thumbnail_url').eq(0).text()
}));
});
});
}
}, {
key: 'connectAlert',
value: function connectAlert() {
var _this6 = this;
return new Promise(function (resolve, reject) {
Promise.resolve().then(function () {
return _this6.getAlertTicket();
}).then(function (ticket) {
return _this6.getAlertStatus(ticket);
}).then(function (status) {
var port = status.port,
addr = status.addr,
thread = status.thread,
communityIds = status.communityIds;
var viewer = new _AlertViewer2.default({ port: port, addr: addr, thread: thread, communityIds: communityIds, cookie: _this6.cookie });
viewer.establish();
resolve(viewer);
}).catch(function (err) {
return reject(err);
});
});
}
}, {
key: 'connectLive',
value: function connectLive(liveId) {
var _this7 = this;
return new Promise(function (resolve, reject) {
Promise.resolve().then(function () {
return _this7.getPlayerStatus(liveId);
}).then(function (playerStatus) {
return new _Manager2.default(playerStatus, _this7.cookie);
}).then(function (manager) {
manager.connectAll().then(function () {
return resolve(manager);
});
}).catch(function (err) {
return reject(err);
});
});
}
}]);
return NicoliveAPI;
}();
exports.default = NicoliveAPI;