UNPKG

node-nicovideo-api

Version:

nicovideo api (video, live, etc..) wrapper package for node.js

308 lines (264 loc) 8.07 kB
// Generated by CoffeeScript 1.10.0 (function() { var Deferred, Emitter, NicoException, NicoLiveAPI, NicoMyListAPI, NicoSession, NicoUrl, NicoUserAPI, NicoVideoAPI, Request, SerializeCookieStore, ToughCookie, cheerio; Emitter = require("event-kit").Emitter; cheerio = require("cheerio"); Request = require("request-promise"); ToughCookie = require("tough-cookie"); SerializeCookieStore = require("tough-cookie-serialize").SerializeCookieStore; Deferred = require("promise-native-deferred"); NicoUrl = require("./NicoURL"); NicoException = require("./NicoException"); NicoLiveAPI = require("./live/NicoLiveApi"); NicoVideoAPI = require("./video/NicoVideoApi"); NicoMyListAPI = require("./mylist/NicoMyListApi"); NicoUserAPI = require("./user/NicoUserAPI"); NicoSession = (function() { NicoSession.services = new WeakMap; /** * @property live * @type NicoLive */ /** * @property video * @type NicoVideo */ /** * @property mylist * @type NicoMyList */ /** * @property sessionId * @type String */ /** * @property cookie * @type request.CookieJar */ function NicoSession() { Object.defineProperties(this, { live: { get: function() { var store; store = NicoSession.services.get(this); store || NicoSession.services.set(this, store = {}); return store.live != null ? store.live : store.live = new NicoLiveAPI(this); } }, video: { get: function() { var store; store = NicoSession.services.get(this); store || NicoSession.services.set(this, store = {}); return store.video != null ? store.video : store.video = new NicoVideoAPI(this); } }, mylist: { get: function() { var store; store = NicoSession.services.get(this); store || NicoSession.services.set(this, store = {}); return store.mylist != null ? store.mylist : store.mylist = new NicoMyListAPI(this); } }, user: { get: function() { var store; store = NicoSession.services.get(this); store || NicoSession.services.set(this, store = {}); return store.user != null ? store.user : store.user = new NicoUserAPI(this); } } }); } /** * 再ログインします。 * @return {Promise} */ NicoSession.prototype.relogin = function(user, password) { return Request.post({ resolveWithFullResponse: true, followAllRedirects: true, url: NicoUrl.Auth.LOGIN, jar: this.cookie, form: { mail_tel: user, password: password } }).then(function(res) { if (res.statusCode === 503) { return Promise.reject("Nicovideo has in maintenance."); } }); }; /** * ログアウトします。 * @method logout * @return {Promise} */ NicoSession.prototype.logout = function() { return Request.post({ resolveWithFullResponse: true, url: NicoUrl.Auth.LOGOUT, jar: this.cookie }).then((function(_this) { return function(res) { if (res.statusCode === 503) { return Promise.reject("Nicovideo has in maintenance."); } }; })(this)); }; /** * セッションが有効であるか調べます。 * @method isActive * @return {Promise} * ネットワークエラー時にrejectされます * - Resolve: (state: Boolean) */ NicoSession.prototype.isActive = function() { return Request.get({ resolveWithFullResponse: true, url: NicoUrl.Auth.LOGINTEST, jar: this.cookie }).then(function(res) { var $err, $res; $res = cheerio(res.body); $err = $res.find("error code"); return Promise.resolve($err.length === 0); }); }; NicoSession.prototype.toJSON = function() { return JSON.parse(this.cookie._jar.store.toString()); }; /** * このインスタンスを破棄します。 * @method dispose */ return NicoSession; })(); module.exports = { /** * @return {Promise} */ fromJSON: function(object, user, password) { var cookie, defer, session, store; if (user == null) { user = null; } if (password == null) { password = null; } defer = new Deferred; store = new SerializeCookieStore(); store.fromString(JSON.stringify(object)); cookie = Request.jar(store); session = new NicoSession; (password != null) && Store.set(session, password); (user != null) && Object.defineProperty(session, "_user", { value: user }); Object.defineProperty(session, "cookie", { value: cookie }); store.findCookie("nicovideo.jp", "/", "user_session", function(err, cookie) { if ((err != null) || (cookie == null)) { return defer.reject(new NicoException({ message: "Cookie 'user_session' not found." })); } session._sessionId = cookie.value; return defer.resolve(session); }); return defer.promise; }, /** * @method restoreFromSessionId * @param {String} sessionId */ fromSessionId: function(sessionId) { var cookieJar, defer, nicoCookie, session, store; defer = new Deferred; session = new NicoSession; store = new SerializeCookieStore; cookieJar = Request.jar(store); nicoCookie = new ToughCookie.Cookie({ key: "user_session", value: sessionId, domain: "nicovideo.jp", path: "/", httpOnly: false }); store.putCookie(nicoCookie, function() { session.sessionId = sessionId; Object.defineProperties(session, { _user: { value: null }, cookie: { value: cookieJar }, sessionId: { configurable: true, value: sessionId } }); return defer.resolve(session); }); return defer.promise; }, /** * ニコニコ動画のログインセッションを確立します。 * @param {String} user ログインユーザーID * @param {String} password ログインパスワード * @return {Promise} */ login: function(user, password) { var cookie; cookie = Request.jar(new SerializeCookieStore); return Request.post({ resolveWithFullResponse: true, followAllRedirects: true, url: NicoUrl.Auth.LOGIN, jar: cookie, form: { mail_tel: user, password: password } }).then((function(_this) { return function(res) { var defer; defer = new Deferred; if (res.statusCode === 503) { defer.reject("Nicovideo has in maintenance."); return; } cookie._jar.store.findCookie("nicovideo.jp", "/", "user_session", function(err, cookie) { if (cookie != null) { defer.resolve(cookie.value); } else if (err != null) { defer.reject("Authorize failed"); } else { defer.reject("Authorize failed (reason unknown)"); } }); return defer.promise; }; })(this)).then(function(sessionId) { var session; session = new NicoSession; session.sessionId = sessionId; Object.defineProperties(session, { cookie: { value: cookie }, sessionId: { configurable: true, value: sessionId } }); return Promise.resolve(session); }); } }; }).call(this);