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-02 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Pixiv Display All Images
// @namespace    superschwul
// @version      1.6
// @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_illust.php*
// @grant        window.close
// @run-at       document-end
// ==/UserScript==

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

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

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

// CHANGELOG
// 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 addLinkToWorksPageAtStaccPage() {
    // override css
    var style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = `
        a.stacc_unify_comment_count {
            text-align: left !important;
        }
        .stacc_timeline_bottom {
            font-size: 200%;
        }
    `;
    document.getElementsByTagName('head')[0].appendChild(style);
    // add link
    var intervalCount = 0;
    var interval = setInterval(function() {
        intervalCount++;
        if(intervalCount >= 300) {
            clearInterval(interval);
            return;
        }
        var usernames = document.getElementsByClassName('stacc_ref_illust_user_name');
        if(usernames != undefined) {
            clearInterval(interval);
            var i = 0;
            for(i=0; i < usernames.length; i++) {
                usernames[i].style.display = 'block';
                var link = usernames[i].getElementsByTagName('a')[0].href;
                link = link.replace('member', 'member_illust');
                link = link.replace(/&from_sid=\d+/, '');
                var a = document.createElement('a');
                a.href = link;
                a.target = '_blank';
                a.style.display = 'block';
                a.appendChild(document.createTextNode("Go to Works page"));
                usernames[i].appendChild(a);
            }
        }
    }, 200);
}

function displayGalleryAtIllustrationPage() {
    // override css
    var style = document.createElement('style');
    style.type = 'text/css';
    var styleCode = `
        body {
            background: #f5f5f5 !important;
        }
        #pil_gallery {
            padding: 3em;
            text-align: center;
            color: #b3c1d2;
        }
        #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_works {
            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_works:visited {
            color: #ccc;
        }
        #pil_fixedAvatar {
            position: fixed;
            left: 1.6em;
            bottom: 2em;
            width: 204px;
        }
        #root > div:nth-child(4) > button {
            display: none;
        }
        #root > div:nth-child(4) > ul {
            bottom: 2em;
        }
    `;
    style.innerHTML = styleCode;
    document.getElementsByTagName('head')[0].appendChild(style);
    //is it a single image, multiple vertical, or multiple rtl?
    var type = 'single';
    var intervalCount = 0;
    var interval = setInterval(function() {
        intervalCount++;
        if(intervalCount >= 300) {
            clearInterval(interval);
            return;
        }
        var article = document.getElementsByTagName('article')[0];
        var thumb;
        if(article != undefined) {
            thumb = article.getElementsByTagName('a')[0];
        }
        if(thumb != undefined) {
            var imgSrc = thumb.getElementsByTagName('img')[0].src;
            if(imgSrc != unsafeWindow.location.href) {
                clearInterval(interval);
                if(thumb.pathname == '/member_illust.php') {
                    type = 'vertical';
                }
                addLinkToWorksPageAtIllustPage();
                addFixedAvatar();
                //get original images and fill gallery
                if(type == 'single') {
                    getSingleOriginalImage(thumb);
                } else {
                    getMultipleVerticalOriginalImages();
                }
            }
        }
    }, 200);
}

function addLinkToWorksPageAtIllustPage() {
    var intervalAvatarCount = 0;
    var intervalAvatar = setInterval(function() {
        intervalAvatarCount++;
        if(intervalAvatarCount >= 300) {
            clearInterval(intervalAvatar);
            return;
        }
        var avatar = document.getElementsByTagName('aside')[1].children[0].children[0];
        if(avatar.children[0] != undefined) {
            clearInterval(intervalAvatar);
            var link = document.createElement('a');
            link.id = 'pil_works';
            link.href = avatar.children[0].href.replace('member', 'member_illust');
            link.appendChild(document.createTextNode('More works'));
            avatar.parentNode.insertBefore(link, avatar.nextSibling);
        }
    }, 200);
}

function addFixedAvatar() {
    var avatar = document.getElementsByTagName('aside')[1].children[0].children[0];
    var fixedAvatar = document.createElement('div');
    fixedAvatar.id = 'pil_fixedAvatar';
    fixedAvatar.appendChild(avatar.cloneNode(true));
    var links = fixedAvatar.getElementsByTagName('a');
    var i = 0;
    for(i=0; i < links.length; i++) {
        links[i].href = links[i].href.replace('member', 'member_illust');
    }
    document.body.appendChild(fixedAvatar);
}

function getSingleOriginalImage(thumb) {
    var images = [];
    var image = document.createElement('img');
    image.src = thumb.href; // original
    var imageContainer = document.createElement('div');
    if(LOAD_HIGH_RESOLUTION_IMAGES) {
        imageContainer.innerHTML = '<img src="' +image.src+ '"></a>';
    } else {
        image.src = thumb.getElementsByTagName('img')[0].src;
        image.dataset.original = thumb.href;
        imageContainer.innerHTML = '<a href="' +image.dataset.original+ '"><img src="' +image.src+ '"></a>';
    }
    images.push(imageContainer);
    fillGallery(images);
}

function getMultipleVerticalOriginalImages() {
    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 imageContainers = responseDoc.getElementsByClassName('item-container');
        if(imageContainers.length == 0) {
            getMultipleRtlOriginalImages(responseDoc);
            return;
        }
        var i = 0;
        for(i=0; i < imageContainers.length; i++) {
            var image = imageContainers[i].getElementsByTagName('img')[0];
            image.src = image.dataset.src; //master
            var originalSrc = image.src.replace('img-master', 'img-original');
            originalSrc = originalSrc.replace('_master1200', '');
            image.dataset.original = originalSrc;
            var imageContainer = document.createElement('div');
            if(LOAD_HIGH_RESOLUTION_IMAGES) {
                image.src = originalSrc;
                delete image.dataset.original;
                var altExt = swapExt(image.src);
                imageContainer.innerHTML = '<img src="' +image.src+ '" onerror="this.onerror=null; this.src=\'' +altExt+ '\';">';
            } else {
                imageContainer.innerHTML = '<a href="' +image.dataset.original+ '"><img src="' +image.src+ '"></a>';
            }
            images.push(imageContainer);
        }
        fillGallery(images);
    });
    req.open('GET', url);
    req.send();
}

function getMultipleRtlOriginalImages(responseDoc) {
    var images = [];
    var scriptTags = responseDoc.getElementsByTagName('script');
    var i = 0;
    for(i=0; i < scriptTags.length; i++) {
        if(scriptTags[i].textContent.search('pixiv.context.images\\[') != -1) {
            var imageVar = scriptTags[i].textContent.split(';')[0];
            var imageUrl = imageVar.split('"')[1].replace(/\\/g, '');
            var image = document.createElement('img');
            image.src = imageUrl; //master
            var originalSrc = image.src.replace('img-master', 'img-original');
            originalSrc = originalSrc.replace('_master1200', '');
            image.dataset.original = originalSrc;
            var imageContainer = document.createElement('div');
            if(LOAD_HIGH_RESOLUTION_IMAGES) {
                image.src = originalSrc;
                delete image.dataset.original;
                var altExt = swapExt(image.src);
                imageContainer.innerHTML = '<img src="' +image.src+ '" onerror="this.onerror=null; this.src=\'' +altExt+ '\';">';
            } else {
                imageContainer.innerHTML = '<a href="' +image.dataset.original+ '"><img src="' +image.src+ '"></a>';
            }
            images.push(imageContainer);
        }
    }
    fillGallery(images);
}

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

function fillGallery(images) {
    var gallery = document.createElement('div');
    gallery.id = 'pil_gallery';
    var i = 0;
    for(i=0; i < images.length; i++) {
        var p = document.createElement('p');
        i++;
        var pText = document.createTextNode('Image ' + i + ' of ' + images.length);
        i--;
        p.appendChild(pText);
        gallery.appendChild(p);
        //images[i].onclick = function(){ window.close(); }; // OPTIONAL
        gallery.appendChild(images[i]);
    }
    var header = document.getElementsByTagName('header')[0];
    header.parentNode.insertBefore(gallery, header.nextSibling);
}

function enlargeThumbsAtWorksPage() {
    // override css
    var style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = `
        .manage-unit .image-item {
            width: 220px;
        }
        ._work.work {
            width: 220px;
            height: 220px;
        }
        .image-item img {
            object-fit: contain;
            width: 220px;
            height: 220px;
        }
        ._one-click-bookmark,
        .thumbnail-menu {
            display: none; /* OPTIONAL */
        }
    `;
    document.getElementsByTagName('head')[0].appendChild(style);
}

(function() {
    'use strict';
    if (window.top != window.self) {
        return;
    }
    // run on stacc page
    if(unsafeWindow.location.href.search('stacc') != -1) {
        addLinkToWorksPageAtStaccPage();
    }
    // run on works page
    if(unsafeWindow.location.href.search('member_illust') != -1 &&
    unsafeWindow.location.href.search('mode') == -1) {
        enlargeThumbsAtWorksPage();
    }
    // run on illustration page
    if(unsafeWindow.location.href.search('medium') != -1) {
        displayGalleryAtIllustrationPage();
    }
})();