// ==UserScript== // @name New MangaDex Follows // @namespace // @version 1.0 // @description Manage your follows // @author Australis // @match https://mangadex.org/* // @icon https://www.google.com/s2/favicons?domain=mangadex.org // @grant none // @downloadURL none // ==/UserScript== if(localStorage.getItem("seriesdex") == null) seriesdex = [] else seriesdex = JSON.parse(localStorage.getItem("seriesdex")) function FS(array, number){//FindSeries return array.findIndex(q => q.id == number) } button_reload = 0 disURL = "" function NextNext(array,pointer,next){ if(next[0] < array[pointer].nextc*1 && array[pointer].last < next[0]) { array[pointer].nextc = next[0] array[pointer].nextl = next[1] } } function Reload1(){ elem_no = follows.length if(before < elem_no) button_reload = setTimeout(Reload1,4000) else repeat = setTimeout(FollowsFeed,2000) before = follows.length } function Reload(){ if(lista.length == 0) button_reload = setTimeout(Reload,1000) else repeat = setTimeout(FollowsFeed,2000) } function FollowsFeed(){ try{ console.log("FollowsFeed") lista = document.getElementsByClassName("mb-12")[0].getElementsByClassName("mb-4 pa-4") console.log("lista loaded") try{ clearInterval(button_reload) } catch(e){ console.log("no reload") } try{ clearInterval(repeat) } catch(e){ console.log("no repeat") } for(let l of lista){ if(!l.className.includes("my-6") && l.style.display != "none") { try{ var id_series = l.getElementsByTagName("a")[0].href.split("title/")[1] var batch = l.getElementsByClassName("pa-3 rounded-sm") var chap, link, read, nextc, nextl, last nextc = 10000 nextl = "" pseries = FS(seriesdex,id_series) if(pseries < 0) last = -10 else last = seriesdex[pseries].last chap = JSON.parse(batch[0].firstChild.innerText.split(" ")[1]) link = batch[0].getElementsByTagName("a")[0].href.split("chapter/")[1] read = (batch[0].getElementsByClassName("row my-3")[0].style.length != 0) if(!read && last < chap) { nextc = chap nextl = link } else if(last < chap){ if(read) last = chap } if(batch.length > 1){ for(let i=1; i last && nextc < current){//arreglar? nextc = current nextl = batch[i].getElementsByTagName("a")[0].href.split("chapter/")[1] } } else if(batch[i].getElementsByClassName("row my-3")[0].style.length != 0){ if(last < current) last = current } } } if(pseries >= 0) NextNext(seriesdex,pseries,[nextc,nextl]) else seriesdex.push({id:id_series, name:l.firstChild.innerText, last:last, nextc:nextc, nextl:nextl}) index = FS(follows,id_series) if(index >= 0){ if(seriesdex[pseries].last < last || seriesdex[pseries].last == null) seriesdex[pseries].last = last if(nextc > last){ NextNext(follows,index,[nextc,nextl]) NextNext(seriesdex,pseries,[nextc,nextl]) } if(l != follows[index].pointer) { while(l.getElementsByClassName("pa-3")[0] != undefined) follows[index].pointer.getElementsByClassName("flex-grow-1")[0].append(l.getElementsByClassName("pa-3")[0]) } //else console.log("new?") } else{ follows.push({id:id_series, ch:last, url:link, nextc:nextc, nextl:nextl, pointer:l}) } // if(pseries >= 0){ if(pseries == -1) pseries = FS(seriesdex,id_series) if(seriesdex[pseries].nextc == 0 || seriesdex[pseries].nextc == null || seriesdex[pseries].nextc == 10000 || (seriesdex[pseries].nextc > nextc && seriesdex[pseries].last < nextc)){ seriesdex[pseries].nextc = nextc seriesdex[pseries].nextl = nextl } // } } catch(e){ console.log(e) // console.log(l) } } } for(let f of follows){ let avail = f.pointer.getElementsByClassName("pa-3 rounded-sm") let lastest = -10 let newest = 10000 let link = null let current = FS(seriesdex,f.id) if(current >= 0){ lastest = seriesdex[current].last newest = seriesdex[current].nextc } for(let a of avail){ let disONE = a.getElementsByTagName("span")[0].innerText.split("Chapter ")[1]*1 let unread = (a.getElementsByClassName("my-3")[0].style.length == 0) if(disONE > lastest && !unread) lastest = disONE if(unread && newest > disONE && disONE > lastest) { newest = disONE link = a.getElementsByTagName("a")[0].href.split("chapter/")[1] } } // console.log(f.pointer.getElementsByTagName("h6")[0].innerText+" last: "+lastest+" nextc: "+newest) f.ch = lastest if(newest > lastest) { f.nextc = newest f.nextl = link } else{ f.nextc = 10000 f.nextl = null } if(lastest > seriesdex[current].last) { seriesdex[current].last = lastest // seriesdex[current].nextc = f.nextc // seriesdex[current].nextl = f.nextl } else{//lastest <= seriesdex[current].last if(seriesdex[current].nextc != f.nextc){ seriesdex[current].nextc = f.nextc seriesdex[current].nextl = f.nextl } } } for(let l of lista){ if(l.firstChild.getElementsByTagName("a")[0]){ let daONE = seriesdex[FS(seriesdex,l.firstChild.getElementsByTagName("a")[0].href.split("title/")[1])] if(l.getElementsByClassName("pa-3").length == 0) l.style.display = "none" else if(daONE.nextc > daONE.last && daONE.nextl){ let newbutton = document.createElement("div") newbutton.className = "pa-3" newbutton.innerHTML = "" if(l.getElementsByClassName("continue").length == 0) l.getElementsByClassName("flex-grow-1")[0].insertBefore(newbutton,l.getElementsByClassName("pa-3")[0]) else l.getElementsByClassName("continue")[0].innerHTML = newbutton.innerHTML } if((daONE.nextl == null || daONE.nextl == "") && l.getElementsByClassName("continue")[0] != undefined) l.getElementsByClassName("continue")[0].parentElement.remove() } } for(let n=follows.length-1; n >= 0; n--){ if(follows[n].pointer.getElementsByClassName("continue")[0] != undefined) lista[0].parentElement.insertBefore(follows[n].pointer,lista[0]) } localStorage.setItem("seriesdex",JSON.stringify(seriesdex)) } catch(e){ console.log("error FollowsFeed") console.log(e) repeat = setTimeout(FollowsFeed,5000) } } function Clickear(){ hola = document.getElementsByClassName("v-window-item")[0] try{ boton = hola.getElementsByClassName("v-btn--block")[0] if(boton != undefined){ boton.click() setTimeout(Clickear,2500) } else{ FillTitles() } } catch(e){ setTimeout(Clickear,2500) } } function Llenar(X){ let temp = [] console.log("now filling "+X.firstChild.firstChild.firstChild.innerText) for(let t of X.firstChild.lastChild.children){ var id = t.firstChild.firstChild.href.split("title/")[1] var name = t.getElementsByTagName("h4")[0].innerText.replaceAll("\n ","").replaceAll("\n ","") temp.push({id:id, name:name, last:null, nextc:null, nextl:null }) if(temp.length == 0) temp = [{id:id, name:name, last:null, nextc:null, nextl:null}] } console.log("Done Filling!!") return temp } function NewButton(){ try{ newb = document.createElement("button") newb.innerHTML = "" document.getElementsByClassName("v-btn-toggle v-btn-toggle--borderless")[0].appendChild(newb) } catch(e){ setTimeout(NewButton,500) } } function FillTitles(){ try{ titles = document.getElementsByClassName("v-window-item v-window-item--active")[0] if(titles != undefined){ console.log("Filling Titles") for(t of titles.children){ if(t.innerHTML != ""){ if(t.firstChild.firstChild.firstChild.innerText == "Reading") reading = Llenar(t) if(t.firstChild.firstChild.firstChild.innerText == "On Hold") onhold = Llenar(t) if(t.firstChild.firstChild.firstChild.innerText == "Plan To Read") planto = Llenar(t) if(t.firstChild.firstChild.firstChild.innerText == "Dropped") dropped = Llenar(t) if(t.firstChild.firstChild.firstChild.innerText == "Completed") completed = Llenar(t) } } for(let r of reading){ if(FS(seriesdex,r.id) == -1) seriesdex.push(r) } function Copiar(arrA,argB){ if(FS(arrA, argB.id) >= 0){ arrA[FS(arrA, argB.id)].last = argB.last } } for(let i = seriesdex.length-1; i >= 0; i--){ Copiar(completed, seriesdex[i]) Copiar(onhold, seriesdex[i]) Copiar(reading, seriesdex[i]) Copiar(dropped, seriesdex[i]) //Copiar(planto, seriesdex[i]) } localStorage.setItem("reading",JSON.stringify(reading)) localStorage.setItem("planto",JSON.stringify(planto)) localStorage.setItem("onhold",JSON.stringify(onhold)) localStorage.setItem("dropped",JSON.stringify(dropped)) localStorage.setItem("completed",JSON.stringify(completed)) alert("Done!") } } catch(e){ console.log(e) // setTimeout(FillTitles, 5500) } } function main(){ if(document.URL == "https://mangadex.org/user/me"){ console.log("Script ready") document.Fill = function(){ console.log("Loading series...") alert("Please wait until the next alert, this can take several minutes depending of how many series you follow.") Clickear() } if(document.getElementsByClassName("user__tab-active")[0].innerText == "Follows"){ NewButton() } } if(document.URL.includes("https://mangadex.org/titles/feed")){ follows = [] elem_no = 0 before = 0 FollowsFeed() repeat = setTimeout(FollowsFeed,2500) } } function Loop(){ try{ if(disURL != document.URL){ console.log("loop") repeat = setTimeout(main,5000) disURL = document.URL } } catch(e){ console.log("error loop") } frutyloop = setTimeout(Loop,1000) } frutyloop = setTimeout(Loop,1000)