var query; var variables = { type: "ANIME", page: 1, perPage: 50 } var request; var url = 'https://graphql.anilist.co' var options = { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ query: query, variables: variables }) } const searchRx = /(magnet:)?([A-F\d]{8,40})?(.*\.torrent)?/i; function search() { let regexParse = searchRx.exec(document.querySelector("#search").value) if (regexParse[1] || regexParse[2] || regexParse[3]) { addTorrent(document.querySelector("#search").value) } else { searchAnime(document.querySelector("#search").value) } } async function alRequest(a, b) { if (!a) { variables.sort = "TRENDING_DESC" delete variables.search query = ` query ($page: Int, $perPage: Int, $sort: [MediaSort], $type: MediaType) { Page (page: $page, perPage: $perPage) { pageInfo { total currentPage lastPage hasNextPage perPage } media(type: $type, sort: $sort) { id title { romaji english native } description( asHtml: true ) season seasonYear format status episodes duration averageScore genres coverImage { extraLarge medium } bannerImage synonyms nextAiringEpisode { timeUntilAiring episode } } } } ` } else { variables.search = a variables.perPage = b || 50 delete variables.sort query = ` query ($page: Int, $perPage: Int, $search: String, $type: MediaType) { Page (page: $page, perPage: $perPage) { pageInfo { total currentPage lastPage hasNextPage perPage } media (type: $type, search: $search) { id title { romaji english native } description( asHtml: true ) season seasonYear format status episodes duration averageScore genres coverImage { extraLarge medium } bannerImage synonyms nextAiringEpisode { timeUntilAiring episode } } } } ` } options.body = JSON.stringify({ query: query, variables: variables }) let res = await fetch(url, options).catch((error) => console.error(error)), json = await res.json(); return json } let alResponse async function searchAnime(a) { alResponse = await alRequest(a) // console.log(alResponse); let frag = document.createDocumentFragment() document.querySelector(".browse").textContent = ''; try { alResponse.data.Page.media.forEach(media => { let template = document.createElement("div") template.classList.add("card", "m-0", "p-0") template.innerHTML = `
${media.title.english || media.title.romaji}

${(!!media.format ? (media.format == "TV" ? "" + media.format + " Show" : "" + media.format) : "") + ""} ${!!media.episodes ? "" + media.episodes + " Episodes" : (!!media.duration ? "" + media.duration + " Minutes" : "")} ${!!media.status ? "" + media.status.toLowerCase() + "" : ""} ${"" + (!!media.season ? media.season.toLowerCase() + " " : "") + (media.seasonYear || "") + ""}

${media.description}
${media.genres.map(key => (`${key} `)).join('')}
` template.onclick = function () { viewAnime(media) } frag.appendChild(template) }) } catch (e) { console.error(e) } document.querySelector(".browse").appendChild(frag) } searchAnime() let detailsfrag = document.createDocumentFragment() let details = { averageScore: "Average Score", duration: "Episode Duration", episodes: "Episodes", format: "Format", genres: "Genres", season: "Season", seasonYear: "Year", status: "Status", english: "English", romaji: "Romaji", native: "Native", synonyms: "Synonyms" } function viewAnime(media) { halfmoon.toggleModal("view") document.querySelector(".view .banner img").src = "" document.querySelector(".view .banner img").src = media.bannerImage document.querySelector(".view .contain-img").src = media.coverImage.extraLarge document.querySelector(".view .title").textContent = media.title.english || media.title.romaji document.querySelector(".view .desc").innerHTML = media.description || "" document.querySelector(".view .details").innerHTML = "" document.querySelector(".view #play").onclick = function () { nyaaSearch(media, document.querySelector(".view #ep").value); halfmoon.toggleModal("view") } detailsCreator(media) document.querySelector(".view #ep").value = 1 document.querySelector(".view #ep").max = media.episodes || 999 document.querySelector(".view .details").appendChild(detailsfrag) } function detailsCreator(entry) { if (entry != undefined) { Object.entries(entry).forEach(value => { let template = document.createElement("p") if (typeof value[1] == 'object') { if (Array.isArray(value[1])) { if (details[value[0]] && value[1].length > 0) { template.innerHTML = `${details[value[0]]}
${value[1].map(key => (key)).join(', ')}` detailsfrag.appendChild(template) } } else { detailsCreator(value[1]) } } else { if (details[value[0]]) { template.innerHTML = `${details[value[0]]}
${value[1].toString()}` detailsfrag.appendChild(template) } } }) } } const DOMPARSER = new DOMParser().parseFromString.bind(new DOMParser()) const searchTitle = document.querySelector("#title") const searchEpisode = document.querySelector("#ep") var selected; async function nyaaSearch(media, episode) { if (parseInt(episode) < 10) { episode = `0${episode}` } let titles = Object.values(media.title).concat(media.synonyms).filter(name => name != null) let table = document.querySelector("tbody.results") let results = document.createDocumentFragment() for (let title of titles) { if (results.children.length == 0) { title = title.replace(/ /g, "+") let url = new URL(`https://nyaa.si/?page=rss&c=1_2&f=${settings.torrent3 == true ? 2 : 0}&s=seeders&o=desc&q=${title}"+${episode}+"+${settings.torrent1}`) results = await nyaaRss(url) } } if (results.children.length == 0) { halfmoon.initStickyAlert({ content: `Couldn't find torrent for ${media.title.english || media.title.romaji} Episode ${parseInt(episode)}! Try specifying a torrent manually.`, title: "Search Failed", alertType: "alert-danger", fillType: "" }) } else { table.textContent = "" table.appendChild(results) halfmoon.toggleModal("tsearch") selected = [media, parseInt(episode)] } } async function nyaaRss(url) { let frag = document.createDocumentFragment() res = await fetch(url) await res.text().then((xmlTxt) => { try { let doc = DOMPARSER(xmlTxt, "text/xml") if (settings.torrent2 && doc.querySelectorAll("infoHash")[0]) { addTorrent(doc.querySelectorAll("infoHash")[0].textContent) halfmoon.toggleModal("tsearch") } doc.querySelectorAll("item").forEach((item, index) => { let i = item.querySelector.bind(item) let template = document.createElement("tr") template.innerHTML += ` ${(index + 1)} ${i("title").textContent} ${i("size").textContent} ${i("seeders").textContent} ${i("leechers").textContent} ${i("downloads").textContent} Play` frag.appendChild(template) }) } catch (e) { console.error(e) } }) return frag } const regex = /((?:\[[^\]]*\])*)?\s*((?:[^\d\[\.](?!S\d))*)?\s*((?:S\d+[^\w\[]*E?)?[\d\-]*)\s*(.*)?/i; let store = {}; async function hsRss(url) { let frag = document.createDocumentFragment() document.querySelector(".releases").innerHTML = "" res = await fetch(url) await res.text().then(async (xmlTxt) => { try { let doc = DOMPARSER(xmlTxt, "text/xml") let items = doc.querySelectorAll("item") for (let item of items) { let i = item.querySelector.bind(item), regexParse = regex.exec(i("title").textContent) if (regexParse[2].endsWith(" - ")) { regexParse[2] = regexParse[2].slice(0, -3) } if (!store[regexParse[2]] && !alResponse.data.Page.media.some(media => (Object.values(media.title).concat(media.synonyms).filter(name => name != null).includes(regexParse[2]) && ((store[regexParse[2]] = media) && true)))) { //shit not found, lookup let res = await alRequest(regexParse[2], 1) store[regexParse[2]] = res.data.Page.media[0] } let media = store[regexParse[2]] let template = document.createElement("div") template.classList.add("card", "m-0", "p-0") if (media) { template.innerHTML = `
${media.title.english || media.title.romaji} - ${regexParse[3]}

${(!!media.format ? (media.format == "TV" ? "" + media.format + " Show" : "" + media.format) : "") + ""} ${!!media.episodes ? "" + media.episodes + " Episodes" : (!!media.duration ? "" + media.duration + " Minutes" : "")} ${!!media.status ? "" + media.status.toLowerCase() + "" : ""} ${"" + (!!media.season ? media.season.toLowerCase() + " " : "") + (media.seasonYear || "") + ""}

${media.description}
${media.genres.map(key => (`${key} `)).join('')}
` } else { template.innerHTML = `
${regexParse[2]} - ${regexParse[3]}
` } template.onclick = function () { selected = [store[regexParse[2]], regexParse[3]] addTorrent(i('link').textContent) } frag.appendChild(template) } document.querySelector(".releases").appendChild(frag) } catch (e) { console.error(e) } }) } document.querySelector("#refRel").onclick = function () { hsRss(`http://www.horriblesubs.info/rss.php?res=${settings.torrent1}`) }