/*
* ニコニコ動画のマイリストを何かするプラグイン
* http://twitter.com/ebith
*/
var INFO = xml`
ebith
New BSD License
-
:nicolist-add
:nicolist add mylist-id mylist-comment
mylist-idで指定したマイリストに動画を追加します。マイリストコメントの入力も可能です
-
:nicolist-delete
:nicolist delete mylist-id item-id
mylist-idのみであればマイリストを削除、item-idの指定もあれば動画をマイリストから削除します
-
:nicolist-new
:nicolist new -public name
nameという名前でマイリストを新規作成します。-publicを付けると公開マイリストになります
-
:nicolist-open
:nicolist open mylist-id video-id
mylist-idのみであればマイリストを、video-idの指定もあれば動画を開きます
`;
commands.addUserCommand(
['nicolist'],
'ニコニコ動画のマイリストを操作する',
function(args) {
liberator.echoerr('nicolist : サブコマンドが足りない!');
},
{
subCommands: [
new Command(
['a[dd]'],
'マイリストに追加する',
function (args) {
let video_id = content.window.wrappedJSObject.video_id;
if (!video_id) {
return liberator.echoerr('nicolist : watchページじゃない!');
}
let [mylist_id, description] = args;
if (!description){ description = ''; } //undefinedが入っているとそれをマイリストコメントにしてしまうので。
let token = content.window.wrappedJSObject.so.variables.csrfToken;
let url = 'http://www.nicovideo.jp/api/mylist/add?group_id=' + mylist_id + '&token=' + token + '&item_id=' + video_id + '&description=' + description;
liberator.echo('nicolist add : ' + JSON.parse(util.httpGet(url).responseText).status);
},
{
literal: 1,
completer: mylistCompleter,
}
),
new Command(
['o[pen]'],
'マイリストか動画を開く',
function (args) {
let [mylist_id, video_id] = args;
if (video_id) {
let url = 'http://www.nicovideo.jp/watch/' + video_id;
liberator.open(url, liberator.NEW_TAB);
} else if (mylist_id) {
let url = 'http://www.nicovideo.jp/mylist/' + mylist_id;
liberator.open(url, liberator.NEW_TAB);
}
},
{
literal: 1,
completer: mylistCompleter,
}
),
new Command(
['n[ew]'],
'マイリストを新しく作る',
function (args) {
let token = getToken();
let url = 'http://www.nicovideo.jp/api/mylistgroup/add?name=' + args.literalArg + '&token=' + token;
if ( args['-public'] ) { url += '&public=1'; }
liberator.echo('nicolist new : ' + JSON.parse(util.httpGet(url).responseText).status);
},
{
literal: 0,
options: [ [['-public', '-p'], commands.OPTION_NOARG] ],
}
),
new Command(
['d[elete]'],
'マイリストか動画を削除する',
function (args) {
let token = getToken();
let [mylist_id, item_id] = args;
if (item_id) {
let url = 'http://www.nicovideo.jp/api/mylist/delete?group_id=' + mylist_id + '&id_list[0][]=' + item_id + '&token=' + token;
liberator.echo('nicolist delete : ' + JSON.parse(util.httpGet(url).responseText).status);
} else if (mylist_id) {
let url = 'http://www.nicovideo.jp/api/mylistgroup/delete?group_id=' + mylist_id + '&token=' + token;
liberator.echo('nicolist delete : ' + JSON.parse(util.httpGet(url).responseText).status);
}
},
{
literal: 1,
completer: mylistCompleter,
}
),
]
},
true
);
function mylistCompleter (context, args) {
if (args.completeArg == 0){
context.incomplete = true;
context.title = ["id", "title"];
context.filters = [CompletionContext.Filter.textDescription];
context.compare = void 0;
let url = 'http://www.nicovideo.jp/api/mylistgroup/list';
util.httpGet(url, function (xhr) {
context.incomplete = false;
context.completions = [
[v.id, v.name]
for ([k, v] in Iterator(JSON.parse(xhr.responseText).mylistgroup))
];
});
} else if (args.completeArg == 1 && !/add/.test(context.name)){
context.incomplete = true;
context.title = ["id", "title"];
context.filters = [CompletionContext.Filter.textDescription];
context.compare = void 0;
let url = 'http://www.nicovideo.jp/api/mylist/list?group_id=' + args[0];
util.httpGet(url, function (xhr) {
context.incomplete = false;
if (/open/.test(context.name)) {
context.completions = [
[v.item_data.video_id, v.item_data.title]
for ([k, v] in Iterator(JSON.parse(xhr.responseText).mylistitem.sort(sorter)))
];
} else if (/delete/.test(context.name)) {
context.completions = [
[v.item_id, v.item_data.title]
for ([k, v] in Iterator(JSON.parse(xhr.responseText).mylistitem.sort(sorter)))
];
}
});
}
}
function sorter (a, b) {
return - (a.create_time - b.create_time);
}
function getToken () {
let url = 'http://www.nicovideo.jp/my/mylist';
return util.httpGet(url).responseText.match(/NicoAPI\.token.+/)[0].match(/\d{5}-\d{10}-[\d\w]{40}/)[0];
}
s="o"><VimperatorPlugin>
<name>{NAME}</name>
<description>hatena bottle change notice.</description>
<description lang="ja">はてなボトルの変更通知。</description>
<author mail="suvene@zeromemory.info" homepage="http://zeromemory.sblo.jp/">suVene</author>
<version>0.1.2</version>
<license>MIT</license>
<minVersion>2.0pre</minVersion>
<maxVersion>2.0pre</maxVersion>
<updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/notifier/subject_hatelabo_bottle.js</updateURL>
</VimperatorPlugin>;
//}}}
(function() {
var notifier = liberator.plugins.notifier;
if (!notifier) return;
var libly = notifier.libly;
var $U = libly.$U;
var logger = $U.getLogger('subject_hatelabo_bottle');
var URL = 'http://bottle.hatelabo.jp';
notifier.subject.register(notifier.SubjectHttp, {
interval: 60,
options: {
url: URL,
headers: null,
extra: null
},
parse: function(res) {
// if (this.count == 0) return []; // for debug
var doc = res.getHTMLDocument('id("body")//div[contains(concat(" ", @class, " "), " entry ")]');
return doc;
},
diff: function(cache, parsed)
parsed.filter(function(element)
!cache.some(function(c) c.textContent == element.textContent)),
buildMessages: function(diff) {
return diff.map($U.bind(this, function(d) {
var permalink = $U.getFirstNodeFromXPath('descendant::a[@class="hatena-star-uri"]', d);
if (permalink)
permalink = URL + permalink;
return new notifier.Message('Hatelabo bottle', $U.xmlSerialize(d), permalink)
}));
}
});
})();
// vim: set fdm=marker sw=4 ts=4 sts=0 et: