// ==UserScript== // @name Furaffinity Webcomic Autoloader 2.0 // @version 0.2.3 // @description Gives you the option to load all the subsequent comic pages on a FurAffinity comic page automatically. Now with the option to show or hide Page Links. // @grant none // @icon https://www.furaffinity.net/themes/beta/img/banners/fa_logo.png?v2 // @author Midori Dragon // @match *://*.furaffinity.net/view/* // @namespace Violentmonkey Scripts // @license MIT // @downloadURL none // ==/UserScript== var rootHolder = document.getElementById("submissionImg"); var counter = 5; var showLinks = false; var prevImg; function insertAfter(newElement, referenceElement) { referenceElement.parentNode.insertBefore(newElement, referenceElement.nextSibling); } function insertBreakAfter(referenceElement) { var br = document.createElement("br"); insertAfter(br, referenceElement); } function getNextLink(doc) { //console.log("Get Next Link"); var comicDoc = doc.getElementsByClassName("submission-description user-submitted-links")[0].childNodes; if(comicDoc.length < 5) { if(doc.getElementsByClassName("parsed_nav_links")[0].childNodes.length < 5) { //console.log("No Comic Tag"); return null; } else comicDoc = doc.getElementsByClassName("parsed_nav_links")[0].childNodes; } else { if(doc.getElementsByClassName("parsed_nav_links")[0].childNodes.length >= 5) comicDoc = doc.getElementsByClassName("parsed_nav_links")[0].childNodes; } //console.log("Is Comic: " + comicDoc); var link; comicDoc.forEach(function(elem) { //console.log("elem: " + elem.textContent); if (elem.textContent.toLowerCase().includes("next")) { if (elem.href != prevImg) { link = elem.href; prevImg = link; } //console.log("found: " + elem.textContent + " Link = " + elem.href); return; } }); return link; } function loadNextPage(nextLink) { if(nextLink) { var request = new XMLHttpRequest(); request.open('GET', nextLink, true); request.onload = function() { if (this.status >= 200 && this.status < 400) { // Success! //var data = JSON.parse(this.response); parser = new DOMParser(); var nextPage = parser.parseFromString(this.response, "text/html"); //console.log(this.response) var nl = getNextLink(nextPage); var img = nextPage.getElementById("submissionImg"); rootHolder.parentNode.insertBefore(img, rootHolder.nextSibling); rootHolder = rootHolder.nextSibling; insertBreakAfter(rootHolder); rootHolder = rootHolder.nextSibling; if (showLinks) { var lnk = document.createElement('a'); var lnkURL = nextLink; lnk.innerHTML = lnkURL; lnk.href = lnkURL; insertAfter(lnk, rootHolder); } rootHolder = rootHolder.nextSibling; insertBreakAfter(rootHolder); rootHolder = rootHolder.nextSibling; loadNextPage(nl); } else { //We reached our target server, but it returned an error console.log("none"); } }; request.onerror = function() { //There was a connection error of some sort console.log("error"); }; request.send(); } } function startAutoloader() { //console.log("starting..."); var ab = document.getElementById("autoloaderButton"); ab.parentNode.removeChild(ab); var checkbox = document.getElementById("linksCheckbox"); checkbox.parentNode.removeChild(checkbox); var label = document.getElementById("showLinksLabel"); label.parentNode.removeChild(label); loadNextPage(secondPage); } function setShowLinks() { if (showLinks) showLinks = false; else showLinks = true; var checkbox = document.getElementById("linksCheckbox"); checkbox.checked = showLinks; } var secondPage = getNextLink(document); //console.log("Link = " + secondPage); if(secondPage) { var img = document.getElementById("submissionImg"); //console.log("Image found"); insertBreakAfter(rootHolder); rootHolder = rootHolder.nextSibling; var label = document.createElement('a'); label.id = "showLinksLabel"; label.innerHTML = "Show Links"; label.style.cursor = "pointer"; label.style.marginBottom = "30px"; label.style.marginLeft = "5px"; label.onclick = setShowLinks; insertAfter(label, rootHolder); var checkbox = document.createElement('input'); checkbox.value = "Show Links"; checkbox.type = "checkbox"; checkbox.id = "linksCheckbox"; checkbox.className = "checkbox standard mobile-fix"; checkbox.style.cursor = "pointer"; checkbox.style.marginBottom = "30px"; checkbox.style.marginLeft = "20px"; checkbox.onclick = setShowLinks; insertAfter(checkbox, rootHolder); var button = document.createElement('input'); button.value = "Enable Comic Autoloader"; button.type = "button"; button.id = "autoloaderButton"; button.className = "button standard mobile-fix"; button.style.marginTop = "10px"; button.style.marginBottom = "20px"; button.onclick = startAutoloader; insertAfter(button, rootHolder); }