nicovideo Comment Downloader

By nodaguti Last update Aug 2, 2010 — Installed 2,721 times.

There are 2 previous versions of this script.

// ==UserScript==
// @name			nicovideo comment downloader
// @include		http://www.nicovideo.jp/watch/*
// @note			userContent.jsの場合はファイルピッカーでダウンロード出来る
// @privilage	true
// @version		0.1
// ==/UserScript==

(function(){
	var link_point = document.getElementById("WATCHFOOTER");
	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){
				GM_log(res.responseText);
				if(/thread_id=(.+?)&.+&ms=(.+?)&/.test(res.responseText)){
					var thread_id = decodeURIComponent(RegExp.$1);
					var url = decodeURIComponent(RegExp.$2);
					var isFork = confirm("コメントの種類を選択\n\nOK:通常コメント\nキャンセル:投稿者コメント");

					if(isFork) var senddate = '<thread res_from="-1000" version="20061206" thread="' + thread_id + '" />';
							else var senddate = '<thread res_from="-1000" version="20061206" fork="1" thread="' + thread_id + '" />';

					GM_log(senddate);
					//NNDDのファイル名の付け方に準拠
					//例:
					//新・豪血寺一族 -煩悩解放 - レッツゴー!陰陽師‐ニコニコ動画(ββ) - [sm9].xml
					var movieID = /nicovideo\.jp\/watch\/(\w+)/.exec(location.href)[1];
					var movieTitle = document.title;
					var fileTitle = movieTitle + " - " + "[" + movieID + "]";
					if (!isFork) fileTitle += "[\u6295\u7a3f\u8005\u30b3\u30e1\u30f3\u30c8]"; //投稿者コメント
					fileTitle = fileTitle.replace(/[\$\*\?\"\'\/\\]/g, "_");

					GM_xmlhttpRequest({
						method: 'POST',
						headers: { 'Content-type': 'text/xml', Cookie: document.cookie },
						url: url,
						data: senddate,
						onload: function(res){
							save(res.responseText.replace(/></g, '>\n<'),fileTitle,"xml");
						},
						onerror: function(res){ GM_log(res.status + ':' + res.statusText); }
					});
				}
			});
		}, false);
	link_point.parentNode.insertBefore(comments_link, link_point);

	function call_api(callback){
		if(/watch\/([^/]+)$/.test(location.href)){
			var video_id = RegExp.$1;
			GM_xmlhttpRequest({
				method: 'GET',
				url: 'http://ext.nicovideo.jp/api/getflv/' + video_id,
				onload: callback,
				headers: { Cookie: document.cookie, Referrer: document.URL },
				onerror: function(res){ GM_log(res.status + ':' + res.statusText); }
			});
		}
	}

	function save(data,title,ext){
/*		if(chromeWindow){
			//userContent.js+特権
			//ファイルピッカーを使って保存先ファイルを決定
			var fp = chromeWindow.Components.classes['@mozilla.org/filepicker;1']
				.createInstance(chromeWindow.Components.interfaces.nsIFilePicker);
			fp.init(window, "\u30b3\u30e1\u30f3\u30c8\u3092\u4fdd\u5b58", fp.modeSave); //コメントを保存
			fp.appendFilters(Components.interfaces.nsIFilePicker.filterXML);
			fp.defaultExtension = ext;
			fp.defaultString = title + '.' + ext;
			if ( fp.show() == fp.returnCancel || !fp.file ) return;
	
			var save_file = fp.file;
	
			if (save_file.exists()){ var _$ = confirm("上書きします。よろしいですか?");if(_$) save_file.remove(true); else return; }
			save_file.create(save_file.NORMAL_FILE_TYPE, 0666);
	
			var stream = chromeWindow.Components.classes['@mozilla.org/network/file-output-stream;1']
				.createInstance(chromeWindow.Components.interfaces.nsIFileOutputStream);
			stream.init(save_file, 0x02 | 0x08 | 0x20, 420, -1);
	
			var str = unescape(encodeURIComponent(data));
			stream.write(str, str.length);
			stream.close();
	
			//stream.init(aFile, 2, 0x200, false); // open as write only
			//stream.write(date, date.length);
			//stream.close();
		}else{*/
			//Greasemonkey or userContent.js+非特権
			location.href = 'data:application/octet-stream,' + encodeURIComponent( data );
//		}
	}

})();