以前作ったやつですが、コメントの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); }
});
}
}
})();
貼り替えの方法は知ってると思いますが一応説明すると、
こんな感じです。すでにニコニコ動画の動画ページを開いている場合は、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でニコニコ動画をダウンロードしたい方は、「ニコニコ動画をダウンロードできるようになるGreasemonkeyスクリプトのOpera版」を使ってください。こっちはflvのダウンロードはできますがコメントのダウンロードはまだ実現していません。ごめんなさい。