// ==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.4
// @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 check = err => {
if (err===undefined || err.status===404) {
const title = document.getElementsByClassName("card-header")[0].childNodes[2].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();