node-nicovideo-api
Version:
nicovideo api (video, live, etc..) wrapper package for node.js
308 lines (264 loc) • 8.07 kB
JavaScript
// 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);