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 --- modules/libDLMangaSingleContent.js | 71 +++++++++++ pixiv.js | 238 ++++++++++++++++++++----------------- 2 files changed, 201 insertions(+), 108 deletions(-) create mode 100644 modules/libDLMangaSingleContent.js diff --git a/modules/libDLMangaSingleContent.js b/modules/libDLMangaSingleContent.js new file mode 100644 index 0000000..5f65856 --- /dev/null +++ b/modules/libDLMangaSingleContent.js @@ -0,0 +1,71 @@ +// +// libDLMangaSingleContent.js +// +// libDLMangaSingleContent.js is code for download content of Manga's +// single page. +// libDLMangaSingleContent.js is ran on ChromeWorker thread. +// +// +// accept message: +// { +// 'pageUrl' :string, +// 'refererUrl':string, +// 'cookie' :string +// } +// +// pageUrl : Manga Single Content URL +// refererUrl : referer string +// cookie : cookie string +// +// +// send message: +// { +// 'status' :string, +// 'message' :string, +// 'refererUrl':string, +// } +// +// status : 'normarl' or 'error' +// message : error message (string) or content text data (HTML) +// refererUrl : referer string +// +var JSONMessage; +var xhr; + +function trueContent(){ + let content=xhr.responseText; + self.postMessage( + {'status':'normal','message':content,'refererUrl':JSONMessage.pageUrl} + ); + return; +}; + +function falseContent(){ + self.postMessage({'status':'error','message':'MANGA CONTENT FILE ACCEPT ERROR!!'}); + return false; +}; + +function downloadContent(){ + xhr=new XMLHttpRequest(); + xhr.addEventListener("load",trueContent,false); + xhr.addEventListener("error",falseContent,false); + xhr.open("GET",JSONMessage.pageUrl,false); + if(0 ; +// }}} 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