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 が使えず、致命的なミスをしていることになりますが…