Pixiv Lazy plus

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

当前为 2016-06-03 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Pixiv Lazy plus
  3. // @namespace pixivlazyplus
  4. // @description provide a direct link to original image ([s] link).
  5. // @version 0.9.0.12
  6. // @include http://www.pixiv.net/*
  7. // @grant GM_getValue
  8. // @grant GM_setValue
  9. // @grant GM_xmlhttpRequest
  10. // @grant GM_log
  11. // @grant GM_registerMenuCommand
  12. // ==/UserScript==
  13. // version 0.9.0.12 - try to auto login with tags.php ifreame reloading
  14. // version 0.9.0.11 - fix ranking [s] link attachment
  15. // version 0.9.0.10 - resize images in manga view
  16. // version 0.9.0.9 - fix for elimination of public API me.json
  17. // version 0.9.0.8 - add Auto Login menu item
  18. // version 0.9.0.7 - more fix of cookie issue
  19. // version 0.9.0.6 - fix cookie issue
  20. // version 0.9.0.5 - fix ugoira link again
  21. // version 0.9.0.4 - restore MangaFull function
  22. // version 0.9.0.3 - fix clearing accessToken logic, add function to check if accessToken is still valid
  23. // version 0.9.0.2 - fix ugoira link
  24. // version 0.9.0.1 - disable MangaFull since pixiv checks referer for full size manga pages now.
  25. // version 0.9 - upgrade to OAuth API + Pixiv Public API
  26. // version 0.8.14.1 - fix new medium page layout
  27. // version 0.8.13 - fix image response lazy link position
  28. // version 0.8.12 - fix mypage right side lazy links
  29. // version 0.8.11 - fix double links in medium page
  30. // version 0.8.10 - fix double links in medium page
  31. // version 0.8.9 - append [U] link after canvas
  32. // version 0.8.8 - fix loading big manga URL bug introduced in 0.8.7
  33. // version 0.8.7 - fix loading big manga URL in with PNG format
  34. // version 0.8.6 - fix modifying big manga URL in manga page
  35. // version 0.8.5 - fix preloading new manga URL format
  36. // version 0.8.4 - fix detecting URL new format
  37. // version 0.8.3 - fix detecting URL new format
  38. // version 0.8.2 - fix detecting URL new format
  39. // version 0.8.1 - fix detecting ugoira in prev/next
  40. // version 0.8.0 - add ability for downloading ugoira as zip
  41. // version 0.7.9 - fix for no profile image
  42. // version 0.7.8 - fix for spapi return value changes
  43. // version 0.7.7 - change [s] to [M](go directly to manga page) for manga links
  44. // version 0.7.6 - fix prev/next [s] link
  45. // version 0.7.5 - fix new manga page
  46. // version 0.7.4 - fix modified images
  47. // version 0.7.3 - fix missing session ID when it is not the end of cookie
  48. // version 0.7.2 - fix comma in tags breaking parsing logic
  49. // version 0.7.1 - fix iPhone API by supplying session ID
  50. // version 0.7 - work with new sample images with iPhone API, fix old manga
  51. // version 0.6.1 - preload manga images
  52. // version 0.6 - change manga mode to big images
  53. // version 0.5 - remove [b] link, add stylish style class
  54. // version 0.4 - updated to filter new thumbnails
  55. // version 0.3 - fix a bug, hat-tip to syosyo
  56. // version 0.2 - updated on 2008-06-25
  57. var pixivlink_run = 0;
  58. var pixivlink_reloadRequested = 0;
  59. var isNewManga = 1;
  60. var postProcImg = new Array();
  61. var preloadImg = new Array();
  62. var Imgs = new Array();
  63. var sessID1 = (/PHPSESSID=[0-9a-f]*?(?=;|$)/.exec(document.cookie) || "");
  64. var sessID2 = (/PHPSESSID=[^;]*?(?=;|$)/.exec(document.cookie) || "");
  65. var accessToken = GM_getValue("accessToken","");
  66. var oauthUserName = GM_getValue("userName","");
  67. var oauthPassword = GM_getValue("passWord","");
  68. var autoLogin = GM_getValue("autoLogin",false);
  69. var mangaFormat = 'jpg';
  70.  
  71. /*
  72. String.prototype.splitCSV = function(sep) {
  73. for (var foo = this.split(sep = sep || ","), x = foo.length - 1, tl; x >= 0; x--) {
  74. if (foo[x].replace(/"\s+$/, '"').charAt(foo[x].length - 1) == '"') {
  75. if ((tl = foo[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') {
  76. foo[x] = foo[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"');
  77. } else if (x) {
  78. foo.splice(x - 1, 2, [foo[x - 1], foo[x]].join(sep));
  79. } else foo = foo.shift().split(sep).concat(foo);
  80. } else foo[x].replace(/""/g, '"');
  81. } return foo;
  82. };*/
  83.  
  84. function _e(id) { return document.getElementById(id); }
  85.  
  86. function getElementsByClassName(matchClass) {
  87. var clselems = new Array();
  88. var elems = document.getElementsByTagName('*'), i;
  89. for (i in elems) {
  90. if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ')
  91. > -1) {
  92. clselems.push(elems[i]);
  93. }
  94. }
  95. return clselems;
  96. }
  97.  
  98. function createCookie(cookietext,days, domain) {
  99. if (days) {
  100. var date = new Date();
  101. date.setTime(date.getTime()+(days*24*60*60*1000));
  102. var expires = "; expires="+date.toGMTString();
  103. }
  104. else var expires = "";
  105. if (domain) domain = "; domain="+domain;
  106. else domain = "";
  107. document.cookie = cookietext+expires+domain+"; path=/";
  108. }
  109.  
  110. function doOAuth(obj) {
  111. var oauthUser, oauthPass, returnData;
  112. oauthUser = _e("oauthUsername").value;
  113. oauthPass = _e("oauthPassword").value;
  114. createCookie("PHPSESSID=",-1,""); // erase cookie first
  115. createCookie("PHPSESSID=",-1,".pixxiv.net"); // erase cookie first
  116. if(oauthUser && oauthPass) {
  117. GM_setValue("userName",oauthUser);
  118. GM_setValue("passWord",oauthPass);
  119. GM_xmlhttpRequest({
  120. url: 'https://oauth.secure.pixiv.net/auth/token',
  121. method: "POST",
  122. headers: {
  123. Referer: "http://www.pixiv.net",
  124. "Content-Type": "application/x-www-form-urlencoded"
  125. },
  126. data: "username="+oauthUser+"&password="+oauthPass+"&grant_type=password&client_id=bYGKuGVw91e0NMfPGp44euvGt59s&client_secret=HP3RmkgAmEGro0gn1x9ioawQE8WMfvLXDz3ZqxpK",
  127. onload: function (response) {
  128. if (response.status == 200) {
  129. returnData = JSON.parse(response.responseText);
  130. accessToken = returnData.response.access_token;
  131. GM_setValue("accessToken",accessToken);
  132. if(!autoLogin) alert("Login Sucessfully.");
  133. //createCookie(sessID1,0,""); // restore cookie first
  134. createCookie(sessID2,0,".pixiv.net"); // restore cookie first
  135. window.postMessage('refresh', '*'); //location.reload();
  136. } else {
  137. //createCookie(sessID1,0,""); // restore cookie first
  138. createCookie(sessID2,0,".pixiv.net"); // restore cookie first
  139. GM_setValue("autoLogin",false); // clear autologin flag
  140. alert("Login Failed!");
  141. }
  142. }
  143. });
  144. }
  145. }
  146.  
  147. function createOAuthLoginForm() {
  148. var tmp, newHTML = document.createElement ('div');
  149. newHTML.id = 'gmOAuthLoginFrm';
  150. newHTML.style.position='absolute';
  151. newHTML.style.backgroundColor='#fff';
  152. newHTML.style.top='0';
  153. newHTML.style.left='0';
  154. newHTML.style.zIndex='100';
  155. newHTML.appendChild(document.createTextNode('OAuth Login User: '));
  156. tmp = document.createElement ('input');
  157. tmp.id = 'oauthUsername';
  158. tmp.type = 'text';
  159. tmp.value = oauthUserName;
  160. newHTML.appendChild(tmp);
  161. newHTML.appendChild(document.createTextNode('Pass: '));
  162. tmp = document.createElement ('input');
  163. tmp.id = 'oauthPassword';
  164. tmp.type = 'password';
  165. tmp.value = oauthPassword;
  166. newHTML.appendChild(tmp);
  167. tmp = document.createElement ('input');
  168. tmp.id = 'oauthSubmit';
  169. tmp.type = 'button';
  170. tmp.value='Login';
  171. tmp.addEventListener("click", function(e){return doOAuth(e);}, false);
  172. newHTML.appendChild(tmp);
  173.  
  174. document.body.appendChild (newHTML);
  175. if(autoLogin) doOAuth(null);
  176. }
  177.  
  178. function checkTokenValid() {
  179. if(window==window.top) /* I'm NOT in a frame! */ {
  180. window.addEventListener('message', function(e) {
  181. if(e.data=='refresh') {
  182. if(!pixivlink_reloadRequested) {
  183. // GM_log(e.data);
  184. pixivlink_reloadRequested = 1;
  185. setTimeout("location.reload()",2000);
  186. }
  187. }
  188. }, false);
  189. }
  190.  
  191. if(getElementsByClassName('not-logged-in').length) {
  192. createCookie("PHPSESSID=",-1,""); // erase oauth cookie
  193.  
  194. var hobj;
  195. if(hobj=_e('login_pixiv_id')) hobj.value = oauthUserName;
  196. if(hobj=_e('login_password')) hobj.value = oauthPassword;
  197. /* for old login form */
  198. if(hobj=_e('pixiv_id')) hobj.value = oauthUserName;
  199. if(hobj=_e('password')) hobj.value = oauthPassword;
  200. if(window==window.top && (getElementsByClassName('signup-form__submit--login').length || getElementsByClassName('ui-button _login').length)) {
  201. var tmp, newHTML = document.createElement ('iframe');
  202. newHTML.setAttribute("src", "http://www.pixiv.net/tags.php");
  203. newHTML.id = 'gmAutoLoginFrame';
  204. newHTML.style.position='absolute';
  205. newHTML.style.backgroundColor='#fff';
  206. newHTML.style.top='-2000';
  207. newHTML.style.left='-2000';
  208. newHTML.height='1px';
  209. newHTML.width='1px';
  210. newHTML.style.zIndex='-100';
  211. document.body.appendChild (newHTML);
  212. }
  213. if(autoLogin) {
  214.  
  215. autoLogin = false;
  216. var loginForm;
  217. if(hobj=_e('login_password')) {
  218. loginForm = hobj.parentNode;
  219. do {
  220. if(loginForm.nodeName == 'FORM') {
  221. if(window!=window.top) {
  222. if(!pixivlink_reloadRequested) {
  223. pixivlink_reloadRequested = 1;
  224. window.top.postMessage('refresh', '*');
  225. }
  226. }
  227. // GM_log('called refresh! 1');
  228. loginForm.submit();
  229. }
  230. } while(loginForm = loginForm.parentNode);
  231. }
  232.  
  233. /* try old login form as well */
  234. if(hobj=_e('password')) {
  235. loginForm = hobj.parentNode;
  236. do {
  237. if(loginForm.nodeName == 'FORM') {
  238. if(window!=window.top) {
  239. if(!pixivlink_reloadRequested) {
  240. pixivlink_reloadRequested = 1;
  241. window.top.postMessage('refresh', '*');
  242. }
  243. }
  244. // GM_log('called refresh! 2');
  245. loginForm.submit();
  246. break;
  247. }
  248. } while(loginForm = loginForm.parentNode);
  249. }
  250. }
  251. } else {
  252. if(0 /* disabled */ && window!=window.top) /* I'm in a frame! */ {
  253. if(!pixivlink_reloadRequested) {
  254. pixivlink_reloadRequested = 1;
  255. window.top.postMessage('refresh', '*');
  256. }
  257. // GM_log('called refresh! 3');
  258. }
  259. }
  260. GM_xmlhttpRequest({
  261. url: 'https://public-api.secure.pixiv.net/v1/me/feeds.json',
  262. method: "GET",
  263. headers: {
  264. Referer: "http://www.pixiv.net",
  265. "Authorization": "Bearer " + accessToken,
  266. "Cookie": sessID1
  267. },
  268. onload: function (response) {
  269. if (response.status == 200) {
  270. //GM_log(response.responseText);
  271. /* var vals = JSON.parse(response.responseText);
  272. if(vals.status == "success") {
  273. }*/
  274. } else /*if (response.status == 400)*/ {
  275. accessToken ="";
  276. GM_setValue("accessToken",accessToken);
  277. createOAuthLoginForm();
  278. }
  279. }
  280. });
  281. }
  282.  
  283. function GetImageIDFromLink(imageLink) {
  284. var imgID = 0; // If lower 11319936 it means Manga does not have Big version
  285.  
  286. var re = /\d+([_a-z0-9]+)?\.(jpe?g|gif|png)\??.*$|id=[0-9]+$/;
  287. var s = re.exec(imageLink);
  288. if (s && s.length > 0) {
  289. re = /\d+/;
  290. imgID = re.exec(s[0])[0];
  291. }
  292. return imgID;
  293. }
  294.  
  295. function pixivlink() {
  296. //alert(pixivlink_run);
  297. if (!pixivlink_run) pixivlink_run = 1;
  298. else return;
  299. checkTokenValid();
  300. var Items = document.getElementsByTagName('img');
  301. var rexa = /\?mode\=medium\&illust_id|\?mode\=big\&illust_id/;
  302. var rexb = /source.pixiv.net/;
  303. var rexc = /\/img-inf\//;
  304. var rexd = /\/mobile\//;
  305. var rexe = /\/c\//;
  306. for (var i = 0; i < Items.length; i++) {
  307. var imgR = Items[i];
  308. var aR = imgR.parentNode.parentNode;
  309. var aR2 = imgR.parentNode;
  310. var isThumbnail = ((' ' + aR2.className + ' ').indexOf(' _layout-thumbnail ') > -1) //&& ((' ' + aR2.className + ' ').indexOf(' ui-modal-trigger ') > -1)
  311. //GM_log('aR2.className = "'+aR2.className+'", imgR.src='+imgR.src);
  312. //GM_log('isThumbnail = '+isThumbnail);
  313. if (rexa.test(aR2.href)/* || isThumbnail*/) {
  314. aR = aR2;
  315. }
  316. if (rexa.test(aR.href) || isThumbnail) {
  317. var imgID = GetImageIDFromLink(imgR.src);
  318. var srcR = imgR.src.replace(/_s\.|_m\.|_100\.|_64x64\./i, ".");
  319. // var hrefR = aR.href.replace(/medium/i, "big");
  320. var tdR = aR.parentNode;
  321. /* var linkB = document.createElement('a');
  322. linkB.href = hrefR;
  323. linkB.target = '_blank';
  324. linkB.style.padding = '0 2px';
  325. linkB.className = '_pxlazy';
  326. linkB.appendChild(document.createTextNode('[b]'));
  327. tdR.appendChild(linkB);*/
  328. // tdR.appendChild(document.createTextNode(' '));
  329. if (!rexb.test(srcR) && Imgs.indexOf(imgID) == -1) {
  330. var linkS = document.createElement('a');
  331. linkS.href = srcR;
  332. linkS.target = '_blank';
  333. linkS.className = '_pxlazy _pxlazy_s';
  334. linkS.setAttribute('id', 'ill_' + imgID);
  335. linkS.appendChild(document.createTextNode('[s]'));
  336. if (aR2.tagName.toUpperCase() == 'DIV' && imgR.className.toLowerCase().indexOf('thumbnail') == -1) {
  337. var targetelem = getElementsByClassName('works_display');
  338. if(targetelem.length) {
  339. targetelem[0].appendChild(linkS);
  340. } else {
  341. tdR.appendChild(linkS);
  342. }
  343. } else {
  344. tdR.appendChild(linkS);
  345. }
  346. if (rexc.test(imgR.src)||rexd.test(imgR.src)||rexe.test(imgR.src)) {
  347. //GM_log("postProcImg.push("+imgID+")"+imgR.src);
  348. postProcImg.push(imgID);
  349. }
  350. Imgs.push(imgID);
  351. }
  352. }
  353. }
  354.  
  355. if (postProcImg.length > 0) {
  356. for (var x = 0; x < postProcImg.length; x++) {
  357. if(accessToken) GM_xmlhttpRequest({
  358. url: 'https://public-api.secure.pixiv.net/v1/works/' + postProcImg[x] + '.json?image_sizes=large',
  359. method: "GET",
  360. headers: {
  361. Referer: "http://www.pixiv.net",
  362. "Authorization": "Bearer " + accessToken,
  363. "Cookie": sessID1
  364. },
  365. onload: function (response) {
  366. if (response.status == 200) {
  367. var rexb = /source.pixiv.net/;
  368. // var rexU = /\/c\//;
  369. var rexU = /_ugoira/;
  370. var rexe = /\/c\//;
  371. var vals = JSON.parse(response.responseText);
  372. /*var vtxt = '';
  373. for(var x=0;x < vals.length;x++)
  374. vtxt=vtxt+x+':'+vals[x]+"\n";
  375. GM_log(vtxt);*/
  376. if (vals.status == "success") {
  377. var slnk, imgID, isRestricted;
  378. isRestricted = rexb.test(vals.response[0].image_urls.large);
  379. isUgoira = rexU.test(vals.response[0].image_urls.large);
  380. // if (!isRestricted) {
  381. //GM_log("imgID = vals[0]");
  382. imgID = vals.response[0].id;
  383. /* } else {
  384. //GM_log("GetImageIDFromLink("+response.finalUrl+")");
  385. imgID = GetImageIDFromLink(response.finalUrl);
  386. }*/
  387. slnk = _e('ill_' + imgID);
  388. if (slnk) {
  389. var goodSlink;
  390. if (vals.response[0].is_manga) {
  391. goodSlink = 'http://www.pixiv.net/member_illust.php?mode=manga&illust_id=' + imgID;
  392. slnk.innerHTML = '[M]';
  393. } else {
  394. var re = new RegExp('/' + imgID + '_.*$');
  395. if (isUgoira) {// grab zip!
  396. //GM_log("isUgoira");
  397. slnk.innerHTML = '[U]';
  398. goodSlink = vals.response[0].image_urls.large.replace(/img-original/, 'img-zip-ugoira').replace(re, '/' + imgID + '_ugoira1920x1080.zip');
  399. /* } else if (rexe.test(vals[9])) {// new 480mw URL
  400. //GM_log("480mw");
  401. goodSlink = vals[9].replace(/c\/480x960\//, '').replace(/img-master/, 'img-original').replace(re, '/' + vals[0] + '_p0.' + vals[2]);
  402. } else if (!isRestricted && !rexe.test(vals[9])) {// use 480mw instead
  403. //GM_log("480mw");
  404. goodSlink = vals[9].replace(/mobile\//, '').replace(re, '/' + vals[0] + '.' + vals[2]);
  405. } else { //salvage from profile image
  406. //GM_log("salvage");
  407. re = /\/[0-9_]+\..*$/;
  408. goodSlink = vals[29].replace(/mobile\//, '').replace(/profile\//, 'img/').replace(re, '/' + imgID + '.' + vals[2]);
  409. */
  410. } else {
  411. goodSlink = vals.response[0].image_urls.large;
  412. }
  413. }
  414. slnk.href = goodSlink;
  415. slnk.title=vals.response[0].reuploaded_time;
  416. slnk.className = '_pxlazy _pxlazy_s _pxlazy_s_new';
  417. }
  418. }
  419. } else if (response.status == 400) {
  420. accessToken ="";
  421. GM_setValue("accessToken",accessToken);
  422. }
  423. }
  424. });
  425. }
  426. }
  427.  
  428. var links = document.getElementsByTagName('a');
  429. var tagslink = /tags\.php\?tag=/;
  430. for (var i = 0; i < links.length; i++) {
  431. if (tagslink.test(links[i].href))
  432. links[i].href = links[i].href.replace("tags.php?tag=", "search.php?s_mode=s_tag_full&word=");
  433. }
  434.  
  435. if (unsafeWindow.pixiv && unsafeWindow.pixiv.context.images) {
  436. var illustID = GetImageIDFromLink(unsafeWindow.pixiv.context.images[0]/*[0]*/);
  437. isNewManga = (illustID >= 11319936);
  438. //GM_log("illustID="+illustID);
  439. GM_xmlhttpRequest({
  440. url: 'https://public-api.secure.pixiv.net/v1/works/' + illustID + '.json?image_sizes=large',
  441. method: "GET",
  442. headers: {
  443. Referer: "http://www.pixiv.net",
  444. "Authorization": "Bearer " + accessToken,
  445. "Cookie": sessID1
  446. },
  447. onload: function (response) {
  448. if (response.status == 200) {
  449. //GM_log(response.responseText);
  450. var vals = JSON.parse(response.responseText);
  451. var rexe = /\/c\//;
  452. if(vals.status == "success") {
  453. mangaFormat = vals.response[0].metadata.pages[0].image_urls.large.split('.').pop();
  454. //GM_log(mangaFormat);
  455. /*var vtxt = '';
  456. for(var x=0;x < vals.length;x++)
  457. vtxt=vtxt+x+':'+vals[x]+"\n";
  458. GM_log(vtxt);*/
  459. //GM_log("2nd");
  460. /*if (rexe.test(vals[9]))*/ mangaFull();
  461. }
  462. } else if (response.status == 400) {
  463. accessToken ="";
  464. GM_setValue("accessToken",accessToken);
  465. }
  466. }
  467. });
  468. var rexe = /\/c\//;
  469. //GM_log("isNewManga");
  470. //setTimeout(mangaFull,250);
  471. //GM_log("2nd");
  472. // mangaFull();
  473. }
  474. }
  475.  
  476. var vp_w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0)
  477. var vp_h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
  478. function resizeImg(obj){
  479. console.log("resizeImg");
  480. var imgW=obj.width;
  481. var imgH=obj.height;
  482. var imgAR=imgW/imgH;
  483.  
  484. if(imgW > vp_w || imgH > vp_h) {
  485. if(imgAR < 1.0) {
  486. obj.height = vp_h*0.95;
  487. obj.width = obj.height*imgAR;
  488. } else {
  489. obj.width = vp_w*0.88;
  490. obj.height = obj.width/imgAR;
  491. }
  492. }
  493. }
  494.  
  495. function mangaFull() {
  496. Items = document.getElementsByTagName('img');
  497. var rexe = /\/img-/;
  498. for (var x = 0; x < unsafeWindow.pixiv.context.images.length; x++) {
  499. if (isNewManga) {
  500. if(rexe.test(unsafeWindow.pixiv.context.images[x]))
  501. unsafeWindow.pixiv.context.images[x]/*[0]*/ = unsafeWindow.pixiv.context.images[x]/*[0]*/.replace(/c\/1200x1200\//, '').replace(/img-master/, 'img-original').replace(/_p(\d+).*(\.[a-zA-Z\?\d]+)$/, "_p$1."+mangaFormat);
  502. else
  503. unsafeWindow.pixiv.context.images[x]/*[0]*/ = unsafeWindow.pixiv.context.images[x]/*[0]*/.replace(/_p(\d+\.[a-zA-Z\?\d]+)$/, "_big_p$1");
  504. }
  505. preloadImg.push(new Image());
  506. preloadImg[preloadImg.length - 1].src = unsafeWindow.pixiv.context.images[x]/*[0]*/;
  507. }
  508.  
  509. for (var x = 0; x < Items.length; x++) {
  510. var datasrc = Items[x].getAttribute("data-src");
  511. if (datasrc) {
  512. //GM_log("original-datasrc="+datasrc+" ,mangaFormat="+mangaFormat);
  513. if(rexe.test(datasrc))
  514. datasrc = datasrc.replace(/c\/1200x1200\//, '').replace(/img-master/, 'img-original').replace(/_p(\d+).*(\.[a-zA-Z\?\d]+)$/, "_p$1."+mangaFormat);
  515. else
  516. datasrc = datasrc.replace(/_p(\d+\.[a-zA-Z\?\d]+)$/, "_big_p$1");
  517. //GM_log("new-datasrc="+datasrc+" ,mangaFormat="+mangaFormat);
  518. }
  519. Items[x].setAttribute("data-src", datasrc);
  520. Items[x].addEventListener('load', function(e) {resizeImg(e.target);},true);
  521. if (isNewManga) {
  522. //GM_log(x+".src="+Items[x].src);
  523. if(datasrc)
  524. Items[x].src = datasrc;
  525. else if(rexe.test(Items[x].src))
  526. Items[x].src = Items[x].src.replace(/c\/1200x1200\//, '').replace(/img-master/, 'img-original').replace(/_p(\d+).*(\.[a-zA-Z\?\d]+)$/, "_p$1$2");
  527. else
  528. Items[x].src = datasrc ? datasrc : Items[x].src.replace(/_p(\d+\.[a-zA-Z\?\d]+)$/, "_big_p$1");
  529. }
  530. }
  531. }
  532.  
  533. if(!autoLogin) {
  534. GM_registerMenuCommand("Enable Auto Login", function(){
  535. GM_setValue("autoLogin",true);
  536. });
  537. } else {
  538. GM_registerMenuCommand("Disable Auto Login", function(){
  539. GM_setValue("autoLogin",false);
  540. });
  541. }
  542. window.addEventListener("load", pixivlink, true);