Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

livedoor Reader の、ピンの状態をローカルマシンに保存する greasemonkey スクリプト

5 月 12 日付追記。
本家 livedoor Reader のほうで、ピンの状態をサーバに保存できるようになった(livedoor Reader 開発日誌:ピンの保存、OPMLインポートの改善、Notifierのバージョンアップ - livedoor Blog(ブログ))ので、このスクリプトは役目を終えました。LDR 開発陣のみなさま GJ!!!

livedoor Reader の大きな特徴のひとつである、ピンをつかって記事をまとめ読みする機能は激烈に便利です。しかし、いまのところピンの状態をサーバに保存することができない(参考:livedoor Readerでできないこと - livedoor Reader まとめサイト - livedoor Wiki(ウィキ))ので、ちょっと不都合な面があるのも事実。
たとえば、誤ってブラウザのタブを閉じたり、リロードしたり、はたまたブラウザがクラッシュしたりすると、せっかく留めておいたピンが消えてしまって、残念な思いをすることがあります。また、フィードを流し読みしながらとりあえずピンを留めまくったけど、気づいたらそれらのピンで留めたエントリをタブに開いて読む暇はなく、パソコンの電源を落としてでかけないとならない、どうしよう。。。と困っちゃうこともあります(参考:(遊): livedoor Reader で、最も優先度が高かったろう課題)。
そこで、とりあえずサーバに保存云々が実現されるまでは、こちらでできることはこちらでどうにかしてみようってんで、以下の graasemonkey スクリプトにより、ピンの状態をローカルに読み書きするようにしてみました。例によっていきあたりばったりな感じですが……。
ついでに LDR tips を一個。画面上方の、ピンのアイコンとともに、留められたピンの数が表示されている部分を shift キーを押しながらクリックすると、新しいウィンドウに、いまピンで留められているエントリがリストされたりします。とりあえずピン留めとけ!つって、ものすごーくたくさんピンをとめまくるひとには、ピンを一気に開くより、リストを開いてそこから取捨選択する流れがいいのかもしれません。
インストール: ldr_save_pins.user.js

// ==UserScript==
// @name          LDR Pin Saver
// @description   Save pins into local storage.
// @namespace     http://antipop.gs/ns/greasemonkey/ldr_save_pins
// @include       http://reader.livedoor.com/reader/*
// ==/UserScript==

(function(){
     var w = unsafeWindow;
     var _onload = w.onload;
     var onload  = function(){
         with (w) {

             var pins = JSON.parse(GM_getValue('pins'));
             if (pins instanceof Array && pins.length) {
                 pins.forEach(function (i) {
                                              pin.add(unescape(i.url), unescape(i.title));
                                          });
             }

             var update_view = pin.update_view;
             pin.update_view = function () {
                 GM_setValue('pins', serialize_pins(this.pins));
                 update_view.apply(this, arguments);
             }

             function serialize_pins (pins) {
                 var ret = '[';
                 pins.forEach(function (i) {
                                  ret += '{title:"' + escape(i.title) + '", url:"' + escape(i.url) + '"},';
                              });
                 return ret + ']';
             }
         }
     };

     w.onload = function(){
         _onload();
         onload();
     };
})();