/*
* readitlater.js
* read it later apiをたたく
* API Reffernce : http://readitlaterlist.com/api/docs/
* TODO:sendに対応する
*/
let PLUGIN_INFO =
readitlater
read it later の apiをたたく
0.0.3
3.0
3.0
ninja.tottori
https://github.com/vimpr/vimperator-plugins/raw/master/readitlater.js
で補完にreaditlaterのリストが出てくるので、任意のURLを選択()して実行すると新しいタブにopenします。
open! とbangをつけると既読のみ補完に表示されます。
※初回はキャッシュにデータが入っていないと思うので自分で:ril getしてやる必要があります。
:ril stats
since, list, unread, read の情報がとれます
]]>
;
commands.addUserCommand(['ril','readitlater'], 'read it late plugin',
function(args){
ReadItLater.add(args);
},
{
subCommands: [
new Command(["add"], "Add a page to a user's list",
function (args) {
ReadItLater.add(args);
},{
options : [
[["url","u"],commands.OPTION_STRING,null,
[[ buffer.URL ,"target url"]]
],
[["title","t"],commands.OPTION_STRING,null,
[[ buffer.title ,"title"]]
],
],
}
),
new Command(["get"], "Retrieve a user's reading list",
function (args) {
ReadItLater.get(args);
},{
options : [
//[["num"],commands.OPTION_INT],
//[["read","-r"],commands.OPTION_NOARG],
//[["tags","-t"],commands.OPTION_NOARG],
//[["myAppOnly"],commands.OPTION_NOARG],
],
}
),
new Command(["open"], "Open url in new tab from RIL list.",
function (args) {
ReadItLater.open(args);
},{
bang: true,
options :[],
completer : function(context,args){
let store = storage.newMap("readitlater",{store:true});
context.title = ["url","title"]
context.filters = [CompletionContext.Filter.textDescription]; // titleも補完対象にする
context.completions = (function(){
let links = [];
for(let s in store){
if(!args["bang"]){
if(s[1].state == 0) links.push([s[1].url,s[1].title]); // 既読のみ
}else{
if(s[1].state == 1) links.push([s[1].url,s[1].title]); // 未読のみ
}
}
return links;
})();
},
}
),
new Command(["stats"], "Retrieve information about a user's list",
function (args) {
ReadItLater.stats();
},{}
),
/*
new Command(["test"], "Return stats / current rate limit information about your API key",
function () {
ReadItLater.apiTest();
},{}
),
*/
],
},
true
);
let ReadItLater = {
api_key : (liberator.globalVariables.readitlater_api_key) ? liberator.globalVariables.readitlater_api_key : "966T6ahYgb081icU10d44byL31p5bF20" ,
text : function(){ // {{{
let req = new libly.Request(
"https://text.readitlaterlist.com/v2/text" , // url
null, // headers
{ // options
asynchronous:true,
postBody:getParameterMap(
{
apikey : this.api_key,
url : buffer.URL,
mode : "less",
images : 0,
}
)
}
);
req.addEventListener("onSuccess",function(data){
e(data.responseText)
});
req.addEventListener("onFailure",function(data){
liberator.echoerr(data.statusText);
liberator.echoerr(data.responseText);
});
req.post();
}, // }}}
get : function(args){ // {{{
// document => http://readitlaterlist.com/api/docs#get
let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
let logins = manager.findLogins({},"http://readitlaterlist.com","",null);
let store = storage.newMap("readitlater",{store:true});
let req = new libly.Request(
"https://readitlaterlist.com/v2/get" , // url
null, // headers
{ // options
asynchronous:true,
postBody:getParameterMap(
{
apikey : this.api_key,
username : encodeURIComponent(logins[0].username),
password : encodeURIComponent(logins[0].password),
format : "json",
count : (liberator.globalVariables.readitlater_get_count? liberator.globalVariables.readitlater_get_count : 50 ),
//state : (args["read"]) ? "read" : "unread",
//tags : (args["tags"]) ? 1 : 0,
//myAppOnly : (args["myAppOnly"]) ? 1 : 0,
}
)
}
);
req.addEventListener("onSuccess",function(data){
let res = libly.$U.evalJson(data.responseText);
let cnt = 0;
for (let key in res.list){
store.set(key,res.list[key]);
cnt++;
}
liberator.echo("[ReadItLater] " + cnt + " found.");
store.save();
});
req.addEventListener("onFailure",function(data){
liberator.echoerr(data.statusText);
liberator.echoerr(data.responseText);
});
req.post();
}, // }}}
add : function(args){ // {{{
let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
let logins = manager.findLogins({},"http://readitlaterlist.com","",null);
let req = new libly.Request(
"https://readitlaterlist.com/v2/add" , // url
null, // headers
{ // options
asynchronous:true,
postBody:getParameterMap(
{
apikey : this.api_key,
username : encodeURIComponent(logins[0].username),
password : encodeURIComponent(logins[0].password),
url : encodeURIComponent((args["url"]) ? (args["url"]) : buffer.URL),
title : encodeURIComponent((args["title"]) ? args["title"] : buffer.title),
}
)
}
);
req.addEventListener("onSuccess",function(data){
liberator.echo("[ReadItLater] OK.")
});
req.addEventListener("onFailure",function(data){
liberator.echoerr(data.statusText);
liberator.echoerr(data.responseText);
});
req.post();
}, // }}}
open : function(args){ //{{{
liberator.open(args, liberator.NEW_TAB);
}, // }}}
stats : function(){ // {{{
let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
let logins = manager.findLogins({},"http://readitlaterlist.com","",null);
let req = new libly.Request(
"https://readitlaterlist.com/v2/stats" , // url
null, // headers
{ // options
asynchronous:true,
postBody:getParameterMap(
{
apikey : this.api_key,
username : encodeURIComponent(logins[0].username),
password : encodeURIComponent(logins[0].password),
format : "json",
}
)
}
);
req.addEventListener("onSuccess",function(data){
let res = libly.$U.evalJson(data.responseText);
liberator.echo(
+
#ReadItLater Stats
+
since : {unixtimeToDate(res.user_since)}
list : {res.count_list}
unread : {res.count_unread}
read : {res.count_read}
);
});
req.addEventListener("onFailure",function(data){
liberator.echoerr(data.statusText);
liberator.echoerr(data.responseText);
});
req.post();
}, // }}}
apiTest : function(){ // {{{
let req = new libly.Request(
"https://readitlaterlist.com/v2/api" , // url
null, // headers
{ // options
asynchronous:true,
postBody:getParameterMap(
{
apikey : this.api_key,
}
)
}
);
req.addEventListener("onSuccess",function(data){
liberator.echo(
X-Limit-User-Limit : {data.transport.getResponseHeader("X-Limit-User-Limit")}
X-Limit-User-Remaining : {data.transport.getResponseHeader("X-Limit-User-Remaining")}
X-Limit-User-Reset : {data.transport.getResponseHeader("X-Limit-User-Reset")}
X-Limit-Key-Limit : {data.transport.getResponseHeader("X-Limit-Key-Limit")}
X-Limit-Key-Remaining : {data.transport.getResponseHeader("X-Limit-Key-Remaining")}
X-Limit-Key-Reset : {data.transport.getResponseHeader("X-Limit-Key-Reset")}
);
});
req.addEventListener("onFailure",function(data){
liberator.echoerr(data.statusText);
liberator.echoerr(data.responseText);
});
req.post();
}, // }}}
}
function unixtimeToDate(ut) {
var t = new Date( ut * 1000 );
t.setTime( t.getTime() + (60*60*1000 * 9) ); // +9は日本のタイムゾーン
return t;
}
function getParameterMap(parameters){
let map = "";
for (let key in parameters){
if (map) map += "&";
map += key + "=" + parameters[key];
}
return map
}
// for debug
function e(v,c){
if(c) util.copyToClipboard(v);
liberator.log(v,-1)
}