2008年8月アーカイブ

2008y08m24d_124508304.jpg

Greasemonkeyスクリプトから@requireで呼び出せるライブラリ第2弾。

これは何?

ニコニコ動画のFlashプレーヤーをGreasemonkeyスクリプトから操作するためのライブラリです。

@requireで読み込むだけで、以下のような各種操作が可能になります。

  • 動画情報の取得(再生時間、コメント取得用URL、フィルター情報、など)
  • 動画読み込み完了後の関数実行
  • 通常のFlashプレーヤーとProxomitron(オミトロン)を自動的に判別(違いを気にしないで済む)
  • 再生操作(再生、一時停止、停止)
  • シーク操作
  • ボリューム調整(ミュート含む)
  • リピート ON/OFF
  • コメント表示 ON/OFF
  • 全画面表示 ON/OFF

2008y08m23d_170601562.jpg

これはなに?

あなたの開発したGreasemonkeyスクリプト(ぐりもん)に、簡単に自動更新機能を付けるためのライブラリです。

Greasemonkey-0.8以降で使える@requireで読み込んで、呼び出しスクリプトを記述するだけで冒頭のイメージのように自動更新機能を付けることができます。

背景

Greasemonkeyには、個別のスクリプトの更新を確認する手段がありませんでした。そのため、Greasemonkeyスクリプトの作者は自信のブログ等でアップデートしたことを広報して、再インストールを促すことでしか新しいものを広めることができませんでした。

そこで、各スクリプトが自分自身のバージョンをダウンロード元に確認しにいって、更新があれば利用ユーザに通知する機能を提供するライブラリを作りました

さらに、Greasemonkey-0.8で実装された@require機能を利用して、もっと簡単に組み込むことができるように改良しています。

jQuery 1.2.6が公開されから2ヶ月ほどたちましたが、使っていていくつか気になった部分があるのでメモとして残しておきます。 原因とか対策とかご存じの方、教えてください。

jQuery.makeArray

1129-1143行目

  makeArray: function( array ) {
    var ret = [];

    if( array != null ){
      var i = array.length;
      //the window, strings and functions also have 'length'
      if( i == null || array.split || array.setInterval || array.call )
        ret[0] = array;
      else
        while( i )
          ret[--i] = array[i];
    }

    return ret;
  },

Arrayオブジェクトかどうかを判定するために、lengthプロパティの有無を調べているのですが、windowオブジェクトや、String、Functionにもlengthプロパティがあるということで、それぞれを判定しています。

その中で、「array.call」での判定が失敗することがあり、twitterでつぶやいてみると、

@noriaki なんか古いscriptaculousのeffect.jsだとArray.prototype.callを定義してるんだけど、関係無さげ?http://tinyurl.com/6de2mj

@noriaki なんか古いscriptaculousのeffect.jsだとArray.prototype.callを定義してるんだけど、関係無さげ?http://tinyurl.com/6de2mj

という話が出てきて、まさしくその通りでした。

というわけで、以下のように暫定的に対応したものを独自に使ってます。

--- jquery-1.2.6.org.js  Sat Aug 09 15:40:15 2008
+++ jquery-1.2.6.js    Sat Aug 09 15:39:57 2008
@@ -1132,7 +1132,7 @@
     if( array != null ){
       var i = array.length;
       //the window, strings and functions also have 'length'
-      if( i == null || array.split || array.setInterval || array.call )
+      if( i == null || array.split || array.setInterval || array.apply )
         ret[0] = array;
       else
         while( i )

一応、他のところへの影響はなさそうですが、ご利用になる際は十分注意してください。

ってか、よく考えたらjQuery.isFunction(array)使ったらいいんじゃないのかな!(笑)

jQuery.map

よくつかう$.mapにも気になるコードがあります。

1205-1218行目

  map: function( elems, callback ) {
    var ret = [];

    // Go through the array, translating each of the items to their
    // new value (or values).
    for ( var i = 0, length = elems.length; i < length; i++ ) {
      var value = callback( elems[ i ], i );

      if ( value != null )
        ret[ ret.length ] = value;
    }

    return ret.concat.apply( [], ret );
  }

この最後にある、return ret.concat.apply( [], ret );はなにを意図してこうなっているんでしょうか。新しい配列にmapした結果の配列を連結して返しています。

でも、以下のコードを実行した場合、期待しているものとは違った結果が返ってきてしまいます。

$.map([1,2,3], function(value, index) {
  return [index, value];
}); //=> [1,1,2,2,3,3]
// [[1,1],[2,2],[3,3]]を期待していた

さてさて、どうしたものでしょうか。 単純に、return val;とかにしちゃっていいのかな・・

追記(2008-08-17T14:30:00+09:00):上記のように変更してみたところ、通常の$('p.myclass')といったセレクタ処理がうまくいかなくなってしまいました・・

2008y08m08d_013024640.jpg

Heat the Nicovideo Upの最新版を公開しました。バージョンは0.3.8です。

今回のアップデートはバグフィックスです。0.3.7で追加した機能の影響で、Firefox3の環境でカラーバー右側のボタンが見えなくなっていました。今回のアップデートで直っています。

すでにインストール済みの方は自動更新が働きますので、お待ちください。 (1日待っても自動更新されない場合は、お手数ですが再インストールをお願いします)

インストールや更新履歴などは以下のページからどうぞ。 (うまくインストールできない場合は、[ツール]→[プライバシー情報の消去]でキャッシュを削除して再度お試しください)

ニコニコ動画のコメント熱狂度を可視化するGreasemonkeyスクリプト

2008y08m03d_133205776.jpg

Heat the Nicovideo Upの最新版を公開しました。バージョンは0.3.7です。

このバージョンでは、先日のエントリのコメントでご要望をいただいた、プレーヤー全画面表示の際、カラーバーをシークバーに合わせて伸縮させる機能を復活させました。

おまけとして、上の画像に見えている「全画面表示を視聴専用にする」チェックボックスを付けました。これがチェックされているときに、プレーヤーを全画面表示にすると、「コメント欄」「ヘッダ部分」を非表示にして、視聴画面を大きく表示します。

※注)時報のときにどんな挙動をするか未確認です。

すでにインストール済みの方は自動更新が働きますので、お待ちください。 (1日待っても働かない場合は、お手数ですが再インストールをお願いします)

ダウンロードや更新履歴などは以下のページからどうぞ。

ニコニコ動画のコメント熱狂度を可視化するGreasemonkeyスクリプト

ご意見・ご感想、欲しい機能などがありましたら、コメントやトラックバックでお気軽にどうぞ。次回アップデート時の参考とさせていただきます。

カテゴリ

  • サービス

あわせてなかのひとのはてな

あわせて読みたい
この日記のはてなブックマーク数
OpenID対応しています OpenIDについて

このアーカイブについて

このページには、2008年8月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年7月です。

次のアーカイブは2008年9月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。