<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="backgroundScript.js"></script>
<script>
//変数初期化
debug=true;
tabId="";
movieTitle="";
//contextMenu
if(localStorage.getItem("contextMenu")=="true"){
updateContextMenu(true);
}
chrome.extension.onRequest.addListener(function(message,sender,sendResponse){sendResponse(eval(message.action).apply(sender,message.args));});
chrome.webRequest.onHeadersReceived.addListener(
function(details){
console.log("webリクエストイベント発火時=%o",details);
var hasHeader=false;
var ext,m;
if(details.tabId!=tabId || tabId==""){
return;
}else{
tabId="";
}
for(var i=0;i<details.responseHeaders.length;i++){
if(details.responseHeaders[i].name=="Content-Disposition"){
ext="mp4";
if(m=details.responseHeaders[i].value.match(/.+.([a-z0-9]+)"$/)){//"
ext=m[1];
}
details.responseHeaders[i].value="attachment; filename=""+movieTitle+"."+ext+""";
hasHeader=true;
break;
}
}
if(!hasHeader){
details.responseHeaders.push({name:"Content-Disposition",value:"attachment; filename=""+movieTitle+".mp4""});
}
movieUrl="";
return {responseHeaders:details.responseHeaders};
},{
urls: ["*://*.nicovideo.jp/*"],
types:["main_frame"]
},["responseHeaders","blocking"]
);
chrome.webRequest.onBeforeRequest.addListener(
function(details){
if(localStorage.getItem("signalDisable")=="true"){
return {cancel:true};
}else{
return {cancel:false};
}
},{
urls: ["http://res.nimg.jp/swf/system/marquee/default/*","http://flapi.nicovideo.jp/api/getmarquee_new*"],
types:["object"]
},["blocking"]
);
function goMovie(vid){
var ifNm=false;
var fileNamePatObj={};
var tags=[];
//vidにurlを全部送ってくるバカがいます
if(vid.match(/watch/([a-z0-9]+)/)){
vid=RegExp.$1;
}
if(vid.match(/^nm/)){ifNm=true;}
fileNamePatObj["vid"]=vid;
//先ずはタイトルを取る
html2Title(loadTextFile("http://www.nicovideo.jp/watch/"+vid),fileNamePatObj,tags);
if(fileNamePatObj["title"]==null){
alert("http://www.nicovideo.jp/watch/"+vid+"nのタイトルの取得に失敗しました。");
return false;
}
//動画urlを取る
movieUrl=html2url(loadTextFile("http://flapi.nicovideo.jp/api/getflv?v="+vid+(ifNm?"&as3=1":"")),fileNamePatObj);
if(movieUrl==""){
alert("http://www.nicovideo.jp/watch/"+vid+"nの動画URLの取得に失敗しました。");
return false;
}
//ファイル名作成
//先にタグあれこれ
console.log("fileNamePatObj=%o",fileNamePatObj);
console.log("tags=%o",tags);
movieTitle=localStorage.getItem("saveFilePat");
movieTitle=movieTitle.replace(/$tags(.*?)|/g,function(a,b){
return tags.join(b);
});
movieTitle=movieTitle.replace(/$([a-zA-Z0-9]+)/g,function(a,b){
if(fileNamePatObj[b]==null){return "";}
return fileNamePatObj[b];
});
movieTitle=fileNameSafe(movieTitle);
chrome.tabs.create({"url":movieUrl,selected:false},function(detail){
tabId=detail.id;
console.log("コンソールのログ=%o",detail);
});
}
function loadTextFile(url){
httpObj= new XMLHttpRequest();
httpObj.open("GET",url,false);
httpObj.send(null);
return httpObj.responseText.replace(/(r|n|t)+/g,"").replace(/( | )+/g," ");
}
function removeHtmlTag(str){
return str.replace(/<.*?>/g,"");
}
function html2url(html,fileNamePatObj){
var ret="";
try{ret=decodeURIComponent(/url=([^&]+)/.exec(html)[1]);}catch(e){}
try{fileNamePatObj["thread"]=decodeURIComponent(/thread_id=([^&]+)/.exec(html)[1]);}catch(e){}
return ret;
}
function html2Title(html,fileNamePatObj,tags){
var dateObj;
try{fileNamePatObj["title"]=removeHtmlTag(/<p id="video_title"><!-- google_ad_section_start -->(.+?)<!-- google_ad_section_end -->/.exec(html)[1]);}catch(e){}
try{fileNamePatObj["postYear"]=removeHtmlTag(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/.exec(html)[1]);}catch(e){}
try{fileNamePatObj["postMonth"] =removeHtmlTag(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/.exec(html)[2]*1+"");}catch(e){}
try{fileNamePatObj["postMonth2"]=removeHtmlTag(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/.exec(html)[2]);}catch(e){}
try{fileNamePatObj["postDate"] =removeHtmlTag(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/.exec(html)[3]*1+"");}catch(e){}
try{fileNamePatObj["postDate2"] =removeHtmlTag(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/.exec(html)[3]);}catch(e){}
//曜日
try{
html.match(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/);
dateObj=new Date();
dateObj.setFullYear(RegExp.$1);
dateObj.setMonth(RegExp.$2-1);
dateObj.setDate(RegExp.$3);
fileNamePatObj["postDay"] =["日","月","火","水","木","金","土"][dateObj.getDay()];
fileNamePatObj["postDayEng"] =["Sun","Mon","Thu","Wed","Thu","Fri","Sat"][dateObj.getDay()];
fileNamePatObj["postDayEng2"]=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][dateObj.getDay()];
}catch(e){}
try{fileNamePatObj["postHour"] =removeHtmlTag(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/.exec(html)[4]*1+"");}catch(e){}
try{fileNamePatObj["postHour2"] =removeHtmlTag(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/.exec(html)[4]);}catch(e){}
try{fileNamePatObj["postMin"] =removeHtmlTag(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/.exec(html)[5]*1+"");}catch(e){}
try{fileNamePatObj["postMin2"] =removeHtmlTag(/<p id="video_date">.+?(d+)年(d+)月(d+)日 (d+):(d+)/.exec(html)[5]);}catch(e){}
//投稿者名 又はチャンネル名
try{fileNamePatObj["postUser"] =removeHtmlTag(/<p class="font12"><a href="user/(d+)"><strong>(.+?)</strong>/.exec(html)[2]);}catch(e){}
try{fileNamePatObj["postUser"] =removeHtmlTag(/<p class="font12"><a href="http://ch.nicovideo.jp/channel/(.+?)"><strong>(.+?)</strong>/.exec(html)[2]);}catch(e){}
//投稿者ID 又はチャンネルID
try{fileNamePatObj["postUserId"] =removeHtmlTag(/<p class="font12"><a href="user/(d+)"><strong>(.+?)</strong>/.exec(html)[1]);}catch(e){}
try{fileNamePatObj["postUserId"] =removeHtmlTag(/<p class="font12"><a href="http://ch.nicovideo.jp/channel/(.+?)"><strong>(.+?)</strong>/.exec(html)[1]);}catch(e){}
try{fileNamePatObj["category"] =removeHtmlTag(/<span style="color:#C9CFCF;">…</span> <strong style="color:#393F3F;">(.+?)</.exec(html)[1]);}catch(e){}
try{fileNamePatObj["description"]=removeHtmlTag(/<div id="itab_description" class="info in"><p class="font12" style="padding:4px;"><!-- google_ad_section_start -->(.+?)<!-- google_ad_section_end -->/.exec(html)[1]);}catch(e){}
//タグ
try{
var h,h2;
h=html.match(/<nobr>(<img.+?>)?<a href="tag/.+?" rel="tag" class="nicopedia">(.+?)</a>/g);
for(var i=0;i<h.length;i++){
h[i].match(/<a href="tag/.+?" rel="tag" class="nicopedia">(.+?)</a>/);
tags.push(RegExp.$1);
}
}catch(e){}
}
function fileNameSafe(str){
str=str.replace(/\/g,"¥");
str=str.replace(///g,"/");
str=str.replace(/:/g,":");
str=str.replace(/*/g,"*");
str=str.replace(/?/g,"?");
str=str.replace(/"/g,"”");//"
str=str.replace(/</g,"<");
str=str.replace(/>/g,">");
str=str.replace(/|/g,"|");
return str;
}
</script>
</head>
</html>