// ==UserScript== // @name ALink // @namespace Morimasa // @author Morimasa // @description Adds AniList links to mangadex manga pages // @match https://mangadex.org/title/* // @match https://mangadex.org/manga/* // @version 0.51 // @downloadURL none // ==/UserScript== const insertAL = data => { const id = data.data.Media.id; document.getElementsByClassName("list-inline")[3].innerHTML+=`
  • AniList
  • `; } const api = async (query, vars) => { const options = { method: 'POST', body: JSON.stringify({query: query, variables: vars}), headers: { 'Content-Type': 'application/json' } } let res = await fetch('https://graphql.anilist.co', options) if (res.ok) return await res.json(); else return Promise.reject(res); } const searchMAL = id => { const query = 'query($mal:Int){Media(idMal:$mal,type:MANGA){id}}'; const vars = {"mal": id} return api(query, vars); } const searchTitle = (title, format) => { const query = 'query($t:String,$f:MediaFormat){Media(search:$t,format:$f,type:MANGA){id}}'; const vars = {"t": title, "f": format} return api(query, vars); } const getCountry = () => { return document.getElementsByClassName("card-header")[0].children[2].classList[2].split('-')[1] } const getNames = () => { const altNamesEL = document.getElementsByClassName('col-xl-9')[0].children[0]; if(altNamesEL.children[0].innerText==="Alt name(s):") return [...altNamesEL.children[1].children[0].children].map(t => t.innerText); else return []; } const searchNative = () => { const reg = { jp: /[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f]/g, kr: /[\u1100-\u11FF\u3130-\u318F\uA960-\uA97F\uAC00-\uD7AF\uD7B0-\uD7FF]/g } const lang = getCountry(); const names = getNames(); const native = names.filter(t => t.match(reg[lang])) if(native.length !== 1) return false; else return native[0]; } const check = err => { if (err===undefined || err.status===404) { const native = searchNative(); const title = native ? native : document.getElementsByClassName("card-header")[0].childNodes[3].textContent; const isOneshot = document.querySelector('.badge[href$="/genre/21"]'); searchTitle(title, isOneshot ? 'ONE_SHOT' : 'MANGA') .then(insertAL) .catch(err => console.info(`ALink: ${err.statusText}`)) } else console.error(err) } const malURL = document.querySelector('a[href^="https://myanimelist.net"]'); if (malURL) searchMAL(malURL.href.split('/').pop()) .then(insertAL) .catch(check) else check();