aboutsummaryrefslogtreecommitdiffstats
path: root/pixiv.js
diff options
context:
space:
mode:
authormitsugu oyama2011-12-25 14:13:37 +0900
committermitsugu oyama2011-12-26 19:37:01 +0900
commit5b627b357297761c975187ea291f38092b26cfe3 (patch)
treefb22ac90cdd94ef7de261db9e144007e754018ca /pixiv.js
parent0077ab8c1711c0ee473d92c70e9bf37850b76f1e (diff)
downloadvimperator-plugins-5b627b357297761c975187ea291f38092b26cfe3.tar.bz2
fix cannot save some manga page
Diffstat (limited to 'pixiv.js')
-rw-r--r--pixiv.js238
1 files changed, 130 insertions, 108 deletions
diff --git a/pixiv.js b/pixiv.js
index 8edbdcd..35f0b43 100644
--- a/pixiv.js
+++ b/pixiv.js
@@ -1,4 +1,4 @@
-// INFO //
+// {{{ INFO
var INFO =
<plugin name="pixiv.js" version="0.7.3"
summary="Download image from pixiv"
@@ -20,11 +20,13 @@ var INFO =
</description>
</item>
</plugin>;
+// }}}
commands.addUserCommand(
['pixiv'],
'Save Image File from pixiv',
function(){
+// {{{ environment
let contents=gBrowser.selectedBrowser.contentDocument;
if(contents.domain!="www.pixiv.net"){
liberator.echoerr('This page is not pixiv.');
@@ -38,8 +40,40 @@ commands.addUserCommand(
const Cc=Components.classes;
const Ci=Components.interfaces;
-
let cookie=contents.cookie;
+// }}}
+
+// {{{ convert to DOM Document from text
+ let getDOMHtmlDocument=function(str){
+ let doc;
+ let range;
+ try{
+ if(document.implementation.createHTMLDocument){
+ doc=document.implementation.createHTMLDocument('');
+ range=doc.createRange();
+ range.selectNodeContents(doc.documentElement);
+ range.deleteContents();
+ doc.documentElement.appendChild(range.createContextualFragment(str));
+ }else{
+ let doctype=document.implementation.createDocumentType(
+ 'html',
+ '-//W3C//DTD HTML 4.01 Transitional//EN',
+ 'http://www.w3.org/TR/html4/loose.dtd'
+ );
+ doc=document.implementation.createDocument(null,'html',doctype);
+ range=doc.createRange();
+ range.selectNodeContents(doc.documentElement);
+ let content=doc.adoptNode(range.createContextualFragment(str));
+ doc.documentElement.appendChild(content);
+ }
+ }catch(e){
+ doc=null;
+ }
+ return doc;
+ };
+// }}}
+
+// {{{ get image id
let id;
let idTmp=contents.URL.match(/illust_id=(\d+)/i);
if(idTmp===null){
@@ -48,7 +82,9 @@ commands.addUserCommand(
}else{
id=idTmp[1];
}
+// }}}
+// {{{ make ChromeWorker
let createWorker=function(fileName){
let ret;
const resourceName="vimp-plugin";
@@ -68,12 +104,14 @@ commands.addUserCommand(
}
return worker;
};
- let worker=createWorker('libDLImage.js');
- if(worker==null){
+// }}}
+// {{{ save image ChromeWorker process
+ let workerImage=createWorker('libDLImage.js');
+ if(workerImage==null){
liberator.echoerr('plugin directory is not found');
return false;
}
- worker.addEventListener('message',function(event){
+ workerImage.addEventListener('message',function(event){
if(event.data.status=='error'){
liberator.echoerr(event.data.message);
return false;
@@ -92,10 +130,40 @@ commands.addUserCommand(
outstream.close();
}
},false);
- worker.addEventListener('error',function(event){
+ workerImage.addEventListener('error',function(event){
+ liberator.echoerr(event.data.status);
+ },false);
+// }}}
+// {{{ Recieve Manga Contents ChromeWorker
+ let workerManga=createWorker('libDLMangaSingleContent.js');
+ workerManga.addEventListener('message',function(event){
+ if(event.data.status=='error'){
+ liberator.echoerr(event.data.message);
+ return false;
+ };
+ let domContent=getDOMHtmlDocument(event.data.message);
+ if(domContent){
+ // DOM で画像 URL を取得して画像ファイルの取得リクエストを発行
+ let imgUrl=domContent.getElementsByTagName('img')
+ .item(0).getAttribute('src');
+ let destPath=getDestPath(imgUrl);
+ if(destPath==null){
+ return false;
+ };
+ saveImage(
+ imgUrl,
+ destPath.path,
+ event.data.refererUrl,
+ cookie
+ );
+ }
+ },false);
+ workerManga.addEventListener('error',function(event){
liberator.echoerr(event.data.status);
},false);
+// }}}
+// {{{ directory picker
let directoryPicker=function() {
let path;
let fp=Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
@@ -108,55 +176,10 @@ commands.addUserCommand(
};
let saveDirectory=directoryPicker();
if(saveDirectory==null) return false;
+// }}}
- let getDOMHtmlDocument=function(str){
- let doc;
- let range;
- try{
- if(document.implementation.createHTMLDocument){
- doc=document.implementation.createHTMLDocument('');
- range=doc.createRange();
- range.selectNodeContents(doc.documentElement);
- range.deleteContents();
- doc.documentElement.appendChild(range.createContextualFragment(str));
- }else{
- let doctype=document.implementation.createDocumentType(
- 'html',
- '-//W3C//DTD HTML 4.01 Transitional//EN',
- 'http://www.w3.org/TR/html4/loose.dtd'
- );
- doc=document.implementation.createDocument(null,'html',doctype);
- range=doc.createRange();
- range.selectNodeContents(doc.documentElement);
- let content=doc.adoptNode(range.createContextualFragment(str));
- doc.documentElement.appendChild(content);
- }
- }catch(e){
- doc=null;
- }
- return doc;
- };
-
- let getImageUrl=function(pageContents){
- let url;
- let htmldoc=getDOMHtmlDocument(pageContents);
- if(htmldoc){
- if(0<htmldoc.getElementsByTagName('img').length)
- url=htmldoc.getElementsByTagName('img').item(0).getAttribute('src');
- else
- url='';
- }else{
- let s=pageContents.indexOf('src="')+5;
- let e=pageContents.indexOf('"',s);
- url=pageContents.substr(s,e-s);
- }
- return url;
- };
-
- let imgUrl;
- let destPath;
-
- let saveImage=function(){
+// {{{ send request save image
+ let saveImage=function(imgUrl,savePath,referer,cookie){
let objMessage={
imageUrl :'',
savePath :'',
@@ -164,13 +187,15 @@ commands.addUserCommand(
cookie :''
};
objMessage.imageUrl=imgUrl;
- objMessage.savePath=destPath.path;
- objMessage.refererUrl=contents.URL;
+ objMessage.savePath=savePath;
+ objMessage.refererUrl=referer;
objMessage.cookie=cookie;
let JSONmessage=JSON.stringify(objMessage);
- worker.postMessage(JSONmessage);
+ workerImage.postMessage(JSONmessage);
};
+// }}}
+// {{{ get destnation fullpath name
let getDestPath=function(url){
let fname=url.substr(url.lastIndexOf('/')+1);
if(fname.lastIndexOf('?')!=-1){
@@ -193,75 +218,71 @@ commands.addUserCommand(
}
return newPath;
};
+// }}}
+
+// {{{ save single image file
+ let getImageUrl=function(pageContents){
+ let url;
+ let htmldoc=getDOMHtmlDocument(pageContents);
+ if(htmldoc){
+ if(0<htmldoc.getElementsByTagName('img').length)
+ url=htmldoc.getElementsByTagName('img').item(0).getAttribute('src');
+ else
+ url='';
+ }else{
+ url=pageContents.match(/http:\/\/img[0-9]{2}\.pixiv\.net\/img\/[0-9a-z_]+\/[0-9]+\.jpg|http:\/\/img[0-9]{2}\.pixiv\.net\/img\/[0-9a-z_]+\/[0-9]+\.png/i);
+ }
+ return url;
+ };
let saveImageFile=function(){
- imgUrl=getImageUrl(xhrImgInfo.responseText);
+ let imgUrl=getImageUrl(xhrImgInfo.responseText);
if(0<imgUrl.length){
- destPath=getDestPath(imgUrl);
+ let destPath=getDestPath(imgUrl);
if(destPath==null){
return false;
};
- saveImage();
+ saveImage(
+ imgUrl,
+ destPath.path,
+ contents.URL,
+ cookie
+ );
}else{
liberator.echoerr("You should login pixiv :<");
};
};
+// }}}
- let getImageUrls=function(pageContents){
- const BIG='_big';
- let url=[];
- let strScript;
- let fst,snd;
- let strFst='';
- let strSnd='';
- let tblElm;
- let i;
- let htmldoc=getDOMHtmlDocument(pageContents);
- if(htmldoc){
- let max=htmldoc.getElementsByClassName('image-container').length;
- for(i=0;i<max;i++){
- strScript=htmldoc.getElementsByClassName('image-container').item(i)
- .getElementsByTagName('script').item(0)
- .childNodes.item(0).nodeValue;
- fst=strScript.search(/unshift/i)+'unshift'.length+2;
- snd=strScript.lastIndexOf('_');
- strFst=strScript.substr(fst,snd-fst);
-
- fst=snd;
- snd=strScript.indexOf("'",fst);
- strSnd=strScript.substr(fst,snd-fst);
-
- url.push(strFst+BIG+strSnd);
- }
- }else{
- url.length=0;
- }
- return url;
+// {{{ save manga image file
+ let requestMangaSingleContent=function(url,ref){
+ let objMessage={
+ pageUrl :'',
+ refererUrl:'',
+ cookie :''
+ };
+ objMessage.pageUrl=url;
+ objMessage.refererUrl=ref;
+ objMessage.cookie=cookie;
+ let JSONmessage=JSON.stringify(objMessage);
+ workerManga.postMessage(JSONmessage);
};
- let imgUrls;
let saveMangaFiles=function(){
- imgUrls=getImageUrls(xhrImgInfo.responseText);
- if(0<imgUrls.length){
- let i;
- let max=imgUrls.length;
- for(i=0;i<max;i++){
- imgUrl=imgUrls[i];
- pnt=imgUrl.lastIndexOf('?');
- if(-1!=pnt){
- imgUrl=imgUrl.substr(0,pnt);
- }
- destPath=getDestPath(imgUrl);
- if(destPath==null){
- continue;
- }
- saveImage();
+ let htmldoc=getDOMHtmlDocument(xhrImgInfo.responseText);
+ if(htmldoc){
+ let max=htmldoc.getElementsByClassName('image-container').length;
+ for(var i=0;i<max;i++){
+ requestMangaSingleContent(
+ url.replace('manga','manga_big').replace('type=scroll','page=')+i,
+ url.replace('&type=scroll','')
+ );
}
- }else{
- liberator.echoerr("Not found image data on the manga page.");
}
};
+// }}}
+// {{{ first XMLHttpRequest
let url;
let type=contents.getElementsByClassName('works_display')
.item(0).firstChild.getAttribute('href');
@@ -300,6 +321,7 @@ commands.addUserCommand(
xhrImgInfo.setRequestHeader('Referer',contents.URL);
xhrImgInfo.setRequestHeader('Cookie',cookie);
xhrImgInfo.send(null);
+// }}}
},
{},
true