// ==UserScript== // @name Find on Nyaa // @namespace MALFindNya // @version 2.1 // @description Will open nyaa on a new window and search for the anime title // @author Samu // @match https://myanimelist.net/anime/* // @match https://myanimelist.net/anime.php?id=* // @match https://anilist.co/* // @match https://kitsu.io/* // @match https://www.anime-planet.com/* // @grant none // @downloadURL none // ==/UserScript== /** icon source https://icons8.com/icon/82838/external-link https://ezgif.com/image-to-datauri **/ //** SETTINGS **// let sortBy = "seeders"; // "comments", "size", "id", "seeders", "leechers", or "downloads" let filter = "0"; // 0 = No Filter | 1 = No remakes | 2 = Trusted Only let category = "AnimeEnglishTranslated"; // Check values below let favoriteGroups = ["Judas", "Erai-raws"]; // List is ordered, favorite should be first let searchPrefix = ""; let searchSufix = ""; //** END OF SETTINGS **// const cat = { Allcategories: "0_0", Anime: "1_0", AnimeMusicVideo: "1_1", AnimeEnglishTranslated: "1_2", AnimeNonEnglishTranslated: "1_3", Raw: "1_4", Audio: "2_0", Lossless: "2_1", Lossy: "2_2", Literature: "3_0", LiteratureEnglishTranslated: "3_1", LiteratureNonEnglishTranslated: "3_2", LiteratureRaw: "3_3", LiveAction: "4_0", LiveActionEnglishTranslated: "4_1", IdolPromotionalVideo: "4_2", LiveActionNonEnglishTranslated: "4_3", LiveActionRaw: "4_4", Pictures: "5_0", Graphics: "5_1", Photos: "5_2", Software: "6_0", Applications: "6_1", Games: "6_2", }; const buttonId = "FindOnNyaaButtonId"; (function() { 'use strict'; let pushState = history.pushState; let replaceState = history.replaceState; history.pushState = function() { pushState.apply(history, arguments); window.dispatchEvent(new Event('pushstate')); window.dispatchEvent(new Event('locationchange')); }; history.replaceState = function() { replaceState.apply(history, arguments); window.dispatchEvent(new Event('replacestate')); window.dispatchEvent(new Event('locationchange')); }; window.addEventListener('popstate', function() { window.dispatchEvent(new Event('locationchange')) }); let host = window.location.host; let path = window.location.pathname; window.addEventListener('locationchange', function() { path = window.location.pathname; lookForTitleElement(host, path); }); lookForTitleElement(host, path); })(); function lookForTitleElement(host, path) { if (host === "myanimelist.net") { waitForElm('.title-name').then((elm) => init(elm)); } else if (host === "anilist.co" && path.startsWith("/anime/")) { waitForElm('.page-content .header .content > h1').then((elm) => init(elm)); } else if (host === "kitsu.io" && path.startsWith("/anime/")) { waitForElm('.media--title h3').then((elm) => init(elm)); } else if (host === "www.anime-planet.com" && path.startsWith("/anime/")) { waitForElm('#siteContainer h1').then((elm) => init(elm)); } else { return; } } function init(element) { let url = createUrl(element); let nyaaButton = document.getElementById(buttonId); if (nyaaButton == null) { nyaaButton = createButton(url); } else { nyaaButton.setAttribute("href", url); } element.appendChild(nyaaButton); } function createButton(url) { let button = document.createElement("a"); button.id = buttonId; button.innerHTML = ""; button.setAttribute("href", url); button.setAttribute("target", "_blank"); button.setAttribute("rel", "noopener"); button.setAttribute("title", "Search on Nyaa"); button.setAttribute("style", "margin-left: 10px;height: 10px;width: 10px;background-size: cover;display: inline-block;transform: scale(1.8);vertical-align: top;margin-top: 7px;"); button.style.backgroundImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFnSURBVGhD7ZlLSgNRFESzDp3qSPfjdlyOgjsTxM9U0HsggWt7k3716mln8A4chM61qjrT7CaTyeSsuQ6fwvfwq9Ml1U2LMlfhS1iFKS6pblqU4ZuvglSXVDctynyEVZDqkuqmRRk7QOQu/AyXvQdl7ACBtfEoYwc0Uo2vXkbGDmjg2Hie52coYwescGo85OcoYwecYG085M9Qxg44Qst4yJ+jjB1Q0Doe8g3K2AELlPGQ71DGDkio4yHfoowdsKdn/BByIfaw2XjIpaiy6XjIxaiw+XjI5djKqPH5/1GmJ2DkN58zUEYNGDkecg7KKAGjx0POQpnWgNtw9HjIeSijBNyHh7sR4yF3o4wawEuMGg9q/y96Am72f0fQ0/8DO8DE7rcDTOx+O8DE7rcDTOx+O8DE7rcDTOx+5zeB0b6FMo9hFbaFbJG5CJ/DKvA/ZQNburgMefvXsAr/S+l8CNkwmUwmZ8lu9w0a6EAybIGM4AAAAABJRU5ErkJggg==)"; return button; } function createUrl(element) { let textFragment = ":~:text=" + favoriteGroups.join("&text="); let title = element.textContent.trim().replace(/[^a-zA-Z0-9]+/g, "+"); let query = [searchPrefix, title.trim(), searchSufix].join(" ").trim(); let queryURI = encodeURI(query); let baseUrl = "https://nyaa.si/"; let path = `?f=${filter}&c=${cat[category]}&s=${sortBy}&o=desc&q=${queryURI}`; return baseUrl + path + "#" + textFragment; } function waitForElm(selector) { return new Promise(resolve => { if (document.querySelector(selector)) { return resolve(document.querySelector(selector)); } const observer = new MutationObserver(mutations => { if (document.querySelector(selector)) { resolve(document.querySelector(selector)); observer.disconnect(); } }); observer.observe(document.body, { childList: true, subtree: true }); }); }