Greasy Fork

Greasy Fork is available in English.

Pixiv Display All Images

Display all manga images automatically: no need to click the medium image.

目前为 2018-09-18 提交的版本。查看 最新版本

// ==UserScript==
// @name         Pixiv Display All Images
// @namespace    superschwul
// @version      2.1
// @description  Display all manga images automatically: no need to click the medium image.
// @homepageURL  http://greasyfork.icu/en/scripts/36886-pixiv-display-all-images
// @author       Superschwul
// @match        https://www.pixiv.net/stacc*
// @match        https://www.pixiv.net/member*
// @match        https://www.pixiv.net/bookmark*
// @run-at       document-end
// ==/UserScript==

// ===============================================================================

// USER OPTIONS
var FIT_IMAGES_TO_SCREEN_WIDTH_AND_HEIGHT = false;
var LOAD_HIGH_RESOLUTION_IMAGES = false;

// ===============================================================================

// CHANGELOG
// 2.1 2018-09-18 refactoring, bigger fixed avatar
// 2.0 2018-09-14 better ajax support
// 1.8 2018-09-13 added new member page support
// 1.7 2018-09-11 added ajax thumbs support
// 1.6 2018-09-02 fixed missing like button
// 1.5 2018-08-29 improved image src identification
// 1.4 2018-08-26 added hi-res option, improved avatar timing
// 1.3 2018-08-16 removed feedback button
// 1.2 2018-08-16 disabled sticky bar, added fit-to-screen option
// 1.1 2018-06-21 fixed image src url
// 1.0 2018-06-17 show original instead of master manga images
// 0.8 2018-06-15 added fixed avatar
// 0.7 2018-06-13 added link to works page at illustration page
// 0.6 2018-06-12 updated to work with the new pixiv layout
// 0.5 2018-01-07 hide buttons over thumbnails at works page
// 0.4 2018-01-04 enlarge thumbnails at works page
// 0.3 2018-01-03 replaced gm_xmlhttprequest by xmlhttprequest
// 0.2 2017-12-30 added support for rtl manga pages
// 0.1 2017-12-30 initial code

// ===============================================================================

function addMemberPageLink() {
    var interval = myInterval(function() {
        var usernames = document.getElementsByClassName('stacc_ref_illust_user_name');
        if(usernames != undefined) {
            clearInterval(interval);
            for(var username of usernames) {
                username.style.display = 'block';
                var usernameLink = username.getElementsByTagName('a')[0];
                var memberPageLink = document.createElement('a');
                memberPageLink.href = usernameLink.href.replace('member', 'member_illust').replace(/&from_sid=\d+/, '');
                memberPageLink.target = '_blank';
                memberPageLink.style.display = 'block';
                memberPageLink.appendChild(document.createTextNode("More works"));
                username.appendChild(memberPageLink);
            }
        }
    });
}

function processIllustrationPage() {
    getFigure();
    getAvatar();
}

function getFigure() {
    var interval = myInterval(function() {
        var figure = document.getElementsByTagName('figure')[0];
        if(figure != undefined) {
            clearInterval(interval);
            var figureObserver = new MutationObserver(addGallery);
            figureObserver.observe(figure, {childList: true});
            addGallery();
        }
    });
}

function removeGallery() {
    var gallery = document.getElementById('pil_gallery');
    if(gallery != undefined) {
        gallery.parentNode.removeChild(gallery);
    }
}

function addGallery() {
    removeGallery();
    var gallery = document.createElement('div');
    gallery.id = 'pil_gallery';
    var header = document.getElementsByTagName('header')[0];
    header.parentNode.insertBefore(gallery, header.nextSibling);
    getImagesForGallery();
    addFixedAvatar();
}

function getImagesForGallery() {
    //get thumb
    var interval = myInterval(function() {
        var outer = document.getElementsByTagName('figure')[0].children[0].children[0].children[0];
        if(outer != undefined) {
            if(outer.tagName == 'CANVAS') {
                clearInterval(interval);
                return; //gif
            }
            if(outer.children[0] == undefined) {
                clearInterval(interval);
                getMultipleVerticalImages(); //multiple
                return;
            }
            if(outer.children[0] != undefined &&
               outer.children[0].tagName == 'A' &&
               outer.getElementsByTagName('img')[0].src != unsafeWindow.location.href) {
                clearInterval(interval);
                getSingleImage(); //single
            }
        }
    });
}

function getSingleImage() {
    var images = [];
    var thumb = document.getElementsByTagName('figure')[0].children[0].children[0].children[0].children[0];
    var image = {original: thumb.href};
    image.master = thumb.getElementsByTagName('img')[0].src;
    images.push(image);
    fillGallery(images);
}

function getMultipleVerticalImages() {
    var url = unsafeWindow.location.href.replace('medium', 'manga');
    var req = new XMLHttpRequest();
    req.addEventListener("load", function() {
        var images = [];
        var parser = new DOMParser();
        var responseDoc = parser.parseFromString(this.responseText, "text/html");
        var itemContainers = responseDoc.getElementsByClassName('item-container');
        if(itemContainers.length == 0) {
            getMultipleRtlImages(responseDoc);
            return;
        }
        for(var itemContainer of itemContainers) {
            var item = itemContainer.getElementsByTagName('img')[0];
            var image = {master: item.dataset.src};
            images.push(image);
        }
        fillGallery(images);
    });
    req.open('GET', url);
    req.send();
}

function getMultipleRtlImages(responseDoc) {
    var images = [];
    var scriptTags = responseDoc.getElementsByTagName('script');
    for(var scriptTag of scriptTags) {
        if(scriptTag.textContent.search('pixiv.context.images\\[') != -1) {
            var image = {master: scriptTag.textContent.split(';')[0].split('"')[1].replace(/\\/g, '')};
            images.push(image);
        }
    }
    fillGallery(images);
}

function swapExt(image) {
    this.onerror = null;
    var ext = this.src.substr(this.src.length - 3);
    var swap = { jpg: 'png', png: 'jpg' };
    this.src = this.src.replace(ext, swap[ext]);
}

function fillGallery(images) {
    var gallery = document.getElementById('pil_gallery');
    var i=0;
    for(var item of images) {
        //legend
        var legend = document.createElement('p');
        var legendText = document.createTextNode('Image ' + ++i + ' of ' + images.length);
        legend.appendChild(legendText);
        gallery.appendChild(legend);
        //container
        var container = document.createElement('div');
        var image = document.createElement('img');
        if(item.original == undefined) {
            item.original = item.master.replace('img-master', 'img-original').replace('_master1200', '');
            image.onerror = swapExt;
        }
        if(LOAD_HIGH_RESOLUTION_IMAGES) {
            image.src = item.original;
            container.appendChild(image);
        } else {
            image.src = item.master;
            var originalLink = document.createElement('a');
            originalLink.href = item.original;
            originalLink.appendChild(image);
            container.appendChild(originalLink);
        }
        gallery.appendChild(container);
    }
}

function getAvatar() {
    var interval = myInterval(function() {
        var aside = document.getElementsByTagName('aside')[1];
        if(aside != undefined) {
            var avatar = aside.children[0].children[0];
            if(avatar.children[0] != undefined && avatar.children[0].href != undefined) {
                clearInterval(interval);
                var avatarObserver = new MutationObserver(addFixedAvatar);
                avatarObserver.observe(avatar.children[0], {attributeFilter: ['href']});
                addFixedAvatar();
            }
        }
    });
}

function addFixedAvatar() {
    var avatar = document.getElementsByTagName('aside')[1].children[0].children[0];
    var gallery = document.getElementById('pil_gallery');
    if(avatar.children[0].href == undefined || gallery == null) {
        return;
    }
    //add link to member page
    var pilMemberLink = document.getElementById('pil_memberLink');
    if(pilMemberLink != null) {
        pilMemberLink.parentNode.removeChild(pilMemberLink);
    }
    var memberLink = document.createElement('a');
    memberLink.id = 'pil_memberLink';
    memberLink.href = avatar.children[0].href.replace('member', 'member_illust');
    memberLink.appendChild(document.createTextNode('More works'));
    avatar.parentNode.insertBefore(memberLink, avatar.nextSibling);
    //add fixed avatar
    var pilFixedAvatar = document.getElementById('pil_fixedAvatar');
    if(pilFixedAvatar != null) {
        pilFixedAvatar.parentNode.removeChild(pilFixedAvatar);
    }
    var fixedAvatar = document.createElement('div');
    fixedAvatar.id = 'pil_fixedAvatar';
    fixedAvatar.appendChild(avatar.cloneNode(true));
    var links = fixedAvatar.getElementsByTagName('a');
    for(var link of links) {
        link.href = link.href.replace('member', 'member_illust');
        if(link.style != undefined) {
            link.style.backgroundImage = link.style.backgroundImage.replace('_50.', '_170.') + ', ' + link.style.backgroundImage;
        }
    }
    gallery.appendChild(fixedAvatar);
}

function setStyles() {
    var style = document.createElement('style');
    style.type = 'text/css';
    var styleCode = `
        #pil_main + div {
            display: none;
        }
        #pil_gallery {
            padding: 3em;
            text-align: center;
            color: #b3c1d2;
            border-bottom: solid 1px white;
            margin-bottom: 4em;
            background: #ededed;
        }
        #pil_gallery img {
            display: block;
            margin: 0 auto 3em auto;
            max-width: 100%;
            height: auto;
            background: #dcdbdb;
    `;
    if(FIT_IMAGES_TO_SCREEN_WIDTH_AND_HEIGHT) {
        styleCode += 'max-height: 90vh';
    }
    styleCode += `
        }
        figure > div:nth-child(2) > div {
            position: unset !important;
        }
        #pil_memberLink {
            width: 93%;
            padding: 0.5em;
            background: white;
            text-align: center;
            display: block;
            border-radius: 1em;
            margin-top: 1em;
            font-weight: bold;
            text-decoration: none;
            font-size: 80%;
        }
        #pil_memberLink:visited {
            color: #bbb;
        }
        #pil_fixedAvatar {
            text-align: left;
            position: fixed;
            left: 1.6em;
            bottom: 2em;
            width: 264px;
            z-index: 998;
        }
        #pil_fixedAvatar a:visited {
            color: #bbb;
        }
        #pil_fixedAvatar > div > a {
            width: 100px;
            height: 100px;
            background-color: white;
        }
        .gtm-illust-recommend-zone {
            z-index: 999;
            position: relative;
            background: #f5f5f5;
        }
        a.stacc_unify_comment_count {
            text-align: left !important;
        }
        .stacc_timeline_bottom {
            font-size: 200%;
        }
    `;
    style.innerHTML = styleCode;
    document.getElementsByTagName('head')[0].appendChild(style);
}

function getMainDiv() {
    var interval = myInterval(function() {
        var header = document.getElementsByTagName('header')[0];
        if(header != undefined) {
            var main = header.nextElementSibling;
            if(main != undefined) {
                clearInterval(interval);
                main.id = 'pil_main';
                processPage();
                var mainObserver = new MutationObserver(processPage);
                mainObserver.observe(main, {childList: true});
            }
        }
    });
}

function processPage() {
    if(document.getElementById('pil_main').children[0].style.display == 'flex') {
        return;
    }
    removeGallery();
    // stacc page
    if(unsafeWindow.location.href.search('stacc') != -1) {
        addMemberPageLink();
    }
    // illustration page
    if(unsafeWindow.location.href.search('medium') != -1) {
        processIllustrationPage();
    }
}

function myInterval(callback) {
    var intervalCount = 0;
    var interval = setInterval(function() {
        intervalCount++;
        if(intervalCount >= 100) {
            clearInterval(interval);
            return;
        }
        callback();
    }, 200);
    return interval;
}


(function() {
    'use strict';
    if (window.top != window.self) {
        return;
    }
    setStyles();
    getMainDiv();
})();