muumoo.jp


ニュース記事検索


過去ログ 2007年09月04日 - ニュース過去ログ

ニュース過去ログ

2007/09/04 管理人日記 ニコニコ動画をダウンロードできるようになるGreasemonkeyスクリプト0.4β (管理人日記)

以前作ったやつですが、コメントのxmlのダウンロードができなかった。データは取得できたけどダウンロードができなかったので、textareaに貼り付けてコピペ保存してもらう感じにしていた。

この件について、miya2000さんに

「ダウンロードダイアログ」試してないけどdataスキームにresponseTextを渡せば出来るんじゃないでしょうか。mimeは「application/x-xml」とか?←適当です

ってはてブで教えてもらった。なるほどdataスキームか。思いつかなかった。ものすごい感謝です。

ソース

とりあえず自信ないのでまだβ版とします。ファイルの配布もしないので、各自で以下のソースに貼り替えてください。今回初めてインストールする場合は、前の記事からインストールして、それを貼り替えると楽かも知れません。

// ==UserScript==
// @name      nicovideo downloader
// @namespace http://muumoo.jp/
// @include   http://www.nicovideo.jp/watch/*
// @author    pool
// @version   0.4
// ==/UserScript==

(function(){
    var h1 = document.getElementsByTagName('h1')[0];
    if(!h1) return;
    
    var video_link = document.createElement('a');
    video_link.appendChild(document.createTextNode('[video]'));
    video_link.href = 'javascript:void(0);';
    video_link.addEventListener('click',
        function(){
            call_api(function(res){
                if(/&url=(.+?)&/.test(res.responseText)){
                    var url = decodeURIComponent(RegExp.$1);
                    location.href = url;
                }
            });
        }, false);
    h1.parentNode.insertBefore(video_link, h1);
    
    var comments_link = document.createElement('a');
    comments_link.appendChild(document.createTextNode('[comments]'));
    comments_link.href = 'javascript:void(0);';
    comments_link.addEventListener('click',
        function(){
            call_api(function(res){
                if(/thread_id=(.+?)&.+&ms=(.+?)&/.test(res.responseText)){
                    var thread_id = decodeURIComponent(RegExp.$1);
                    var url = decodeURIComponent(RegExp.$2);
                    GM_xmlhttpRequest({
                        method: 'POST',
                        headers: { 'Content-type': 'text/xml' },
                        url: url,
                        data: '<thread res_from="-500" version="20061206" thread="' + thread_id + '" />',
                        onload: function(res){
                            var data = encodeURIComponent(res.responseText.replace(/></g, '>\n<'));
                            location.href = 'data:application/xml;charset=utf-8,' + data;
                        },
                        onerror: function(res){ GM_log(res.status + ':' + res.statusText); }
                    });
                }
            });
        }, false);
    h1.parentNode.insertBefore(comments_link, h1);
    
    function call_api(callback){
        if(/watch\/([^/]+)$/.test(location.href)){
            var video_id = RegExp.$1;
            GM_xmlhttpRequest({
                method: 'GET',
                url: 'http://www.nicovideo.jp/api/getflv?v=' + video_id,
                onload: callback,
                onerror: function(res){ GM_log(res.status + ':' + res.statusText); }
            });
        }
    }
})();

貼り替えの方法は知ってると思いますが一応説明すると、

  1. ウィンドウ右下のGreasemonkeyのアイコンを右クリック
  2. ユーザスクリプトの管理
  3. 「nicovideo downloader」を選択
  4. 「編集」をクリック
  5. エディタでソースが開くので、上記のソースをここにコピペして上書き保存

こんな感じです。すでにニコニコ動画の動画ページを開いている場合は、Greasemonkeyのアイコンを右クリックすると「nicovideo downloader」が見えていると思うので、そこを右クリックするだけでもエディタが開きます。

ポイント

まさに教えていただいたdataスキームがポイント。

GM_xmlhttpRequest({
    method: 'POST',
    headers: { 'Content-type': 'text/xml' },
    url: url,
    data: '<thread res_from="-500" version="20061206" thread="' + thread_id + '" />',
    onload: function(res){
        var data = encodeURIComponent(res.responseText.replace(/></g, '>\n<'));
        location.href = 'data:application/xml;charset=utf-8,' + data;
    },
    onerror: function(res){ GM_log(res.status + ':' + res.statusText); }
});

この部分ですね。GM_xmlhttpRequestでコメント取得APIに対してPOSTを発行して、レスポンスが返ってきたら(onload)、そのresponseTextを使ってdataスキームのURIを作って、location.hrefに突っ込んでる。

Base64が面倒だったのでURLエンコードだけです。テキストデータなのでこれでもOKだった。mediatypeは悩んだけど、とりあえず「application/xml」にしました。これではダウンロードダイアログは開きませんが、xmlのプレビューが開くので、そこで右クリック→「名前を付けてページを保存」で保存できます。

miya2000さんに教えていただいた「application/x-xml」とか、まあ未知のmediatypeにすればダウンロードダイアログは開けましたが、どれにするのがベストなのか判断できなかったので、とりあえず本当のものにしました。仮です。もっといいやつが知りたい。どんなmediatypeにすればいいかなあ。

あと、できればファイル名のデフォルト値も指定したいんですが...。無理かな。

Operaな人は

例によってOperaには対応していません。

Operaでニコニコ動画をダウンロードしたい方は、「ニコニコ動画をダウンロードできるようになるGreasemonkeyスクリプトのOpera版」を使ってください。こっちはflvのダウンロードはできますがコメントのダウンロードはまだ実現していません。ごめんなさい。

この記事のURI:
http://muumoo.jp/news/2007/09/04/0nicovideodownloader.html
関連記事 最新の関連記事
関連記事 直後の関連記事
関連記事 直前の関連記事


Copyright© 2002-2007 muumoo.jp All Rights Reserved.