EX Better Thumbnails

Provides infinite scroll and larger thumbnails for gallery browsing.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         EX Better Thumbnails
// @description      Provides infinite scroll and larger thumbnails for gallery browsing. 
// @version      0.63
// @match        https://exhentai.org/g/*
// @grant        none
// @namespace https://greasyfork.org/users/13871
// ==/UserScript==

const titleInputBoxMode = false;

var thisURL = document.createElement("a");
thisURL.href = document.URL;
var i = 0;
var URLGen = URLGenerator();
var fileCount;
var len = 0;
var gdata;
const jQueryCDN = "https://code.jquery.com/jquery-1.11.3.min.js";
const api = "https://exhentai.org/api.php";

const CSSCode = ".select {float: left}";

function loadJS(URL, callback) {
    var js = document.createElement("script");
    js.type = "text/javascript";
    js.src = URL;
    if (callback) {
        js.onload = callback;
    }
    document.head.appendChild(js);
}

(function() {
    callback = function() {
        changeLayout();
        injectCSS();
        // injectBar();
        request(gid, token);
        main();
    }
    loadJS(jQueryCDN, callback);
})();

function injectCSS() {
    var css = $("<style></style>");
    css.html(CSSCode);
    $("body").append(css);
}

function injectBar() {
    $('<div id="controlbar"></div>').prependTo($("#gdt"));
    var button = $('<button id="debug">debug</button>').click(function() {listChecked();});
    $('#controlbar').append(button);
}

function request(gid, token) {
    var data = {
        method: "gdata",
        gidlist: [
            [gid, token]
        ]
    };
    data = JSON.stringify(data);
    var r = $.ajax({
        url: api,
        data: data,
        dataType: "JSON",
        type: "POST",
        contentType: "application/json",
        success: function(res, error) {
            gdata = res;
            fileCount = Number(gdata["gmetadata"][0]["filecount"]);
            console.log("File count: " + fileCount);
        }
    });
}

function* URLGenerator() {
    var base = thisURL.protocol + "//" + thisURL.hostname + thisURL.pathname + "?inline_set=ts_l";
    while (true) {
        yield base + "&" + "p=" + i;
        i += 1;
    }
}

function openPageURL(URL, elem) {
    var callback = function(data) {
        var DOM = $.parseHTML(data);
        var imgURL = $(DOM).find("#img").prop("src");
        var original = ""
        try {
            original = $(DOM).find("#i7").find("a").prop("href");
        } catch (err) {
            console.log(err);
        }
        if (original) {
            imgURL = original;
        }
        if (elem) {
            var k = document.createElement('a');
            k.href = imgURL;
            k.download = true;
            k.click();
            k.remove();
        }
    }
    $.get(URL, callback);
}

function insert(URL) {
    $.get(URL, function(data) {
        var DOM = $.parseHTML(data);
        $(DOM).find(".gdtl").each(function() {
            var title = $(this).find("img").prop("title");
            var fname = title
            var caption = $('<div class="caption"></div>');
            $(caption).appendTo(this);
            var pageURL = $(this).find("a").prop("href");
            $(caption).html("<a href=" + '"javascript: void(0);"' +">"+ fname + "</a>");
            $(caption).find("a").click(function() {
                openPageURL(pageURL, $(caption).find("a"));
            });
            $("#gdt > .c").before(this);
            $(this).hide().fadeIn();
        });
    })
}

function call() {
    var url = URLGen.next().value;
    console.log(url);
    insert(url);
}

function changeLayout() {
    if (titleInputBoxMode) {
        var i =$( '<input type="text" value=""></input>');
        i.prop("value", $("#gn").html());
        $("#gn").html(i);
    }
    $("#asm, #gdo, .gtb, #frontpage").remove();
    var thumbnails = document.getElementById("gdt");
    document.body.insertBefore(thumbnails, document.body.lastChild);
    $(".gdtm, .gdtl").each(function() {
        $(this).remove()
    })
}

function main() {
    if (len == 0) {
        call();
    }
    $(window).scroll(function() {
        len = $(".gdtl").length;
        if (len < fileCount && window.innerHeight + window.scrollY >= document.body.offsetHeight) {
            call();
        }
    })
}