Sleazy Fork is available in English.

ExHentai autoscroll and next

automatic scroll and next for easier, handless reading of exHentai galleries

// ==UserScript==
// @name         ExHentai autoscroll and next
// @namespace    none
// @version      0.1
// @description  automatic scroll and next for easier, handless reading of exHentai galleries
// @author       saddestpandaever
// @match        *://exhentai.org/s/*
// ==/UserScript==

(function() {
    'use strict';
    var header = document.getElementsByTagName("h1")[0];
    var button = document.createElement("button");
    button.innerHTML = "Start scrolling";
    button.onclick = function(){
        scrollDown(20);
    };
    header.appendChild(button);
})();

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function clickNext(next){
    await sleep(2000);
    next.click();
}

async function scrollDown(delay){

    var windowScrollBottom, botDiv = document.getElementById("i4"), next = document.getElementById("next"), imagediv = document.getElementById("i3");

    var plus = document.createElement("button"), minus=document.createElement("button"), pause = document.createElement("button"), paused=false, speedindicator = document.createElement("text");
    plus.innerHTML = "+"; minus.innerHTML = "-"; pause.innerHTML = "P"; speedindicator.innerHTML = Math.floor(1000/delay)+"px/s";
    plus.setAttribute("style", "width:30; height:30; margin-left: -30px; background-color: #666666; position:fixed");
    minus.setAttribute("style", "width:30; height:30; margin-left: -30px; background-color: #666666; margin-top: 20px; position:fixed");
    pause.setAttribute("style", "width:30; height:30; margin-left: -30px; background-color: #666666; margin-top: 40px; position:fixed");
    speedindicator.setAttribute("style", "width:30; height:30; margin-left: -30px; margin-top: 65px; position:fixed");
    function updateSpeedIndicator(){
        speedindicator.innerHTML = Math.floor(1000/delay) + "px/s";
    }

    plus.onclick = function() {
        if(delay > 2) delay=delay-2;
        updateSpeedIndicator();
    };
    minus.onclick = function() {
        delay=delay+2;
        updateSpeedIndicator();

    };
    pause.onclick = function() {
        paused=!paused;
    };
    imagediv.prepend(plus, minus, pause,speedindicator);


    while(true){
        while(paused){ await sleep(10);}

        await sleep(delay);
        window.scrollBy(0, 1);
        windowScrollBottom=window.pageYOffset + window.innerHeight;

        if(windowScrollBottom > botDiv.offsetTop){
            next = document.getElementById("next");
            await sleep(1500);//ms to stay at the bottom of the page before going to the next
            await clickNext(next);
            await sleep(300);

            imagediv = document.getElementById("i3");
            await imagediv.scrollIntoView();
            imagediv.prepend(plus, minus, pause,speedindicator);

            await sleep(1500);//ms before starting to scroll
        }
    }
}