Infinite Scroll

Infinite scrolling for March 2019 layout redesign.

Versión del día 21/03/2022. Echa un vistazo a la versión más reciente.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Infinite Scroll
// @author       Hauffen
// @description  Infinite scrolling for March 2019 layout redesign.
// @version      2.28.4
// @include      /https?:\/\/(e-|ex)hentai\.org\/.*/
// @require      https://code.jquery.com/jquery-3.3.1.min.js
// @namespace    https://greasyfork.org/users/285675
// @license      MIT
// ==/UserScript==

(function() {
var url = document.URL, $ = window.jQuery;
var page = 0, cpage = 0, max = 0;
var query, nextUrl;
var setting = localStorage.getItem("ehif_float") ? localStorage.getItem("ehif_float") : 1;
var flag;
var timeout;
var d1 = url.split('/')[3];
var cate = ['doujinshi', 'manga', 'artistcg', 'gamecg', 'western', 'nonh', 'imageset', 'cosplay', 'asianporn', 'misc'];

if (d1.startsWith('archiver') || d1.startsWith('gallery') || d1.startsWith('g')) return;
$('.nopm').last().append('<label style="margin-left: 10px;"><input type="checkbox" class="ehxCheck" id="is_float" style="top: 5px;" ' + (setting == 1 ? 'checked' : '') + '>Float</label>');

function newUrl() {
	nextUrl = null;
	if (d1 === 'g' || d1 === 's') {
		return;
	}

	if (parseInt($('.ptt td:nth-last-child(2)').text()) > 1) {
		if (max === 0) {
			max = parseInt($('.ptt td:nth-last-child(2)').text()) - 1;
			page = parseInt($('.ptds').first().text()) - 1;
		}
		if ((page + 2) > parseInt($('.ptt td:nth-last-child(2)').text())) { // Return null if our next page is outside of the scope of the results for a tag search
			return;
		}
	} else { // Return null if we only have a single page
		return;
	}

	// Return null if we're doing a file hash search
	if (url.match(/f_shash/)) {
		return;
	}

	if (!cate.includes(d1) && d1 != 'tag' && d1 != 'uploader') {
		if (url.split('/').length == 4 && url.split('/') == '') { // Front Page
			nextUrl = url + '?page=' + (parseInt(page) + 1);
			return;
		}

		if (d1.startsWith('?')) { // Front page with either a set page, or a search
			if (url.includes('page=')) {
				query = url.substr(url.indexOf('&')); // Get query if page is already set
				query = (query.includes("from=")) ? query.substr(0, query.lastIndexOf("&")) : query; // Remove the gallery ID offset if it's included in the query
				cpage = parseInt(url.split('page=')[1].substr(0, url.split('page=')[1].indexOf('&')));
                if (page === 0) page = cpage;
				nextUrl = 'https://' + window.location.hostname + '/?page=' + (parseInt(page) + 1) + query;
			} else {
				query = url.split('?')[1]; // If page is unset, we just need the whole string
				query = (query.includes("from=")) ? query.substr(0, query.lastIndexOf("&")) : query; // Remove the gallery ID offset if it's included in the query
				nextUrl = 'https://' + window.location.hostname + '/?page=' + (parseInt(page) + 1) + '&' + query;
			}
		} else {
			if (d1.includes('watched')) { // Watched
				if (d1.indexOf('?') > 0) {
					cpage = url.substr(url.indexOf('=') + 1);
                    if (page === 0) page = cpage;
					nextUrl = url.substr(0, url.lastIndexOf('?')) + '?page=' + (parseInt(page) + 1); // Ignore the offset as we add it later
				} else {
					nextUrl = url + '?page=' + (parseInt(page) + 1);
				}
			} else { // Favorites
				if (d1.indexOf('?') > 0) {
					if (url.includes('favcat') && !url.includes('page=')) { // Category only
						if (url.includes('f_search')) { // Because I fucking hate favorites. Straight fucking garbage page.
							nextUrl = 'https://' + window.location.hostname + '/favorites.php?page=' + (parseInt(page) + 1) + '&' + url.split('?')[1];
						} else {
							nextUrl = url + '&page=' + (parseInt(page) + 1);
						}
					} else if (url.includes('favcat') && url.includes('page=')) { // Category and Page
						if (url.indexOf('favcat') < url.indexOf('page')) { // Category before page
							if (url.includes('f_search')) { // Category before page with search
								cpage = parseInt(url.split('page=')[1].substr(0, url.split('page=')[1].indexOf('&')));
                                if (page === 0) page = cpage;
								nextUrl = url.split('page=')[0] + 'page=' + (parseInt(page) + 1) + url.split('page=')[1].substr(url.split('page=')[1].indexOf('&'));
							} else {
								page = parseInt(url.substr(url.lastIndexOf('=') + 1));
								nextUrl = url.substr(0, url.lastIndexOf('=') + 1) + (parseInt(page) + 1);
							}
						} else { // Page before category
							query = url.substr(url.indexOf('&'));
							cpage = parseInt(url.substr(url.indexOf('?') + 6, url.indexOf('&') - url.indexOf('?') - 5));
                            if (page === 0) page = cpage;
							nextUrl = 'https://' + window.location.hostname + '/favorites.php?page=' + (parseInt(page) + 1) + query;
						}
					} else if (url.includes('f_search')) { // Search
						if (url.includes('page=')) {
							query = url.substr(url.indexOf('&'));
							cpage = parseInt(url.substr(url.indexOf('?') + 6, url.indexOf('&') - url.indexOf('?') - 5));
                            if (page === 0) page = cpage;
							nextUrl = 'https://' + window.location.hostname + '/favorites.php?page=' + (parseInt(page) + 1) + query;
						} else { // Search with no page
							query = url.substr(url.indexOf('?') + 1);
							nextUrl = 'https://' + window.location.hostname + '/favorites.php?page=' + (parseInt(page) + 1) + '&' + query;
						}
					} else { // Page only
						cpage = parseInt(url.substr(url.lastIndexOf('=') + 1));
                        if (page === 0) page = cpage;
						nextUrl = url.substr(0, url.lastIndexOf('?')) + '?page=' + (parseInt(page) + 1);
					}
				} else {
					nextUrl = url + '?page=' + (parseInt(page) + 1);
				}
			}
		}
	} else { // Otherwise, just do the next generic page URL
		if (cate.includes(d1)) {
			if (url.split('/').length == 5) { // Page already set
				cpage = url.split('/')[4];
                if (page === 0) page = cpage;
				nextUrl = url.substr(0, url.lastIndexOf('/')) + '/' + (parseInt(page) + 1); // Ignore the offset as we add it later
			} else {
				nextUrl = url + '/' + (parseInt(page) + 1);
			}
		} else {
			if (url.split('/').length == 6) { // page already set
				cpage = url.split('/')[5];
                if (page === 0) page = cpage;
				nextUrl = url.substr(0, url.lastIndexOf('/')) + '/' + (parseInt(page) + 1);
			} else {
				nextUrl = url + '/' + (parseInt(page) + 1);
			}
		}
	}
}

newUrl();

function loadMore() {
	if (typeof(nextUrl) == "object") { return; }
	var index = document.getElementsByTagName("select").length > 1 ? 1 : 0; // Offset the select index if there are more than one
	flag = false;
	clearTimeout(timeout);
	// Don't do anything if we're in a gallery or viewing pages
	if (d1 === "g" || d1 === "s") {
		return;
	}

	// Make sure we're near enough to the bottom of the page
	if ($(window).scrollTop() + $(window).height() >= $(document).height() && nextUrl != null) {
		var $content = $('<div>'); // Create a div container to throw scraped content into

		var offset = "";
		if (!url.match("favorites")) {
			offset = "&from=" + document.getElementsByClassName('itg')[0].lastChild.getElementsByTagName("a")[0].href.split("/")[4]; // Append the gallery offset to URL
		}
		if (url.match(/\/tag\//) || cate.includes(d1)) {
			offset = "?from=" + document.getElementsByClassName('itg')[0].lastChild.getElementsByTagName("a")[0].href.split("/")[4]; // Append the gallery offset to URL
		}
		$content.load(url.match(/\/uploader\//) ? nextUrl : `${nextUrl + offset}`, function() { // Only add the gallery offset if we're not doing a tag search, since tag search uses a different URL scheme
			var divs = null;
			// Error catching
			if (document.getElementsByTagName("select")[index] == null) {
				index = 0;
			}

			// Different selectors for e-h versus exh
			if (window.location.hostname.substr(1,1) !== "x") {
				if (document.getElementsByTagName("select")[index].selectedIndex == 4 || url.match("favorites")) {
					divs = this.getElementsByClassName('itg')[0].children;
				} else {
					divs = this.getElementsByClassName('itg')[0].children;
				}
			} else {
				if (document.getElementsByTagName("select")[index].selectedIndex == 4 || url.match("favorites")) {
					divs = this.getElementsByClassName('itg')[0].children;
				} else {
					divs = this.getElementsByClassName('itg')[0].children[0].children;
				}
			}

			// Remove the first element (table header) if not in thumbnail mode
			if (document.getElementsByTagName("select")[index].selectedIndex !== 3 && document.getElementsByTagName("select")[index].selectedIndex !== 4 && !url.match("favorites")) {
				divs[0].parentNode.removeChild(divs[0]);
			}

			// Add scraped content to our current page
			while (divs.length > 0) {
				$('.itg').append(divs[0]);
			};
			flag = true;
			timeout = setTimeout(forceLoad());
		});
		page = parseInt(page) + 1;
		newUrl();
	}
}

function forceLoad() {
	// Force page load if body height is less than window height
	if ($("body").height() < $(window).height()) {
		loadMore();
		if (!flag) {
			return;
		} else {
			timeout = setTimeout(forceLoad(), 10000);
		}
	}
}

forceLoad();

$(document).on('change', 'input', e => {
    if ($('#is_float').prop('checked')) localStorage.setItem("ehif_float", "1");
    else localStorage.setItem("ehif_float", "0");
});

//Otherwise, do the normal scroll checks
$(window).on('scroll', function(){
	if (page + 1 <= max) loadMore();
	if (d1 == "" || d1.startsWith("?") || url.match(/\/tag\//) || url.match(/\/uploader\//) || url.includes('watched')) {
		var offset = (document.getElementById('advdiv').style.display == "none") ? 108 : 291;

		if(window.pageYOffset > (document.getElementById("searchbox").offsetTop + offset) && $('#is_float').prop('checked')) {
			$('#searchbox').css({
				position:'fixed',
				top:'5px',
				width:'612px',
				zIndex:'3',
				background:'#3a4650', //This line is the background color for the box, edit to your preference
				//background: window.getComputedStyle($("div.ido")[0]).background, // Use this line if you don't want to think about it
				left:'50%',
				marginLeft:'-306px'
			});
			$('.ido')[0].lastChild.style.paddingTop = parseInt(offset) + 6 + 'px';
		} else { // Reset CSS rules
			$('#searchbox').css({
				position:'',
				top:'',
				width:'',
				zIndex:'',
				background:'',
				left:'',
				marginLeft:''
			});
			$('.ido')[0].lastChild.style.paddingTop = '';
		}
	}
});
})();