: O. Yuanying

Youtube Encoder を Macで使えるように修正してみた

Youtube Encoder という Firefox の拡張が、 Windowsにしか対応してないのを残念に思ったので、 Mac版の Firefox でも動くようにしてみたよ。

以下の解説は ver. 3.4 の Youtube Encoder を Macに対応させる手順っぽい。

  1. ダウンロードと解凍
  2. ソースの修正
    • ffmpeg.exe を入れ替える
    • コード中の OS依存 部分を修正する
      • パスセパレータ
      • ファイル名の文字コード
    • Mac版 Firefox におけるバグ(Bug 322865) の回避
  3. パッケージングとインストール

ダウンロードと解凍

Firefox実験場 Youtube Encoder」 から youtubeencoder.xpi をダウンロードする。

ダウンロードしたら適当なフォルダを作り、そこに移動した後解凍する。

xpiって言っても単なるzip圧縮なので、拡張子をzipに変えてから好きなアンアーカイバで解凍してもよし。

$ mkdir youtubeencoder
$ mv youtubeencoder.xpi youtubeencoder/
$ cd youtubeencoder/
$ unzip youtubeencoder.xpi

ソースその他が解凍されるのでそれをいじる。

ソースの修正

chrome/content/youtubeencoder/ffmpeg.exe を Macで動くバイナリに置き換える。

私は iSquint のパッケージに入ってる ffmpeg をコピーした。

$ cp /Applications/iSquint.app/Contents/Resources/ffmpeg chrome/content/youtubeencoder/

その後、コード中の OS 依存部分を修正する。

コード中の OS依存 部分を修正する


--- a/chrome/content/youtubeencoder/moviepage.js
+++ b/chrome/content/youtubeencoder/moviepage.js
@@ -112,7 +112,7 @@ MoviePage.prototype = {
                // input:  nsIFile
                // output: nsIFile
                // encodeTo: String
-               var path = youtubeencoder.getCurrentPath() + "\\ffmpeg.exe";
+               var path = youtubeencoder.getCurrentPath() + "/ffmpeg";
                var ffmpeg = null;
                var ffmpegFile = Components.classes['@mozilla.org/file/local;1']
                                                                .createInstance( Components.interfaces.nsILocalFile );
@@ -134,9 +134,9 @@ MoviePage.prototype = {
                var outputPath = output.QueryInterface(Components.interfaces.nsILocalFile).path;
 
                //convert utf-16 -> Shift_JIS
-               UConv.charset = 'Shift_JIS';
-               var inputPath = UConv.ConvertFromUnicode(inputPath);
-               var outputPath = UConv.ConvertFromUnicode(outputPath);
+               // UConv.charset = 'Shift_JIS';
+               // var inputPath = UConv.ConvertFromUnicode(inputPath);
+               // var outputPath = UConv.ConvertFromUnicode(outputPath);
 
                var args = new Array("-i", inputPath);
                
diff --git a/chrome/content/youtubeencoder/youtubeencoder.js b/chrome/content/youtubeencoder/youtubeencoder.js
index 7f65feb..9c819ba 100644
--- a/chrome/content/youtubeencoder/youtubeencoder.js
+++ b/chrome/content/youtubeencoder/youtubeencoder.js
@@ -161,7 +161,7 @@ YoutubeEncoder.prototype = {
                // 'C:\windows\...' <82>̌`<8E>
                var path = fileOrDir.QueryInterface(Components.interfaces.nsILocalFile).path;   
 
-               path = path + "\\extensions\\{" + this.extensionId + "}\\chrome\\content\\youtubeencoder";
+               path = path + "/extensions/{" + this.extensionId + "}/chrome/content/youtubeencoder";
 
                return path;
        },

Mac版 Firefox におけるバグ(Bug 322865) の回避

なんかしらんが、file.isExecutable() が常にfalseを返すというバグがいるらしい。

よく気づいたなこれ。

ってことで単に isExcutable を呼ばないように修正する。


--- a/chrome/content/youtubeencoder/moviepage.js
+++ b/chrome/content/youtubeencoder/moviepage.js
@@ -121,7 +121,7 @@ MoviePage.prototype = {
                var UConv = Components.classes[UConvID].getService(UConvIF);
 
                ffmpegFile.initWithPath( path );
-               if ( ffmpegFile.exists() && ffmpegFile.isExecutable() ){
+               if ( ffmpegFile.exists() ){
                        ffmpeg = Components.classes['@mozilla.org/process/util;1']
                                  .createInstance( Components.interfaces.nsIProcess );
                        ffmpeg.init( ffmpegFile );

パッケージングとインストール

修正したらもう一度zipで圧縮してパッケージングする。

古いxpiファイルを削除して、zip。

$ rm youtubeencoder.xpi
$ zip -r youtubeencoder.xpi * 

できあがったxpiファイルを Firefoxのウィンドウにドラッグアンドドロップしてインストール。

以上

とりあえず Youtube で動作確認。 けどなんかニコニコ動画でエラーが出る。

どうも私がいじったところが原因じゃないような気がするのだけれども…。

まあ私は Safari 使いだからあんま関係ないけどね。

Safari用に移植してみるかしらん。