微妙に新しくなったtumblrでReblogCommandを動くようにするためのパッチ

追記 2008.6.2

ReblogCommandの最新版はcodereposからインストールすることができます。

訂正 2008.4.13

reblogCommandのコード、間違ってたみたいです。修正してます。Tombloo0.1.6で動作確認済。

Tombloo 0.1.3、LDR + Tombloo – 実用でGreasemonkeyからTomblooの機能が利用できるようになっているので、それを使ってrelbogするようにするためのReblogCommandのパッチです。Tomblooの機能に依存しているのでTomblooがないと動かなくなります。

Tomblooにもパッチが必要です。Tomblooは extensions/tombloo/chrome/content/browser.xulgetReblogToken TUMBLR_URL を付け足すだけです。

--- browser.xul 2008-04-12 11:17:16.000000000 +0900
+++ browser.mine.xul    2008-04-12 16:24:51.000000000 +0900
@@ -40,7 +40,7 @@
                        GM_Tombloo.Tombloo.Service = update({}, env.Tombloo.Service,
                                'check share posters extracters'.split(' '));
                        GM_Tombloo.Tumblr = update({}, env.Tumblr,
-                               'post remove getInfo read reblog openTab getLoggedInUser'.split(' '));
+                               'post remove getInfo read reblog openTab getLoggedInUser getReblogToken TUMBLR_URL'.split(' '));
                        GM_Tombloo.FFFFOUND = update({}, env.FFFFOUND,
                                'post remove iLoveThis'.split(' '));
                        GM_Tombloo.Flickr = update({}, env.Flickr,

ReblogCommandのパッチは以下。パッチ済みのファイルをreblogcommand.user.jsに置いておきます。

あ、あと消すためのコマンドも入れました。でもバグっててピンをつけたのと違うやつが消えるっぽいので使わないでください!

pinned-or-current-link|deletePost

で消せます。

Tomblooのreblogメソッドで帰ってくるのがMochiKitのDeferredインスタンスなのですが、それをJsDeferredのDefferedListで扱う必要があるのでトリッキーなことをしています。こういうもともと繋がらないのをなんとかして繋げるの好きだなー。

--- reblogcommand.orig.js  2008-04-12 16:12:20.000000000 +0900
+++ reblogcommand.user.js  2008-04-13 11:15:38.000000000 +0900
@@ -86,26 +86,41 @@
 }
 
 function reblog(aURL){
-  var id  = getIDByPermalink(aURL);
-  var d;
-  with(D()){
-    d = Deferred();
-    if(!id) {
-      wait(0).next(function(){d.call()});
-      return d;
-    }
-  }
-  var url = getURLByID(id);
-  window.Minibuffer.status('ReblogCommand'+id, 'Reblog ...');
-  getSource(url).
-  next(function(res){
-    return postData(url, createPostData( parseParams( convertToHTMLDocument(res.responseText))));
-  }).
-  next(function(){ window.Minibuffer.status('ReblogCommand'+id, 'Reblog ... done.', 100); d.call()}).
-  error(function(){
-    if(confirm('reblog manually ? \n' + url)) reblogManually(aURL);
-    d.call();
+  return invokeTumblrMethod(
+    aURL, 'reblog', {
+      start:  'Reblog ...',
+      done:  'Reblog ... done.',
+      manual:  'reblog manually ? ',
+    }
+  );
+}
+
+function deletePost(aURL){
+console.log("deletePost", aURL);
+  return invokeTumblrMethod(
+    aURL, 'remove', {
+      start:  'Deleting ...',
+      done:  'Deleting ... done.',
+      manual:  'delete manually ? ',
+    }
+  );
+}
+
+function invokeTumblrMethod(aURL, methodName, msg) {
+console.log("invokeTumblrMethod", aURL);
+try {
+  window.Minibuffer.status('ReblogCommand'+aURL, msg.start);
+
+  var d = GM_Tombloo.Tumblr[methodName]( aURL ).addCallback ( function (res){
+    window.Minibuffer.status('ReblogCommand'+aURL, msg.done, 100);
+  }).addErrback( function(){
+    if(confirm( msg.manual + '\n' + url)) reblogManually(aURL);
+    d.callback();
   });
+console.log("invokeTumblrMethod", aURL, d);
+}catch(e) {
+  console.log(e);
+}
   return d;
 }
 
@@ -155,9 +171,8 @@
     window.Minibuffer.execute(target_cmd + ' | reblog -m' + clear_pin );
   }});
 
-window.Minibuffer.addCommand({
-  name: 'reblog',
-  command: function(stdin){
+
+var tumblrCommand = function(stdin, method, manualMethod){
     var args = this.args;
     var urls = [];
     if(!stdin.length){
@@ -175,23 +190,46 @@
     // reblog
     if(args.length = 1 && args[0] == '-m'){
       urls.forEach(function(aURL){
-        reblogManually(aURL);
+        manualMethod && manualMethod(aURL);
       });
     }else if(args.length){
       console.log('unknown args...');
     }else{
       urls = urls.filter(isTumblrUserURL);
       if(!urls.length) return stdin;
-      var lst = urls.map(reblog);
+      var lst = urls.map(method);
       if(lst.length > 1){
+        // JSDeferred/MochiKit Deferred compatibility hack.
+      var jsdl = {};
+      for ( var i = 0; i < lst.length; i++ ) {
+        var d = lst[i];
+        jsdl["jsd" + i] = d;
+        d.next = d.addCallback;
+        d.error = d.addErrback;
+      }
+
         with(D()){
-          parallel(lst).wait(2).
-          next(function(){window.Minibuffer.status('ReblogCommand','Everything is OK', 1000)});
+          var d = parallel(jsdl).wait(2).
+          next(function(){
+            window.Minibuffer.status('ReblogCommand','Everything is OK', 1000)
+        });
         }
       }
     }
     return stdin;
   }
+
+window.Minibuffer.addCommand({
+  name: 'reblog',
+  command: function (stdin) { return tumblrCommand.apply(this,[ stdin, reblog, reblogManually] ) }
 });
 
+window.Minibuffer.addCommand({
+  name: 'deletePost',
+  command: function (stdin) { return tumblrCommand.apply(this, [stdin, deletePost, null]) }
+});
+
+
 })()
+
+

About this entry