UNPKG

nicolive-api

Version:
351 lines (292 loc) 11.5 kB
'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;