livedoor Reader で一発で RSS フィードを登録するコマンド (:sub)
極力マウスを使いたくない、ということで色々とハックしているうちの一つです。
:sub URL
でフィードを登録します。RSS の URL でなくても構いません (もちろん RSS の URL でも構いません)。
与えられた URL から RSS フィードを探し、見つかったフィードのうち購読者の多いものを自動的に登録します。購読済みであれば何もしないようになっています。
一応、スペース区切りで複数のサイトを同時に登録することも可能です。
コマンド定義 (インストール方法に関しては下記のキーワードのページを参照してください):
vi.sub = function () { /* TODO: ディレイを付けたい (Or, 複数指定は廃止すべきかも) * TODO: 失敗の時のメッセージ */ Array.from(arguments).forEach(function (url) { (new API("/api/feed/discover")).post({ url: url }, sub); }); message("登録中..."); function sub(list) { if (list.length) { var seen = {}; var uniq = []; list.sort_by("subscribers_count"); list.forEach(function (item) { if (!seen[item.feedlink]) { uniq.push(item); seen[item.feedlink] = true; } }); if (uniq.length && !uniq[0].subscribe_id) { var feedlink = uniq[0].feedlink; feed_subscribe(feedlink, function (res) { feedlink2id[feedlink] = res.subscribe_id; }); } } } };
(IE で利用される場合は上のコードをそのまま id:reinyannyan:20060515:p1 の要領で外部スクリプト内にペーストしてください)
思いついた勢いでろくにテストもせずキーワードの方に書いてしまい、案の定何度も書き直す羽目になってしまいました (ほんとすいません)。さらに、Firefox では一切テストしておりません (重ねてごめんなさい)。
と、いうことで、何か致命的な見落とし等があるかも知れませんので、連絡用としてこのエントリーを設けておく次第です。
追記として:
動作が軽快な、キュー使用バージョンも作ってみました:
vi.sub = function () { /* TODO: 登録完了を待たずに一覧がリロードされてしまう問題があるようです */ var i = 0; var q = new Queue; q.interval = 500; Array.from(arguments).forEach(function (url) { q.push(function () { (new API("/api/feed/discover")).post({ url: url }, function (list) { if (list.length) { var item = list.sort_by("subscribers_count")[0]; if (!item.subscribe_id) { var feedlink = item.feedlink; (new API("/api/feed/subscribe")).post({ feedlink: feedlink }, function (res) { feedlink2id[feedlink] = res.subscribe_id; message(++i + '\u4ef6\u767b\u9332\u3057\u307e\u3057\u305f'); }); } } }); }); }); q.push(function () { subs.update(true); }); q.exec(); message('\u767b\u9332\u4e2d...'); };
特に Firefox ユーザーの方は動作テストをお願いします。
さらに追記:
Function#bind を再定義している Greasemonkey スクリプトを見かけるんですが、ひょっとしてプロトタイプの拡張って Greasemonkey 側では有効にならないんでしょうか? だとすると sort_by が使えず、致命的なミスをしていることになりますが…