// ==UserScript==
// @name NicoWatch Tools
// @namespace http://wktklabs.blog98.fc2.com/
// @description ニコニコ動画Greasemonkeyスクリプトの統合スクリプト
// @include http://www.nicovideo.jp/watch/*
// @version 0.4.20100220
// @require http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js
// ==/UserScript==
(function(){
var defaultConfig = {
position : "top", /* top or bottom */
};
var functionEnable = {
getflv : { flag : true, label : "FLV/MP4/SWF"},
getxml : { flag : true, label : "XML"},
getmp3 : { flag : true, label : "MP3"},
comments_search : { flag : false, label : ""},
comments_getLinks : { flag : true, label : "リンク抽出"},
getFilter : { flag : true, label : "フィルター"},
tagsReload : { flag : true, label : "タグ更新"},
viewLockedTags : { flag : true, label : ""},
tagLinker : { flag : true, label : ""},
getUsername : { flag : false, label : ""},
replaceUserTextLink : { flag : true, label : ""},
replaceUserTextSpace : { flag : true, label : ""},
ecoMode : { flag : false, label : "", label2 : ""},
heatMeter : { flag : true, label : "HeatMeter"}
};
var $$ = unsafeWindow.$$;
var flvplayer = unsafeWindow.document.getElementById('flvplayer').wrappedJSObject;
function htmlspecialchars(c){return c.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}
function xpath(query) {
var results = document.evaluate(query, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
var nodes = new Array();
for(var i=0; i';
else dataStr = '';
GM_xmlhttpRequest({
method: 'POST',
headers: { 'Content-type': 'text/xml' },
url: url,
data: dataStr,
onload: function(res){
xml.text = res.responseText;
xml.dom = (new DOMParser()).parseFromString(res.responseText, "text/xml").wrappedJSObject;
$("#tools_status").html("");
if (!xml.flag) {
switch (type) {
case 0:
$("#reload_public_xml").html('' +
'' +
' 通常コメ' +
'');
$("#reload_public_xml_act").click(function(){
$("#reload_public_xml").html("");
api.comments(0, function(){
$("#reload_public_xml").html('' +
'' +
' 通常コメ' +
'');
alert("通常コメントデータを更新しました");
})
});
if (!api.xml.userCom.flag) break;
case 1:
$("#reload_user_xml").html('' +
'' +
' 投稿者コメ' +
'');
$("#reload_user_xml_act").click(function(){
$("#reload_user_xml").html("");
api.comments(1, function(){
$("#reload_user_xml").html('' +
'' +
' 投稿者コメ' +
'');
alert("投稿者コメントデータを更新しました");
})
});
break;
}
xml.flag = true;
}
func();
},
onerror: function(res){
$("#tools_status").html("接続エラー");
GM_log(res.status + ':' + res.statusText);
}
});
};
var xml;
if (type==1) {
xml = this.xml.userCom;
$("#tools_status").html("投稿者コメントデータ取得中...");
}
else {
xml = this.xml.publicCom;
$("#tools_status").html("一般コメントデータ取得中...");
}
if (api.prm.thread_id==undefined) getComments();
else api.get(getComments);
}
}
/*--- tools ---*/
var tools = {
flag : {
getflv : 0,
search : 0,
getLinks : 0,
getFilter : 0
},
show : function(){
if (document.URL.match(/^http:\/\/.*?\.nicovideo\.jp\/watch\/([^\/?<>"'#]+)/)) {
api.vid = RegExp.$1;
var toolbar = document.createElement("table");
toolbar.id = 'tools_table';
toolbar.cellpadding = 0;
toolbar.cellspacing = 4;
toolbar.border = 0;
toolbar.className = 'TXT12';
toolbar.innerHTML = '
' +
' | ' +
((functionEnable.getflv.flag)?' | ':"") +
((functionEnable.getxml.flag)?' | ':"") +
((functionEnable.getmp3.flag)?' | ':"") +
((functionEnable.comments_search.flag)?' | ':"") +
((functionEnable.comments_getLinks.flag)?' | ':"") +
((functionEnable.getFilter.flag)?' | ':"") +
((functionEnable.tagsReload.flag)?' | ':"") +
((functionEnable.ecoMode.flag)?' | ':"") +
((functionEnable.heatMeter.flag)?' | ':"") +
'' +
'' +
' | ' +
'' +
'' +
' | ' +
'' +
'' +
' | ' +
'' +
'' +
' | ' +
'
';
var search_box = document.createElement("div");
search_box.id = "search_comments_box";
if (functionEnable.comments_search.flag) {
search_box.className = "TXT12";
search_box.style.display="none";
search_box.setAttribute("name","");
search_box.style.padding="0 0 5px 30px";
search_box.innerHTML = '';
}
var toolbox = document.createElement("div");
toolbox.id = "toolbox";
toolbox.className = "TXT12";
if (defaultConfig.position=="bottom") {
var doc = document.createElement("div");
doc.id = "nicowatchtools";
doc.style.cssText = "margin: 0 auto 5px auto;";
var doc1 = document.createElement("div");
doc1.id = "nicowatchtools_top";
doc.appendChild(doc1);
doc1 = document.createElement("div");
doc1.id = "nicowatchtools_container";
doc1.appendChild(toolbar);
doc1.appendChild(search_box);
doc1.appendChild(toolbox);
doc.appendChild(doc1);
doc1 = document.createElement("div");
doc1.id = "nicowatchtools_bottom";
doc.appendChild(doc1);
$("#WATCHFOOTER").prepend(doc);
}
else {
$("#WATCHHEADER").append(toolbar);
$("#WATCHHEADER").append(search_box);
$("#WATCHHEADER").append(toolbox);
}
if (functionEnable.tagsReload.flag) $("#tags_reload").click(tools.tagsReload);
if (functionEnable.tagLinker.flag) tools.tagLinker();
if (functionEnable.viewLockedTags.flag) tools.viewLockedTags();
if (functionEnable.getflv.flag) $("#flv_dl").click(tools.getflv);
if (functionEnable.getxml.flag) $("#xml_dl").click(tools.getxml);
if (functionEnable.getmp3.flag) $("#mp3_dl").click(tools.getmp3);
if (functionEnable.comments_search.flag) $("#search_comments").click(tools.comments.search.input);
if (functionEnable.comments_search.flag) $("#search_comments_form").click(tools.comments.search.act);
if (functionEnable.comments_getLinks.flag) $("#get_links").click(tools.comments.getLinks);
if (functionEnable.getFilter.flag) $("#get_filter").click(tools.getFilter.show);
if (functionEnable.getFilter.flag) tools.getFilter.count();
if (functionEnable.ecoMode.flag) $("#eco_mode").click(tools.ecoMode.change);
if (functionEnable.ecoMode.flag) tools.ecoMode.show();
if (functionEnable.getUsername.flag) tools.getUsername();
if (functionEnable.heatMeter.flag) {
$("#heatMeter_btn").click(heatMeter.switch);
heatMeter.switchCheck();
heatMeter.act();
}
tools.replaceUserText();
}
},
getflv : function(){
if ($("#toolbox").attr("name") == "getflv") {
$("#toolbox").attr("name","");
$("#toolbox").html("");
}
else {
$("#search_comments_box").css("display","none");
$("#tools_status").html("セッションの再確立中...");
GM_xmlhttpRequest({
method : 'GET',
url : 'http://www.nicovideo.jp/watch/' + location.href.split('/').reverse()[0],
onload : function(res) {
GM_xmlhttpRequest({
method: 'GET',
url: 'http://www.nicovideo.jp/api/getflv?v=' + location.href.split('/').reverse()[0],
onload: function(res){
$("#tools_status").html("");
var movie_type = flvplayer.GetVariable('movie_type');
if (/&url=(.+?)&/.test(res.responseText)) {
var note = '', ecoNote = '', url = decodeURIComponent(RegExp.$1);
var ecoFlag = /low$/.test(url);
if (ecoFlag) ecoNote = ' (エコノミーモードにより画質が低下しています)';
if (ecoFlag || (movie_type != "swf" && movie_type != "mp4")) {
movie_type = "flv";
}
else {
note = 'ヒント : | ダウンロードURLを右クリック→「名前を付けてリンク先を保存」から任意の保存先を選択し、拡張子を「.' + movie_type + '」にして保存してください。 |
';
}
if (movie_type == "swf") url = url + "as3";
$("#toolbox").html('' +
'');
$("#toolbox_close").click(tools.getflv);
$("#toolbox").attr("name","getflv");
}
}
});
}
});
}
},
getmp3 : function(){
var mp3window = window.open('http://www.nicomimi.net/play/' + location.href.split('/').reverse()[0]);
},
get3gp : function(){
var nico3gpwindow = window.open('http://www.nico3gp.com/?nicomimi=' + location.href.split('/').reverse()[0]);
},
getxml : function(){
var func = function(type){
var iframe = document.createElement("iframe");
iframe.style.display = "none";
var text;
if (type==1) text = api.xml.userCom.text;
else text = api.xml.publicCom.text;
location.href = 'data:application/octet-stream,'+encodeURIComponent(text.replace(/>\r\n<'));
}
if (confirm("通常コメントまたは投稿者コメントデータをダウンロードします。\nOK => 通常コメント\nキャンセル => 投稿者コメント")) {
if (confirm("通常コメントデータをダウンロードします。\nよろしいですか?")) {
if (!api.xml.publicCom.flag) api.comments(0,function(){func(0);});
else func(0);
}
}
else {
if (confirm("投稿者コメントデータをダウンロードします。\nよろしいですか?")) {
if (!api.xml.userCom.flag) api.comments(1,function(){func(1);});
else func(1);
}
}
},
comments : {
display : function(nonText, reg, linkOnly, type, func){
$("#tools_status").html();
var table = function(reg){
var xml;
if (type==1) xml = api.xml.userCom;
else xml = api.xml.publicCom;
var results = '';
var chatText;
var premi;
var reg = new RegExp(reg, "ig");
var match = false, match2 = false;
var flag = false;
var com;
var ii = false;
var user_id;
var date = new Date();
var chat = xml.dom.getElementsByTagName("chat");
var num = chat.length;
var month, day, hour, seconds;
for (var i = 0; i < num; i++) {
chatText = chat[i].textContent;
user_id = chat[i].getAttribute("user_id");
if (linkOnly) match = /((sm|fz|yo|ig|ax|na|nm|za|yk|sk|fx|cw|zc|zb|ca|zd)\d+)|(watch\/\d+)|(mylist\/\d+)|(h?ttps?:\/\/[-_.!~*()a-zA-Z0-9;\/?:@&=+$,%#]+)/.test(chatText);
else {
match = reg.test(chatText);
match2 = reg.test(user_id);
}
if (match || match2) {
flag = true;
user_id = user_id;
vpos_min = Math.floor(Math.floor(chat[i].getAttribute("vpos") / 100) / 60);
vpos_sec = Math.floor(chat[i].getAttribute("vpos") / 100) - vpos_min * 60;
if (vpos_min < 10) vpos_min = '0' + vpos_min;
if (vpos_sec < 10) vpos_sec = '0' + vpos_sec;
if (chat[i].getAttribute("premium")) premi = '[P] ';
else premi = '';
com = htmlspecialchars(chatText);
if (com.match(/(h?ttps?:\/\/[-_.!~*()a-zA-Z0-9;\/?:@&=+$,%#]+)/i)) {
com = com.replace(/(h?ttps?:\/\/[-_.!~*()a-zA-Z0-9;\/?:@&=+$,%#]+)/ig,
function($1){
var url = $1, deurl = $1;
if (!/^h/.test(url)) deurl = "h" + url;
return ''+url+'';
}
);
}
else if (com.match(/((sm|fz|yo|ig|ax|na|nm|za|yk|sk|fx|cw|zc|zb|ca|zd)\d+)/ig))
com = com.replace(/((sm|fz|yo|ig|ax|na|nm|za|yk|sk|fx|cw|zc|zb|ca|zd)\d+)/ig, ''+RegExp.$1+'');
else if (com.match(/(watch\/\d+)/ig))
com = com.replace(/(watch\/\d+)/ig, ''+RegExp.$1+'');
else if (com.match(/(mylist\/\d+)/ig))
com = com.replace(/(mylist\/\d+)/ig, ''+RegExp.$1+'');
else if (com.match(/(user\/\d+)/ig))
com = com.replace(/(user\/\d+)/ig, ''+RegExp.$1+'');
else if (com.match(/([-_.!~*()a-zA-Z0-9;\/?:@&=+$,%#]{50})/ig))
com = com.replace(/([-_.!~*()a-zA-Z0-9;\/?:@&=+$,%#]{50})/ig, RegExp.$1+'
');
com = com.replace(/\\r\\n/ig,'
');
if (ii) {
trStyle = 'style="background:#efefef;"';
ii = false;
} else {
trStyle = '';
ii = true;
}
date.setTime(chat[i].getAttribute("date")+'000');
month = date.getMonth() + 1;
if (month < 10) month = '0' + month;
day = date.getDate();
if (day < 10) day = '0' + day;
hour = date.getHours();
if (hour < 10) hour = '0' + hour;
seconds = date.getMinutes();
if (seconds < 10) seconds = '0' + seconds;
results += ''
+ ''
+ vpos_min + ':' + vpos_sec
+ ' | '
+ ''
+ (($("#search_disp_mail").get(0).checked)?''
+ ((chat[i].getAttribute("mail")!=null)?chat[i].getAttribute("mail"):"-")
+ ' | ':"")
+ (($("#search_disp_post").get(0).checked)?''
+ month + '/' + day + ' ' + hour + ':' + seconds
+ ' | ':"")
+ (($("#search_disp_number").get(0).checked)?''
+ chat[i].getAttribute("no")
+ ' | ':"")
+ ''
+ premi
+ ((type==0)?''
+ user_id
+ '':'')
+ ' | '
+ '
';
}
}
if (flag) {
$("#toolbox").html('' +
'');
$("#toolbox_close").click(function(){
$("#search_comments_box").css("display","none");
$("#toolbox").html("");
$("#toolbox").attr("name","");
});
} else {
$("#toolbox").html("");
alert(nonText);
}
if (func) func();
};
if (type==0 && !api.xml.publicCom.dom) api.comments(0,function(){table(reg)});
else if (type==1 && !api.xml.userCom.dom) api.comments(1,function(){table(reg)});
else table(reg);
},
search : {
input : function(){
$("#tools_status").html("");
if ($("#search_comments_box").css("display")!="none"){
$("#search_comments_box").css("display","none");
$("#toolbox").html("");
$("#toolbox").attr("name","");
}
else {
$("#toolbox").html("");
$("#search_comments_box").css("display","");
$("#search_comments_input").focus();
$("#toolbox").attr("name","searchComments");
}
},
act : function(){
$("#tools_status").html("");
word = $("#search_comments_input").val();
word = word.replace(' ', ' ').split(' ');
var num = word.length;
var type;
if ($("#comment_type").val()=="user") type=1;
else type=0;
if (num > 0 && word != '') {
var words = '';
for (var i = 0; i < num; i++) {
words += '|(' + word[i] + ')'
}
tools.comments.display('該当するコメントは見つかりませんでした。', words.substr(1), false, type, false);
} else {
if (type==1) tools.comments.display('投稿者コメントはありませんでした。', '', false, type, false);
else tools.comments.display('', '', false, type, false);
}
}
},
getLinks : function(){
$("#search_comments_box").css("display","none");
if ($("#toolbox").attr("name") == "getLinks"){
$("#toolbox").html("");
$("#toolbox").attr("name","");
}
else {
tools.comments.display('コメント内にリンクは見つかりませんでした。', '', true, 0, function(){
if ($("#toolbox").html() != "") $("#toolbox").attr("name","getLinks");
else $("#toolbox").attr("name","");
});
}
},
getUserComments : function(){
$("#search_comments_box").css("display","none");
if ($("#toolbox").attr("name") == "getUserComments"){
$("#toolbox").html("");
$("#toolbox").attr("name","");
}
else {
tools.comments.display('', '', false, 0,
function(){$("#toolbox").attr("name","getUserComments");}
);
}
}
},
getFilter : {
count : function(){
setTimeout(function(){
api.get(function(){
if (api.prm.ng_up!=undefined) {
var filters = decodeURIComponent(decodeURIComponent(api.prm.ng_up)).split('&');
if (filters.length > 0) $("#get_filter").val() += '(' + filters.length + ')';
clearInterval(filterCounter);
}
});
}, 3000);
},
show : function(){
$("#search_comments_box").css("display","none");
$("#toolbox").html("");
$("#tools_status").html("");
if ($("#toolbox").attr("name") == "getFilter") {
$("#toolbox").attr("name","");
}
else {
if (!api.prm.ng_up) {
alert("フィルターは設定されていません。");
$("#toolbox").attr("name","");
}
else {
filters = decodeURIComponent(decodeURIComponent(api.prm.ng_up)).split('&');
var results = '';
var ii = false;
for (var i = 0; i < filters.length; i++) {
filters[i].match(/(.+)=(.+)/);
if (ii) {
trStyle = 'style="background:#efefef;"';
ii = false;
} else {
trStyle = '';
ii = true;
}
results += '' + RegExp.$1 + ' |
';
}
$("#toolbox").html('' +
'');
$("#toolbox_close").click(function(){
$("#toolbox").html("");
$("#toolbox").attr("name","");
});
$("#toolbox").attr("name","getFilter");
}
}
}
},
tagsReload : function(){
if (!functionEnable.tagsReload.flag) return;
$("#tools_status").html("");
GM_xmlhttpRequest({
method : 'POST',
url : "http://www.nicovideo.jp/tag_edit/" + api.vid,
headers : {
'X-Requested-With' :'XMLHttpRequest',
'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
},
data : 'cmd=tags',
onload : function(res) {
if (/^<\!DOCTYPE HTML PUBLIC/.test(res.responseText)) alert("タグの更新に失敗しました。");
else {
$("#video_tags").html(res.responseText);
tools.tagLinker(tools.viewLockedTags(unsafeWindow.Nicopedia.decorateLinks));
var tagfrm = $("#video_tags").get(0);
var tagBGcolor = 125;
timeId = setInterval(function(){
tagBGcolor += 10;
tagfrm.style.backgroundColor = "#ffff" + tagBGcolor.toString(16);
if (tagBGcolor >= "255") clearInterval(timeId);
}, 100);
}
}
});
},
tagLinker : function(func){
if (!functionEnable.tagLinker.flag) return;
var tags = (xpath("//div[@id='video_tags']//a[@rel='tag']"));
for (var i=0; i(.+?)<\/strong> が/.test(res.responseText)) {
var user = decodeURIComponent(RegExp.$1);
var doc1 = document.createElement("span");
doc1.style.fontSize = "12px";
doc1.innerHTML = " [ "+user+" ] ";
(xpath("//div[@id='des_1']/div/p"))[0].appendChild(doc1);
var doc2 = document.createElement("span");
doc2.style.fontSize = "12px";
doc2.style.color = "#000";
doc2.innerHTML = " [ うp主 : "+user+" ] ";
(xpath("//div[@id='des_2']/table/tbody/tr/td[2]/p[2]/span"))[0].insertBefore(doc2, (xpath("//div[@id='des_2']/table/tbody/tr/td[2]/p[2]/span/a"))[0]);
}
}
});
},
replaceUserText : function(){
setTimeout(function(){
var p;
if (api.checkWrapper()) p = $("#WATCHHEADER").get(0).getElementsByTagName('p')[2];
else p = (xpath("//div[@id='des_2']/table[2]/tbody/tr/td[2]/p"))[0];
var userText = p.innerHTML;
if (functionEnable.replaceUserTextLink.flag)
userText = userText.replace(/("?>?h?ttps?:\/\/[-_.!~*()a-zA-Z0-9;\/?:@&=+$,%#]+)/ig,
function($1){
var url = $1;
if (!/^("|>)/.test(url) && !url.match(/nicovideo\.jp/ig)) {
url.match(/(h?ttps?:\/\/[-_.!~*()a-zA-Z0-9;\/?:@&=+$,%#]+)$/ig);
url = RegExp.$1;
if (!/^h/.test(url)) url = "h" + url;
return ''+url+'';
}
else return url;
}
);
if (functionEnable.replaceUserTextSpace.flag && p.getElementsByTagName('br').length<1)
userText = userText.replace(/([ ]{3,})/ig, "
");
if (functionEnable.replaceUserTextLink.flag || functionEnable.replaceUserTextSpace.flag)
p.innerHTML = userText;
}, 1000);
},
ecoMode : {
show : function(){
if (/(.*)\?eco=1$/.test(document.URL)) $("#eco_mode").val(functionEnable.ecoMode.label2);
},
change : function(){
if (/(.*)\?eco=1$/.test(document.URL)) window.self.location.href = RegExp.$1;
else window.self.location.href = document.URL+"?eco=1";
},
}
};
GM_addStyle((<>>).toString());
/*---------- HeatMeter ----------*/
var h_api = {
vid : Video.id,
prm : {
all : false
},
xml : {
text : false,
dom : false,
flag : false
},
get : function(func){
if (func) {
if (!this.prm.all) {
GM_xmlhttpRequest({
method: 'GET',
url: 'http://ext.nicovideo.jp/api/getflv/' + this.vid,
onload: func,
onerror: function(res){
GM_log(res.status + ':' + res.statusText);
}
});
}
else {
func({responseText : this.prm.all});
}
}
},
comments : function(func){
var com_num = 1000;
var vl = Video.length;
xml = this.xml;
this.get(function(res){
if(/thread_id=(.+?)&/.test(res.responseText)){
var thread_id = decodeURIComponent(RegExp.$1);
res.responseText.match(/&ms=(.+?)&/);
var url = decodeURIComponent(RegExp.$1);
res.responseText.match(/&user_id=(.+?)&/);
var user_id = decodeURIComponent(RegExp.$1);
GM_xmlhttpRequest({
method: 'POST',
headers: { 'Content-type': 'text/xml' },
url: url,
data: '',
onload: function(res){
xml.text = res.responseText;
xml.dom = (new DOMParser()).parseFromString(res.responseText, "text/xml").wrappedJSObject;
h_api.xml.flag = true;
func();
},
onerror: function(res){
GM_log(res.status + ':' + res.statusText);
}
});
}
});
}
}
var heatMeter = {
prm : {
getflag : false,
deleted : false,
color : [
'#060026', '#0f0082', '#181395', '#214dd6',
'#3b8cd2', '#36b9d3', '#34c5a5', '#41cc27',
'#8fd104', '#bfd70e', '#c8ab0b', '#c38509',
'#c65706', '#c22404', '#c51b20', '#c51b20'
],
fontsize : [
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12
],
video_length : Video.length,
titles : Array(),
chatNum : Array(),
divwidth : 3,
widthsep : 79,
maxnum : 0,
timerID : false
},
switchCheck : function(){
if (GM_getValue("nicowatch_heatMeter", 1) == 1) $("#heatMeter_btn").css("color","");
else $("#heatMeter_btn").css("color","#aaa");
},
switch : function(){
if (GM_getValue("nicowatch_heatMeter", 1) == 1) {
GM_setValue("nicowatch_heatMeter", 0);
$("#heatMeter_btn").css("color","#aaa");
$("#heatmeter").hide();
}
else {
$("#heatMeter_btn").css("color","");
GM_setValue("nicowatch_heatMeter", 1);
heatMeter.act();
}
},
act : function(){
if (GM_getValue("nicowatch_heatMeter", 1) == 1) {
if (!$("#heatmeter").get(0)) {
var doc = document.createElement("div");
doc.id = "heatmeter";
var doc1 = document.createElement("div");
doc1.id = "heatmeter_top";
doc.appendChild(doc1);
doc1 = document.createElement("div");
doc1.id = "heatmeter_container";
doc1.innerHTML = ' Loading... 動かない場合はここをクリック';
doc.appendChild(doc1);
doc1 = document.createElement("div");
doc1.id = "heatmeter_bottom";
doc.appendChild(doc1);
$('#WATCHFOOTER').prepend($(doc));
var bootfunc = function(){
if (!flvplayer) setTimeout(bootfunc,100);
setTimeout(function(){ heatMeter.reload(); }, 3000);
}
$("#heatmeter_bootlink").click(bootfunc);
bootfunc();
}
else $("#heatmeter").show();
}
},
calcurate : function(force){
var i, ii, vpos, nowTime = 0, maxnum = 0;
var vpos_min, vpos_sec, timeSep;
var html = '';
var chat = h_api.xml.dom.getElementsByTagName("chat");
var ret = h_api.xml.text.match(/vpos=\"(\w+)\"/gm);
for (i = 0; i < ret.length; i++) {
/vpos=\"(\w+)\"/gm.test(ret[i]);
if (this.prm.video_length < Math.floor(RegExp.$1/100)) {
this.prm.video_length += 10;
break;
}
}
var timeInterval = (this.prm.video_length*100) / this.prm.widthsep;
if (force || !heatMeter.prm.getflag) {
for (i = 0; i < this.prm.widthsep; i++) {
nowTime += timeInterval;
this.prm.chatNum[i] = 0;
for (ii = 0; ii < chat.length; ii++) {
vpos = chat[ii].getAttribute("vpos");
if (nowTime - timeInterval <= vpos && vpos < nowTime) this.prm.chatNum[i]++;
}
if (this.prm.chatNum[i] > maxnum) maxnum = this.prm.chatNum[i];
vpos_min = Math.floor((nowTime-timeInterval)/100/60);
vpos_sec = Math.floor((nowTime-timeInterval)/100) - vpos_min * 60;
if (vpos_min < 10) vpos_min = '0' + vpos_min;
if (vpos_sec < 10) vpos_sec = '0' + vpos_sec;
timeSep = vpos_min + ":" + vpos_sec + " ~ ";
vpos_min = Math.floor(nowTime/100/60);
vpos_sec = Math.floor(nowTime/100) - vpos_min * 60;
if (vpos_min < 10) vpos_min = '0' + vpos_min;
if (vpos_sec < 10) vpos_sec = '0' + vpos_sec;
timeSep += vpos_min + ":" + vpos_sec;
this.prm.titles[i] = timeSep;
}
heatMeter.prm.getflag = true;
this.prm.maxnum = maxnum;
}
for (i = 0; i < this.prm.widthsep; i++) {
html += '
';
}
$('#heat_meter_body').html(html);
$('#reload_html').html('[ コメントデータ更新 ]');
$('#reloadbtn').click(function(){
if (heatMeter.timerID) clearInterval(heatMeter.timerID);
$('#reloadbtn_html').html('[ コメントデータ更新中... ]');
$('#heat_meter_body').html('Loading...');
$('#heat_status').html('');
h_api.comments(function(){heatMeter.calcurate(true);});
});
heatMeter.follow_seekber();
},
show : function(){
var status_html = '';
$('#heatmeter_container').html('' +
'' +
'Loading...' +
' | ' +
'' +
status_html +
' | ' +
'' +
'[ コメントデータ更新中... ] ' +
' |
' +
'
');
if (!this.prm.deleted && !heatMeter.prm.getflag) {
h_api.comments(function(){heatMeter.calcurate(true);});
}
else if (!this.prm.deleted) {
this.calcurate(false);
}
else {
$('#heat_meter_body').html('Sorry, this video has been deleted.');
}
},
reload : function(){
if (Video.isDeleted) {
heatMeter.prm.deleted = true;
}
heatMeter.show();
},
follow_seekber : function(){
this.timerID = setInterval(function(){
var seekbarWidth = 240;
var move_time = flvplayer.ext_getPlayheadTime();
var nowposition = move_time * seekbarWidth / heatMeter.prm.video_length;
// console.debug( move_time + " : " + nowposition);
var temp = 0;
for (var i = 0; i < heatMeter.prm.widthsep; i++) {
if ((i*heatMeter.prm.divwidth) <= nowposition && nowposition < ((i+1)*heatMeter.prm.divwidth)) {
temp = Math.round(heatMeter.prm.chatNum[i]/heatMeter.prm.maxnum*0.15*100);
$('#heat_status').html(heatMeter.prm.titles[i] +
' コメント数 : ' +
'' +
heatMeter.prm.chatNum[i] +
'');
break;
}
}
if (nowposition > seekbarWidth) nowposition = seekbarWidth;
$('#heat_meter_body').css("background-position", (59+nowposition)+"px 18px");
}, 200);
}
};
GM_addStyle((<>>).toString());
tools.show();
})();