From 5b627b357297761c975187ea291f38092b26cfe3 Mon Sep 17 00:00:00 2001 From: mitsugu oyama Date: Sun, 25 Dec 2011 14:13:37 +0900 Subject: fix cannot save some manga page --- pixiv.js | 238 ++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 130 insertions(+), 108 deletions(-) (limited to 'pixiv.js') 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 = ; +// }}} 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