1. Index
  2. Memo
  3. javascript, mozilla, nicovideo
  4. ニコニコ動画から動画をダウンロードできるFirefoxの拡張機能を作りました

ニコニコ動画から動画をダウンロードできるFirefoxの拡張機能を作りました

ニコニコ動画から簡単に動画をダウンロードできるFirefoxの拡張機能を作りました。その名も、nicoDownloaderです。

使用イメージ画像

もしよろしければ、以下よりお使いください。

nicoDownloader

本当は今月の20日に完成していた(というか20日に気まぐれで作った)のですが、Twitterなどでしか公表していなかったのです。

ニコニコ動画使ってるみなさん、暇でしたらテストしてください>< 右クリックメニューから動画をFLV形式で保存できるFirefoxの拡張を作りました!(http://tinyurl.com/34yfkf) べ、べつに検証してくれてもお礼なんかでないんだからねっ!(///

ニコニコ動画ダウンローダバージョンアップしました! (http://tinyurl.com/2gf9b5) ←からどうぞ!0.1をお使いの方は更新してください!

そして昨日、むぅもぉ.jpさんがニコニコ動画の動画を保存するグリモン用スクリプトを公開されていたので、「それなら拡張機能バージョンを公開してもいいかな」と思い公開しました。
(拡張機能は需要あるか分かりませんが…僕はグリモンを使っていないので)

制作にあたり、nicovideonさんのグリモン用スクリプトを参考にさせていただきました。ありがとうございます。また、今回は保存ダイアログとダウンロード進捗率を用いてみました。(わからない部分をZIGOROuさんに助けていただきました)
コードも数十行ですみましたので、下に載せたいと思います。

var nicoDownloader = {
    getData: function(id, callback) {
        if(id == null) return;

        var req = new XMLHttpRequest();
        req.open('GET', 'http://www.nicovideo.jp/api/getflv?v=' + id, true);
        req.onload = function() {
            callback(decodeURIComponent(req.responseText.match(/&url=(.*?)&/)[1]));
        };
        req.onerror = function() {
            alert('error!');
        };
        req.send(null);
    },

    getMovie: function() {
        if(window._content.location.href.indexOf('about:') == 0) return;

        var hostname = window._content.location.hostname;
        var title    = window._content.document.title;

        if(hostname == 'www.nicovideo.jp' && window._content.document.getElementById('flvplayer')) {
            var attr     = window._content.document.getElementById('flvplayer').getAttribute('flashvars');
            var videoId = attr.match(/(sm[0-9]*)/g);

            nicoDownloader.getData(videoId, function(uri) {
                var saveAsMes   = document.getElementById("nicoDownloaderStringBundle").getString("nicoDownloader.saveAs");
                var fileTypeMes = document.getElementById("nicoDownloaderStringBundle").getString("nicoDownloader.fileType");

                if(uri == null) return;

                // URI Object
                var io        = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService)
                var targetURI = io.newURI(uri, null, null);

                // Fire Picker
                var nsIFilePicker = Components.interfaces.nsIFilePicker;
                var fp = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
                fp.init(window, saveAsMes, nsIFilePicker.modeSave);
                fp.appendFilter(fileTypeMes, '*.flv');
                fp.defaultExtension = 'flv';
                fp.defaultString = title;

                // Open Save Dialog
                if(fp.show() == fp.returnCancel || !fp.file) {
                    return;
                }
                else {
                    var persist = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
                                    .createInstance(Components.interfaces.nsIWebBrowserPersist);

                    persist.persistFlags = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
                                            .createInstance(Components.interfaces.nsIWebBrowserPersist)
                                            .PERSIST_FLAGS_REPLACE_EXISTING_FILES;

                    // Transfer
                    var xfer = Components.classes["@mozilla.org/transfer;1"]
                                .createInstance(Components.interfaces.nsITransfer);
                    xfer.init(targetURI, fp.fileURL, "", null, null, null, persist);
                    persist.progressListener = xfer;

                    persist.saveURI(targetURI, null, null, null, null, fp.file);
                }
            });
        }
    }
};

Comments: 11

nico fan 07-09-17 (月) 00:14

次のFirefox3では動かなくなってしまいます。詳しくは http://d.hatena.ne.jp/nyama/20070904 を。とっても便利なのでMozilla Add-onsにあげておいてほしいな。

kz 07-09-23 (日) 20:19

> nico fanさん
返信が遅くなってしまい大変申し訳ありません。
そうですね、何らかの形で次のFxには対応させたいと思っております。
もう少しFx3の動きが活発化してきた時点で対応したいと思います。

使っていただいてありがとうございます :)

torete 07-09-26 (水) 23:07

こんにちは。
FLVは出来上がるのですが、中は403 Forbidden と書かれたテキストファイルでした。。。
何か設定を変えないとだめなんでしょうか?
FireFox 2.0.0.7 です。

kz 07-09-27 (木) 01:08

> toreteさん
こんにちは!
FLVが生成されるが403になるのですか…
動画の再生直後にダウンロードしていただいても失敗するのでしょうか?
もし上手く行かない動画がある場合は、コメント欄か下記メールアドレスにその動画のURLを教えていただけますか?
こちらでも検証してみます。

info[at]miniturbo.org

torete 07-09-27 (木) 23:30

再生完了直後にしてみましたが
ニコニコ動画どれもだめみたいです。。。なぜだろう。

1mm 07-09-28 (金) 08:04

ニコダウンローダーを使っているものですが、前述のtoreteさんと同様にダウンロードができなくなることがあります。
主に比較的長い時間の動画で失敗することが多いです。
環境はXP SP2 FireFox ver.2.0.0.7です。

torete 07-09-28 (金) 21:55

1mmさんのコメントをみて、16秒ほどの動画で試してみたらちゃんとDLできました。
自分がDLしようとしてたファイルをTubePlayerでDLしてみると23分(39MB)でした。
アドレスバーのところで about:cache で表示されるフォルダを見てみると、同等の容量のファイルがありません。分割ファイルになってるのかもしれないですね。

kz 07-09-30 (日) 02:52

> toreteさん
> 1mmさん
どうやら一定時間たった後にflvへアクセスしようとすると403が返ってきてしまう見たいです。
「再生完了直後」とありますが、おそらく20~30分後にはどのファイルでも403エラーとなってしまうためです。
現状これを回避するには、ニコニコ動画のプレーヤーがFLVをダウンロードし始めた(疑似ストリーミングで再生が開始された)直後にFLVダウンロードを開始してください。

他にも、プレイヤー側のFLVダウンローが完了しないとこちらのダウンロードが開始されない問題もあるみたいです。
こちらに関しても引き続き検証してみます。

ポチョムキン 07-10-31 (水) 18:42

保存するときのファイル名なんですが
ディフォルトで ニコニコ動画(RC2)‐ が先頭に入らないようにできませんでしょうか?

たぶん
    fp.defaultString = title;
のtitleを変えればいいのだろうけど
何に変えたらいいのか分かりません(´Д⊂ヽ

kz 07-11-01 (木) 19:08

> ポチョムキンさん
正規表現を使って除去してみてはいかがでしょう。
fp.defaultString = title;
これを、
fp.defaultString = title.replace(/ニコニコ動画\(.+\)‐/g, '');
こうすることで、入らないように出来ると思います。
JSファイルはUTF-8で保存してください。

アキ 08-01-20 (日) 19:50

Firefox用探していたので助かります。

周りにも勧めやすいのでMozilla Add-onsにも登録していただけるとうれしいです。

Comment Form
Remember personal info

Trackback+Pingback: 1

TrackBack URL for this entry
http://miniturbo.org/memo/2007/07/30/040558/trackback/
Listed below are links to weblogs that reference
ニコニコ動画から動画をダウンロードできるFirefoxの拡張機能を作りました from miniturbo::Memo
Trackback from ゼロログ 08-01-27 (日) 18:01

ニコニコ動画から動画をダウンロードできるFirefoxの拡張機能…

すごい!と思う。これ

  1. Index
  2. Memo
  3. javascript, mozilla, nicovideo
  4. ニコニコ動画から動画をダウンロードできるFirefoxの拡張機能を作りました
Blog Battler
Search
Feeds
  • Total Feed Counter
Nakanohito

Page Top