// ==UserScript== // @name Pixiv Old Manga Viewer // @namespace d24193d9-3b5f-43d8-a625-49e32c476534 // @description Rewrite new style manga view to be more like the old style, uses full size images. // @version 1.0.19 // @author ixzkn // @icon https://www.pixiv.net/favicon.ico // @include https://www.pixiv.net/member_illust.php?mode=* // @run-at document-start // @downloadURL https://update.greasyfork.icu/scripts/371719/Pixiv%20Old%20Manga%20Viewer.user.js // @updateURL https://update.greasyfork.icu/scripts/371719/Pixiv%20Old%20Manga%20Viewer.meta.js // ==/UserScript== (function() { // Config: Always just go straight to the manga page (even in medium mode) var alwaysLoadManga = false; // use original size images or 1200 size var useOriginalImageSize = true; 'use strict'; document.addEventListener('DOMContentLoaded', function() { if(globalInitData == undefined) { return false; } function apply(){ function getProp(obj){ for (var i in obj){if(obj.hasOwnProperty(i)){return i;}} } // using Pixiv's own globalInitData, reconstruct all of the full URLs of the // manga's images function allFullURLs(original){ let tzoffset = 9; // pixiv's timezone offset let baseurl = original ? "https://i.pximg.net/img-original/img/" : "https://i.pximg.net/img-master/img/"; let filepostfix = original ? "" : "_master1200"; function pad(n, width, z) { z = z || '0'; n = n + ''; return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } function fileType(url) { return url.substring(url.lastIndexOf(".")) } // derive the image list from init data: // could also derive from original url function pixivOriginalURL(createDate,id,page,url){ let d = new Date((new Date(createDate)).getTime() + (3600000*tzoffset)); let durl = d.getUTCFullYear() + "/" + pad(d.getUTCMonth()+1,2,"0") + "/" + pad(d.getUTCDate(),2,"0") + "/" + pad(d.getUTCHours(),2,"0") + "/" + pad(d.getUTCMinutes(),2,"0") + "/" + pad(d.getUTCSeconds(),2,"0") + "/"; return baseurl + durl + id + "_p" + page + filepostfix + fileType(url); } var id = getProp(globalInitData.preload.illust); var pages = globalInitData.preload.illust[id].pageCount; var results = []; var urlBase = original ? globalInitData.preload.illust[id].urls.original : globalInitData.preload.illust[id].urls.regular; for(var i = 0; i < pages; i++) { results.push(pixivOriginalURL(globalInitData.preload.illust[id].uploadDate,id,i,urlBase)); } return results; } let user = getProp(globalInitData.preload.user); var images = allFullURLs(useOriginalImageSize); var imagesOrig = allFullURLs(true); var result = `
`; // User info: result += ``; result += ``; result += ``+globalInitData.preload.user[user].name+`
`; // Manga images: for (var i = 0; i < images.length; i++) { result += `
`; let href = images[i]; result += ``; result += `
`+(i+1)+`/`+images.length+`
`; result += `
`; } result += `
`; let original = document.body.innerHTML; let id = getProp(globalInitData.preload.illust); document.body.innerHTML = result; document.getElementById("back").addEventListener("click",function(e){ window.location.assign("https://www.pixiv.net/member_illust.php?mode=medium&illust_id="+id); }); let currentOffset = 0; document.body.addEventListener("keydown",function(e){ if(e.key == 'j'){ currentOffset++; window.scroll(0,currentOffset*document.documentElement.clientHeight); } if(e.key == 'k') { currentOffset--; window.scroll(0,currentOffset*document.documentElement.clientHeight); } }); } if(alwaysLoadManga) { apply(); } else { if(window.location.search.toString().indexOf("mode=manga") != -1) { apply(); } else { var observer = undefined; var targetNode = document.getElementById("root"); if(targetNode == undefined){ return false; } var callback = function(mutationsList) { var search = document.querySelector("article > div > figure a"); var search2 = document.querySelector("article > div > figure > div > div > button"); if(search != undefined && search2 != undefined) { if(observer){ observer.disconnect(); } search.addEventListener('click',function(e){ apply(); e.preventDefault(); return false; }); search2.addEventListener('click',function(e){ apply(); e.preventDefault(); return false; }); } }; var observer = new MutationObserver(callback); observer.observe(targetNode, { attributes: true, childList: true, subtree: true }); } } }, this); })();