// ==UserScript== // @name Furaffinity Webcomic Autoloader 2.0 // @version 0.2.6 // @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== let rootHolder = document.getElementById("submissionImg"); let counter = 5; let showLinks = false; let startImg = window.location.href; let pageCounter = 0; let openedLinks = [document.location.toString()]; function insertAfter(newElement, referenceElement) { referenceElement.parentNode.insertBefore(newElement, referenceElement.nextSibling); } function insertBreakAfter(referenceElement) { let br = document.createElement("br"); insertAfter(br, referenceElement); } function getNextLink(doc) { //console.log("Get Next Link"); let comicDoc = doc.getElementsByClassName("parsed_nav_links")[0]; if (comicDoc) comicDoc = comicDoc.childNodes; else { comicDoc = doc.getElementsByClassName("submission-description user-submitted-links")[0]; if (comicDoc) comicDoc = comicDoc.childNodes; else return; } //console.log("Is Comic: " + comicDoc); let link; comicDoc.forEach(function(elem) { //console.log("elem: " + elem.textContent); if (elem.textContent.toLowerCase().includes("next")) { try { let currImgCalc = elem.href.substring(elem.href.lastIndexOf('/'), elem.href.length); let startImgCalc = startImg.substring(0, startImg.length-1); startImgCalc = startImgCalc.substring(startImgCalc.lastIndexOf('/'), startImgCalc.length); if (currImgCalc != startImgCalc && !openedLinks.includes(elem.href)) { link = elem.href; openedLinks.push(link); pageCounter++; //console.log(pageCounter); } //console.log("found: " + elem.textContent + " Link = " + elem.href); } catch {} return; } }); return link; } function loadNextPage(nextLink) { if(nextLink) { let request = new XMLHttpRequest(); request.open('GET', nextLink, true); request.onload = function() { if (this.status >= 200 && this.status < 400) { // Success! //let data = JSON.parse(this.response); parser = new DOMParser(); let nextPage = parser.parseFromString(this.response, "text/html"); //console.log(this.response) let nl = getNextLink(nextPage); let img = nextPage.getElementById("submissionImg"); rootHolder.parentNode.insertBefore(img, rootHolder.nextSibling); rootHolder = rootHolder.nextSibling; insertBreakAfter(rootHolder); rootHolder = rootHolder.nextSibling; if (showLinks) { let lnk = document.createElement('a'); let lnkURL = nextLink; lnk.innerHTML = lnkURL; lnk.href = lnkURL; insertAfter(lnk, rootHolder); } else { let br = document.createElement('br'); insertAfter(br, rootHolder); } //console.log(rootHolder.nextSibling.outerHTML); 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..."); let ab = document.getElementById("autoloaderButton"); ab.parentNode.removeChild(ab); let checkbox = document.getElementById("linksCheckbox"); checkbox.parentNode.removeChild(checkbox); let label = document.getElementById("showLinksLabel"); label.parentNode.removeChild(label); loadNextPage(secondPage); } function setShowLinks() { if (showLinks) showLinks = false; else showLinks = true; let checkbox = document.getElementById("linksCheckbox"); checkbox.checked = showLinks; } let secondPage = getNextLink(document); //console.log("Link = " + secondPage); if(secondPage) { let img = document.getElementById("submissionImg"); //console.log("Image found"); insertBreakAfter(rootHolder); rootHolder = rootHolder.nextSibling; pageCounter++; //console.log(pageCounter); let 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); let 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); let 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); }