Pixiv Lazy plus

provide a direct link to original image ([s] link).

当前为 2014-10-01 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Pixiv Lazy plus
  3. // @namespace pixivlazyplus
  4. // @description provide a direct link to original image ([s] link).
  5. // @version 0.8.4
  6. // @include http://www.pixiv.net/*
  7. // ==/UserScript==
  8. // version 0.8.4 - fix detecting URL new format
  9. // version 0.8.3 - fix detecting URL new format
  10. // version 0.8.2 - fix detecting URL new format
  11. // version 0.8.1 - fix detecting ugoira in prev/next
  12. // version 0.8.0 - add ability for downloading ugoira as zip
  13. // version 0.7.9 - fix for no profile image
  14. // version 0.7.8 - fix for spapi return value changes
  15. // version 0.7.7 - change [s] to [M](go directly to manga page) for manga links
  16. // version 0.7.6 - fix prev/next [s] link
  17. // version 0.7.5 - fix new manga page
  18. // version 0.7.4 - fix modified images
  19. // version 0.7.3 - fix missing session ID when it is not the end of cookie
  20. // version 0.7.2 - fix comma in tags breaking parsing logic
  21. // version 0.7.1 - fix iPhone API by supplying session ID
  22. // version 0.7 - work with new sample images with iPhone API, fix old manga
  23. // version 0.6.1 - preload manga images
  24. // version 0.6 - change manga mode to big images
  25. // version 0.5 - remove [b] link, add stylish style class
  26. // version 0.4 - updated to filter new thumbnails
  27. // version 0.3 - fix a bug, hat-tip to syosyo
  28. // version 0.2 - updated on 2008-06-25
  29. var pixivlink_run = 0;
  30. var isNewManga = 1;
  31. var postProcImg = new Array();
  32. var preloadImg = new Array();
  33. var sessID = (/PHPSESSID=[^;]*?(?=;|$)/.exec(document.cookie) || "");
  34.  
  35. String.prototype.splitCSV = function(sep) {
  36. for (var foo = this.split(sep = sep || ","), x = foo.length - 1, tl; x >= 0; x--) {
  37. if (foo[x].replace(/"\s+$/, '"').charAt(foo[x].length - 1) == '"') {
  38. if ((tl = foo[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') {
  39. foo[x] = foo[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"');
  40. } else if (x) {
  41. foo.splice(x - 1, 2, [foo[x - 1], foo[x]].join(sep));
  42. } else foo = foo.shift().split(sep).concat(foo);
  43. } else foo[x].replace(/""/g, '"');
  44. } return foo;
  45. };
  46.  
  47. function GetImageIDFromLink(imageLink) {
  48. var imgID = 0; // If lower 11319936 it means Manga does not have Big version
  49.  
  50. var re = /\d+([_a-z0-9]+)?\.(jpe?g|gif|png)\??.*$|id=[0-9]+$/;
  51. var s = re.exec(imageLink);
  52. if (s && s.length > 0) {
  53. re = /\d+/;
  54. imgID = re.exec(s[0])[0];
  55. }
  56. return imgID;
  57. }
  58.  
  59. function pixivlink() {
  60. //alert(pixivlink_run);
  61. if (!pixivlink_run) pixivlink_run = 1;
  62. else return;
  63. var Items = document.getElementsByTagName('img');
  64. var rexa = /\?mode\=medium\&illust_id|\?mode\=big\&illust_id/;
  65. var rexb = /source.pixiv.net/;
  66. var rexc = /\/img-inf\//;
  67. var rexd = /\/mobile\//;
  68. var rexe = /\/c\//;
  69. for (var i = 0; i < Items.length; i++) {
  70. var imgR = Items[i];
  71. var aR = imgR.parentNode.parentNode;
  72. var aR2 = imgR.parentNode;
  73. if (rexa.test(aR2.href)) {
  74. aR = aR2;
  75. }
  76. if (rexa.test(aR.href)) {
  77. var imgID = GetImageIDFromLink(imgR.src);
  78. var srcR = imgR.src.replace(/_s\.|_m\.|_100\.|_64x64\./i, ".");
  79. // var hrefR = aR.href.replace(/medium/i, "big");
  80. var tdR = aR.parentNode;
  81. /* var linkB = document.createElement('a');
  82. linkB.href = hrefR;
  83. linkB.target = '_blank';
  84. linkB.style.padding = '0 2px';
  85. linkB.className = '_pxlazy';
  86. linkB.appendChild(document.createTextNode('[b]'));
  87. tdR.appendChild(linkB);*/
  88. // tdR.appendChild(document.createTextNode(' '));
  89. if (!rexb.test(srcR)) {
  90. var linkS = document.createElement('a');
  91. linkS.href = srcR;
  92. linkS.target = '_blank';
  93. linkS.className = '_pxlazy _pxlazy_s';
  94. linkS.setAttribute('id', 'ill_' + imgID);
  95. linkS.appendChild(document.createTextNode('[s]'));
  96. tdR.appendChild(linkS);
  97. if (rexc.test(imgR.src)||rexd.test(imgR.src)||rexe.test(imgR.src)) {
  98. //GM_log("postProcImg.push("+imgID+")"+imgR.src);
  99. postProcImg.push(imgID);
  100. }
  101. }
  102. }
  103. }
  104.  
  105. if (postProcImg.length > 0) {
  106. for (var x = 0; x < postProcImg.length; x++) {
  107. GM_xmlhttpRequest({
  108. url: 'http://spapi.pixiv.net/iphone/illust.php?' + sessID + (sessID ? '&' : '') + 'illust_id=' + postProcImg[x],
  109. method: "GET",
  110. headers: {
  111. Referer: "http://www.pixiv.net"
  112. },
  113. onload: function (response) {
  114. if (response.status == 200) {
  115. var rexb = /source.pixiv.net/;
  116. // var rexU = /\/c\//;
  117. var rexU = /_480mw\./;
  118. var rexe = /\/c\//;
  119. var vals = response.responseText.splitCSV();
  120. var vtxt = '';
  121. for(var x=0;x < vals.length;x++)
  122. vtxt=vtxt+x+':'+vals[x]+"\n";
  123. GM_log(vtxt);
  124. if (vals.length > 0) {
  125. var slnk, imgID, isRestricted;
  126. isRestricted = rexb.test(vals[6]);
  127. isUgoira = !rexU.test(vals[9]);
  128. if (!isRestricted) {
  129. //GM_log("imgID = vals[0]");
  130. imgID = vals[0];
  131. } else {
  132. //GM_log("GetImageIDFromLink("+response.finalUrl+")");
  133. imgID = GetImageIDFromLink(response.finalUrl);
  134. }
  135. slnk = document.getElementById('ill_' + imgID);
  136. if (slnk) {
  137. var goodSlink;
  138. if (vals[19].length > 0) {
  139. goodSlink = 'http://www.pixiv.net/member_illust.php?mode=manga&illust_id=' + imgID;
  140. slnk.innerHTML = '[M]';
  141. } else {
  142. var re = new RegExp('/' + vals[0] + '_.*$');
  143. if (isUgoira) {// grab zip!
  144. //GM_log("isUgoira");
  145. slnk.innerHTML = '[U]';
  146. goodSlink = vals[9].replace(/c\/\d+x\d+\/img-master/, 'img-zip-ugoira').replace(re, '/' + vals[0] + '_ugoira1920x1080.zip');
  147. } else if (rexe.test(vals[9])) {// new 480mw URL
  148. //GM_log("480mw");
  149. goodSlink = vals[9].replace(/c\/480x960\//, '').replace(/img-master/, 'img-original').replace(re, '/' + vals[0] + '_p0.' + vals[2]);
  150. } else if (!isRestricted && !rexe.test(vals[9])) {// use 480mw instead
  151. //GM_log("480mw");
  152. goodSlink = vals[9].replace(/mobile\//, '').replace(re, '/' + vals[0] + '.' + vals[2]);
  153. } else { //salvage from profile image
  154. //GM_log("salvage");
  155. re = /\/[0-9_]+\..*$/;
  156. goodSlink = vals[29].replace(/mobile\//, '').replace(/profile\//, 'img/').replace(re, '/' + imgID + '.' + vals[2]);
  157. }
  158. }
  159. slnk.href = goodSlink;
  160. slnk.title=vals[12];
  161. slnk.className = '_pxlazy _pxlazy_s _pxlazy_s_new';
  162. }
  163. }
  164. }
  165. }
  166. });
  167. }
  168. }
  169.  
  170. var links = document.getElementsByTagName('a');
  171. var tagslink = /tags\.php\?tag=/;
  172. for (var i = 0; i < links.length; i++) {
  173. if (tagslink.test(links[i].href))
  174. links[i].href = links[i].href.replace("tags.php?tag=", "search.php?s_mode=s_tag_full&word=");
  175. }
  176.  
  177. if (unsafeWindow.pixiv && unsafeWindow.pixiv.context.images) {
  178. isNewManga = (GetImageIDFromLink(unsafeWindow.pixiv.context.images[0]/*[0]*/) >= 11319936);
  179. for (var x = 0; x < unsafeWindow.pixiv.context.images.length; x++) {
  180. if (isNewManga) unsafeWindow.pixiv.context.images[x]/*[0]*/ = unsafeWindow.pixiv.context.images[x]/*[0]*/.replace(/_p(\d+\.[a-zA-Z\?\d]+)$/, "_big_p$1");
  181. preloadImg.push(new Image());
  182. preloadImg[preloadImg.length - 1].src = unsafeWindow.pixiv.context.images[x]/*[0]*/;
  183. }
  184. //setTimeout(mangaFull,250);
  185. mangaFull();
  186. }
  187. }
  188.  
  189. function mangaFull() {
  190. Items = document.getElementsByTagName('img');
  191. for (var x = 0; x < Items.length; x++) {
  192. var datasrc = Items[x].getAttribute("data-src");
  193. if (datasrc) datasrc = datasrc.replace(/_p(\d+\.[a-zA-Z\?\d]+)$/, "_big_p$1");
  194. Items[x].setAttribute("data-src", datasrc);
  195. if (isNewManga) Items[x].src = datasrc ? datasrc : Items[x].src.replace(/_p(\d+\.[a-zA-Z\?\d]+)$/, "_big_p$1");
  196. }
  197. }
  198.  
  199. window.addEventListener("load", pixivlink, true);