diff options
author | mitsugu oyama | 2011-12-25 14:13:37 +0900 |
---|---|---|
committer | mitsugu oyama | 2011-12-26 19:37:01 +0900 |
commit | 5b627b357297761c975187ea291f38092b26cfe3 (patch) | |
tree | fb22ac90cdd94ef7de261db9e144007e754018ca /pixiv.js | |
parent | 0077ab8c1711c0ee473d92c70e9bf37850b76f1e (diff) | |
download | vimperator-plugins-5b627b357297761c975187ea291f38092b26cfe3.tar.bz2 |
fix cannot save some manga page
Diffstat (limited to 'pixiv.js')
-rw-r--r-- | pixiv.js | 238 |
1 files changed, 130 insertions, 108 deletions
@@ -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 |