NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name BetterADK
// @namespace http://tampermonkey.net/
// @version 1.47
// @description Removes VF from ADKami, also add MAL buttons, Mavanimes links, new fancy icons and cool stuff!
// @author Zenrac
// @match https://www.adkami.com/*
// @match https://www.adkami.com/*
// @match https://m.adkami.com/*
// @match http://www.adkami.com/*
// @match http://m.adkami.com/*
// @match https://adkami.com/*
// @match http://adkami.com/*
// @match http://*.adkami.com/*
// @match https://*.adkami.com/*
// @match https://www.mavanimes.co/*
// @match http://www.mavanimes.co/*
// @match https://franime.fr/*
// @match http://franime.fr/*
// @match https://nyaa.si/*
// @match http://nyaa.si/*
// @downloadURL https://raw.githubusercontent.com/Zenrac/Zenrac.github.io/main/scripts/BetterADK.user.js
// @updateURL https://raw.githubusercontent.com/Zenrac/Zenrac.github.io/main/scripts/BetterADK.user.js
// @homepageURL https://github.com/zenrac/Zenrac.github.io
// @supportURL https://github.com/zenrac/Zenrac.github.io/issues
// @icon https://www.google.com/s2/favicons?domain=adkami.com
// @require https://raw.githubusercontent.com/Zenrac/Zenrac.github.io/main/scripts/gm_config.js
// @grant GM_getValue
// @grant GM_setValue
// @license MIT
// ==/UserScript==
(function() {
'use strict';
const CORRELATION_ADK_MAL = [-1, 1, 3, 5, 4, 2, 2]
const MAGNET_ICON = "https://i.imgur.com/nDFlstE.png";
const DOWNLOAD_ICON = "https://i.imgur.com/WoWtY7Y.png";
const NYAA_ICON = "https://i.imgur.com/c8dv9WI.png";
const BETTER_ADK_LOGO = "https://i.imgur.com/wOQ3Mop.png";
const NO_RESULT_IMAGE = "https://i.imgur.com/Fg9J6uA.png";
const ZENRAC_AVATAR = "https://i.imgur.com/7UWLr6t.png";
const MAV_ICON = "https://i.imgur.com/xSHwElF.png";
const FRA_ICON = "https://i.imgur.com/f9PElxF.png";
const VOA_ICON = "https://i.imgur.com/xqi8s1S.png";
const MAL_ICON = "https://i.imgur.com/S9KpzW5.png";
const NO_RESULT_PLAYER = `<div style="display:flex;justify-content: center;height: 500px;"><img src="${NO_RESULT_IMAGE}"/></div>`;
const urlParams = new URLSearchParams(window.location.search);
/**
* Allows to wait for an element to exist
*/
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
});
});
}
function getMostCompatibleMagnet() {
let configNyaaShortcut = urlParams.get('nyaashortcut');
let configMagnet = urlParams.get('magnetpriority');
let searchClass = configNyaaShortcut == "download" ? "fa-download" : "fa-magnet";
let magnetElements = document.getElementsByClassName(searchClass)
if (magnetElements.length > 0) {
if (configMagnet) {
for (let words of configMagnet.split(',')) {
for (let magnet of magnetElements) {
let all_words = true;
for (let word of words.split(' ')) {
if (!magnet.parentNode.parentNode.parentNode.innerHTML.toString().toLowerCase().includes(word.toLowerCase())) {
all_words = false;
}
}
if (all_words) {
return magnet;
}
}
}
}
return magnetElements[0];
}
else {
alert('Aucun résulat trouvé sur Nyaa !');
}
}
if (window.location.href.includes("mavanimes") && window.location.href.includes("adk=true")) {
var r = document.getElementsByTagName('script');
for (var i = (r.length-1); i >= 0; i--) {
if(r[i].getAttribute('id') != 'a'){
r[i].parentNode.removeChild(r[i]);
}
}
let maviframes = document.getElementsByTagName("iframe");
let text = "";
if (maviframes.length < 1 || (maviframes.length == 1 && maviframes[0].src.includes("dailymotion"))) {
document.body.innerHTML = NO_RESULT_PLAYER;
document.body.parentNode.style.overflow = 'hidden';
return;
}
for (let i = 0; i < maviframes.length; i++) {
if (!maviframes[i].src.includes("dailymotion")) {
text += maviframes[i].outerHTML;
}
}
document.body.innerHTML = text;
let mavframes = document.getElementsByTagName("iframe");
for (let i = 0; i < mavframes.length; i++) {
mavframes[i].style.width = "100%";
}
return;
}
else if (window.location.href.includes("nyaa.si") && window.location.href.includes("adk=true")) {
let magnetElement = getMostCompatibleMagnet();
magnetElement.click();
return;
}
// small part designed for franime only
else if (window.location.href.includes("franime.fr") && window.location.href.includes("adk=true")) {
var monTimeout = setTimeout(function() {
document.body.innerHTML = NO_RESULT_PLAYER;
}, 3000);
waitForElm('#play_button').then((elm) => {
clearTimeout(monTimeout);
elm.click();
});
waitForElm("iframe.aspect-video").then((elm) => {
document.body.innerHTML = elm.outerHTML;
let mavframes = document.getElementsByTagName("iframe");
for (let i = 0; i < mavframes.length; i++) {
mavframes[i].style.maxHeight = "100vh";
}
});
waitForElm(".art-layer-play").then((elm) => {
elm.click();
waitForElm("video.art-video").then((elm) => {
window.location.href = elm.src;
});
});
return;
}
else if (window.location.href.includes("adkami")) {
GM_config.init("BetterADK Configuration", {
"syncadklist" : {
"label" : "Synchronisation automatique entre liste ADKami et MAL-Sync",
"type" : "checkbox",
"default" : true
},
"removednswarning" : {
"label" : "Retire le message rouge d'information sur le blocage DNS des lecteurs",
"type" : "checkbox",
"default" : true
},
"alreadywatchedonagenda" : {
"label" : "Affiche par défaut seulement les animés en cours de visionnage dans l'agenda",
"type" : "select",
"options" : {
"yes" : "Oui",
"no" : "Non",
"disable" : "Désactivé"
}
},
"addprofiletomenu" : {
"label" : "Ajoute une option mon profile au menu en haut à droite",
"type" : "checkbox",
"default" : true
},
"removevfepisode" : {
"label" : "Retirer les épisodes VF",
"type" : "checkbox",
"default" : true
},
"removevfagenda" : {
"label" : "Retirer les épisodes VF sur l'agenda",
"type" : "checkbox",
"default" : true
},
"removeteamnames" : {
"label" : "Retirer l'affichage des noms des teams de sub",
"type" : "checkbox",
"default" : true
},
"removeopedpv" : {
"label" : "Retirer les ED, OP et PV des listes d'épisodes",
"type" : "checkbox",
"default" : true
},
"calculateRealEpisodeNumber" : {
"label" : "Recalcul du numéro d'épisode à partir de 1 à chaque nouvelle saison",
"type" : "checkbox",
"default" : true
},
"malicon" : {
"label" : "Afficher l'icone MAL",
"type" : "select",
"options" : {
"both" : "Les deux",
"main" : "Seulement page principale",
"anime" : "Seulement page animé",
"never" : "Jamais"
}
},
"nyaaicon" : {
"label" : "Afficher l'icone Nyaa",
"type" : "select",
"options" : {
"both" : "Les deux",
"main" : "Seulement page principale",
"anime" : "Seulement page animé",
"never" : "Jamais"
}
},
"mavanime" : {
"label" : "Ajouter Mavanime (sur les pages d'animé)",
"type" : "select",
"options" : {
"both" : "Les deux",
"icon" : "Seulement icone",
"player" : "Seulement lecteurs",
"never" : "Jamais"
}
},
"franime" : {
"label" : "Ajouter FRAnime (sur les pages d'animé)",
"type" : "select",
"options" : {
"both" : "Les deux",
"icon" : "Seulement icone",
"player" : "Seulement lecteurs",
"never" : "Jamais"
}
},
"voiranime" : {
"label" : "Ajouter Voiranime (sur les pages d'animé)",
"type" : "select",
"options" : {
"both" : "Les deux",
"icon" : "Seulement icone",
"player" : "Seulement lecteurs",
"never" : "Jamais"
}
},
"customnyaasearch" : {
"label" : "Filtre recherche Nyaa",
"type" : "text",
"default" : "(vostfr|multi) 1080p"
},
"removecomments" : {
"label" : "Masquer par défaut les commentaires sur les pages d'animé",
"type" : "select",
"options" : {
"current" : "Seulement si en train de regarder",
"never" : "Jamais",
"always" : "Toujours"
}
},
"magnetpriority" : {
"label" : "Mots séparés par une virgule, dans l'odre de priorité, pour la selection automatique du magnet/téléchargement",
"type" : "text",
"default" : "Tsundere-Raws,Erai-Raws"
},
"nyaashortcut" : {
"label" : "Raccourci préféré Nyaa",
"type" : "select",
"options" : {
"magnet" : "Magnet",
"download" : "Téléchargement",
"disable" : "Désactivé"
}
}
},
'body { background-color: #99aab5 !important; } #saveBtn, #cancelBtn { background-color: white !important; color: black !important; }',
{
save: function() { location.reload() },
});
addGlobalStyle(`
#GM_config {
height: 600px !important;
width: 50% !important;
opacity: 0.90 !important;
}`)
function openSettingPanel(event) {
if (!event.ctrlKey) {
event.preventDefault();
GM_config.open();
}
}
/**
* Enables to add a custom global css style.
*/
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) {
return;
}
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
/**
* Recalculates right episode number starting from 1 at each new season.
*/
function recalculateEpisodeNumbers(type, adk_id) {
let animeElement = malContent.filter(el => el["anime_id"] == adk_id && el["saison"] > 1);
if (animeElement.length == 0) {
// anime is not more than one season on mal, should not count from 0"
return;
}
let seasonsList = document.getElementsByClassName("ul-episodes");
if (seasonsList && seasonsList.length > 0) {
let seasons = seasonsList[0].getElementsByClassName("saison-container");
if (seasons && seasons.length > 0) {
for (let season of seasons) {
let seasonName = season.getElementsByClassName("saison")
if (seasonName && seasonName.length > 0) {
let seasonNameMatch = seasonName[0].innerText.toLowerCase().match(/saison (\d+)/);
let saisonNumber = seasonNameMatch ? parseInt(seasonNameMatch[1]) : "01";
let episodes = season.getElementsByTagName("a");
if (episodes && episodes.length > 0) {
let newEpisodeNumber = 1;
for (let episode of episodes) {
if (episode.innerText.includes(type) || (type == "vostfr" && !episode.innerText.includes("vf"))) {
let episodeNameMatch = episode.innerText.toLowerCase().match(/episode (\d+)/);
let episodeNumber = episodeNameMatch ? parseInt(episodeNameMatch[1]) : "01";
let oldEp = episodeNumber.toString().padStart(2, '0');
if (oldEp == "00") {
continue;
}
let newEp = newEpisodeNumber.toString().padStart(2, '0');
episode.innerText = episode.innerText.replace(oldEp, newEp);
if (episode.parentNode.classList.contains("actived")) {
let currentPageTitle = document.getElementsByClassName("title-header-video");
if (currentPageTitle && currentPageTitle.length > 0) {
currentPageTitle[0].innerText = currentPageTitle[0].innerText.replace(episodeNumber, newEpisodeNumber);
}
}
newEpisodeNumber++;
}
}
}
}
}
}
}
}
function checkIfAllSeasonStartWithOne() {
let check = true;
let seasonsList = document.getElementsByClassName("ul-episodes");
if (seasonsList && seasonsList.length > 0) {
let seasons = seasonsList[0].getElementsByClassName("saison-container");
if (seasons && seasons.length > 0) {
for (let season of seasons) {
let episodes = season.getElementsByTagName("ul");
let realEpisodes = season.getElementsByTagName("a");
if (realEpisodes && realEpisodes.length > 0) {
for (let ep of realEpisodes) {
if (ep.innerText.includes("Episode")) {
let episodeNameMatch = ep.innerText.toLowerCase().match(/episode (\d+)/);
let episodeNumber = episodeNameMatch ? parseInt(episodeNameMatch[1]) : 99;
check = check && episodeNumber < 2;
break;
}
}
}
}
}
}
return check;
}
function calculateEpisodeNumberFromActived(activedElement, multiLanguages) {
var ulListElement = activedElement.parentNode;
var i = 1;
if (!activedElement.previousSibling && activedElement.innerHTML.includes('000')) {
return 0;
}
while ((activedElement = activedElement.previousSibling) != null ) {
if (activedElement.innerHTML.includes('Episode') && !activedElement.innerHTML.includes('000') && (!multiLanguages || activedElement.innerHTML.includes('vostfr'))) {
i++;
}
}
return i;
}
function calculateEpisodeNumberFromEpAndSeason(ep, season) {
var seasonContainer = document.getElementsByClassName("ul-episodes")[0];
var i = 0;
var currentIndexEpisode = 0;
var currentIndexSeason = 1;
if (season == 0) {
return ep;
}
var seasonElements = seasonContainer.getElementsByClassName("saison-container");
for (var seasonElement of seasonElements) {
var currentSeasonNumber = seasonElements.getElementsByClassName("saison");
var episodeElements = seasonElement.getElementsByTagName("li");
if (!episodeElements) {
continue;
}
for (var episodeElement of episodeElements) {
if (episodeElement.innerHTML.includes('vostfr') && episodeElement.innerHTML.includes('Episode')) {
i++;
}
}
if (currentIndexSeason == season) {
break
}
}
return i + ep;
}
function resizeMainPageToMatchRight() {
var droite = document.querySelector("#col-droit")
var gauche = document.getElementsByClassName("fiche-look")[0]
if (droite && gauche) {
gauche.style.height = Math.min(gauche.clientHeight, droite.clientHeight) + "px";
}
}
/**
* Enables to have a sweet animation on all players thanks to collapsibles.
*/
function collapsePlayerAnimation() {
var coll = document.getElementsByClassName("collapsible");
var collComments = document.getElementsByClassName("collapsible-comments");
var droite = document.querySelector("#col-droit")
var gauche = document.getElementsByClassName("fiche-look")[0]
var i;
for (i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function() {
this.classList.toggle("activedPlayer");
var content = this.nextElementSibling;
if (!content.classList.contains("content") && !content.classList.contains("commentscontent")) {
content = content.nextElementSibling;
}
if (this.classList.contains("collapsibleComments")) {
if (content.style.visibility != "hidden"){
content.style.visibility = "hidden";
content.style.maxHeight = "2500px";
let commentTitle = document.getElementById("collapsibleCommentTitle");
commentTitle.innerText = commentTitle.innerHTML.replace('Commentaires', 'Commentaires (cachés)');
} else {
content.style.visibility = "visible";
content.style.maxHeight = "initial"
let commentTitle = document.getElementById("collapsibleCommentTitle");
commentTitle.innerText = commentTitle.innerHTML.replace('Commentaires (cachés)', 'Commentaires');
}
}
else {
if (content.style.maxHeight != "0px"){
content.style.maxHeight = "0px";
} else {
content.style.maxHeight = "2500px";
}
}
});
if (GM_config.get('removednswarning')) {
if (coll[i].nextElementSibling.innerText.includes("DNS")) {
coll[i].nextElementSibling.remove();
}
}
}
addGlobalStyle(`
.collapsible {
background-color: #777;
color: white;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
}
.collapsible:after {
content: "\\2212";
color: white;
font-weight: bold;
float: right;
margin-left: 5px;
}
.activedPlayer:after {
content: '\\002B';
}
.commentscontent {
padding: 0px !important;
margin: 0px !important;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
.content {
padding: 0px !important;
margin: 0px !important;
max-height: 2500px;
overflow: hidden;
transition: max-height 0.2s ease-out;
}`);
}
// --- CODE ---
// All pages
// auto redirect to www.
if (!window.location.hostname.startsWith("www.")) {
const newURL = "https://www." + window.location.hostname + window.location.pathname + window.location.search;
window.location.replace(newURL);
}
var connected = document.getElementById("headerprofil") != null
var malContent = null;
// Remove VF animes from lists
const elems = document.getElementsByClassName("video-item-list");
let to_remove = [];
for (let i = 0; i < elems.length; i++) {
if (elems.item(i).textContent.toLocaleLowerCase().includes(' vf ')) {
to_remove.push(elems.item(i));
} else if (elems.item(i).textContent.toLocaleLowerCase().includes(' vostfr ')) {
let epVostfr = elems.item(i).getElementsByClassName("episode").item(0);
if (epVostfr) {
epVostfr.innerText = epVostfr.innerText.replace(' vostfr', '')
}
} else if (GM_config.get('removevfepisode') && elems.item(i).textContent.toLocaleLowerCase().includes(' multi ')) {
let epMulti = elems.item(i).getElementsByClassName("episode").item(0);
if (epMulti) {
epMulti.innerText = epMulti.innerText.replace(' multi', '')
}
}
}
if (GM_config.get('removevfepisode')) {
to_remove.forEach(elem => {
$(elem).remove();
});
}
// Remove team name everywhere
if (GM_config.get('removeteamnames')) {
const elems_teams = document.getElementsByClassName("team");
if (!window.location.href.toLowerCase().includes("/anime/")) {
let to_remove_teams = [];
for (let i = 0; i < elems_teams.length; i++) {
to_remove_teams.push(elems_teams.item(i));
}
to_remove_teams.forEach(elem => {
$(elems_teams).remove();
});
}
}
// Add custom icons (mandatory to have configuration panel)
try {
$(document.getElementsByClassName("toolbar")[0].getElementsByTagName("a")[0].getElementsByTagName("div")[0]).remove();
} catch {
}
let newLogo = document.createElement('img');
newLogo.style = "width: 195px; margin-top: 15px; float: left; margin-left: 10px;";
newLogo.src = BETTER_ADK_LOGO;
let beel = document.getElementById("beelzebub");
beel.style = "background-size: contain; background-repeat: no-repeat;";
addGlobalStyle(`@media screen and (min-width: 800px) { #beelzebub { background-image: url(${ZENRAC_AVATAR}) !important; }}`);
addGlobalStyle('@media screen and (min-width: 800px) { #beelzebub:after { content: "EZ EZ EZ EZ" !important; bottom: 7px; }}');
addGlobalStyle('#video { margin-bottom: 10px; }');
let zenrac = document.createElement("a");
zenrac.target = "_blank"
zenrac.href = "https://zenrac.github.io/"
zenrac.addEventListener("click", openSettingPanel);
// display version
document.getElementsByClassName("col-12 copy")[0].textContent += " - BetterADK v" + GM_info.script.version;
beel.parentNode.insertBefore(zenrac, beel.nextSibling);
zenrac.appendChild(beel);
document.title = document.title.replace('ADKami', 'BetterADK');
document.getElementsByClassName("toolbar")[0].getElementsByTagName("a")[0].appendChild(newLogo);
if (GM_config.get('addprofiletomenu')) {
var profileElement = document.getElementById("headerprofil");
if (profileElement) {
var profileContent = profileElement.getElementsByTagName("ul")[0];
if (profileContent) {
var profileFirstChild = profileContent.getElementsByTagName("li")[0];
if (profileFirstChild) {
var newProfileElement = profileFirstChild.cloneNode(true);
var username = document.head.querySelector("[name~=pseudo_member][content]").content;
if (username) {
newProfileElement.firstChild.href = `https://${window.location.hostname}/profil/${username}`;
newProfileElement.firstChild.innerText = "Mon profile";
profileContent.insertBefore(newProfileElement, profileFirstChild)
}
}
}
}
}
// on main page
if (elems.length > 0) {
// add mal icons
if (["both", "main"].includes(GM_config.get('malicon'))) {
let req = new Request(`https://${window.location.hostname}/api/main?objet=adk-mal-all`, {
method: 'GET',
credentials: 'include',
});
fetch(req)
.then(response => response.json())
.then(data => {
if (data.data === undefined) return;
malContent = data.data;
for (let i = 0; i < elems.length; i++) {
let after = elems[i].getElementsByClassName(connected ? "right list-edition" : "look")[0];
let title = elems[i].getElementsByClassName("title")[0];
let episode = elems[i].getElementsByClassName("episode")[0];
let clickableNyaa = document.createElement("a");
let ep = episode.innerText.toLowerCase().match(/episode (\d+)/);
let saison = episode.innerText.toLowerCase().match(/saison (\d+)/);
let id = after.dataset["info"].split(",")[0];
let malElement = data.data.filter(el => el["anime_id"] == id);
if (saison) {
let malElementSeason = malElement.filter(el => el["saison"] == saison[1]);
if (malElementSeason && malElementSeason.length > 0) {
malElement = malElementSeason;
}
}
malElement = malElement[0];
if (malElement !== undefined) {
let clickable = document.createElement("a");
clickable.target = "_blank"
clickable.href = "https://myanimelist.net/anime/" + malElement["mal_id"];
clickable.classList.add("lecteur-icon");
clickable.classList.add("crunchyroll");
let el = document.createElement("img");
clickable.appendChild(el);
el.style = "width: 40px";
el.src = MAL_ICON;
elems[i].insertBefore(clickable, after.nextSibling);
}
}
})
.catch(console.error);
}
if (["both", "main"].includes(GM_config.get('nyaaicon'))) {
// add nyaa icons
for (let i = 0; i < elems.length; i++) {
let after = elems[i].getElementsByClassName(connected ? "right list-edition" : "look")[0];
let title = elems[i].getElementsByClassName("title")[0];
let episode = elems[i].getElementsByClassName("episode")[0];
let clickableNyaa = document.createElement("a");
let ep = episode.innerText.toLowerCase().match(/episode (\d+)/);
let oav = episode.innerText.toLowerCase().match(/oav (\d+)/);
let saison = episode.innerText.toLowerCase().match(/saison (\d+)/);
title = title.textContent.replace(',', '').replace('.', '').split(':')[0].split('-')[0].trim()
if (ep) {
let epStr = parseInt(ep[1]).toString().padStart(2, '0');
let saisonStr = saison ? parseInt(saison[1]).toString().padStart(2, '0') : "01";
clickableNyaa.href = "https://nyaa.si/?q=" + title + ` (${epStr}|S${saisonStr}E${epStr}) ${GM_config.get('customnyaasearch')}`;
}
else if (oav) {
let epStr = parseInt(oav[1]).toString().padStart(2, '0');
let saisonStr = saison ? parseInt(saison[1]).toString().padStart(2, '0') : "01";
clickableNyaa.href = "https://nyaa.si/?q=" + title + ` (${epStr}|S${saisonStr}E${epStr}) ${GM_config.get('customnyaasearch')}`;
}
else {
clickableNyaa.href = "https://nyaa.si/?q=" + title + " " + GM_config.get('customnyaasearch');
}
clickableNyaa.target = "_blank"
let elNyaa = document.createElement("img");
clickableNyaa.appendChild(elNyaa);
clickableNyaa.classList.add("lecteur-icon");
clickableNyaa.classList.add("crunchyroll");
elNyaa.style = "width: 40px";
elNyaa.src = NYAA_ICON;
clickableNyaa.addEventListener('click', (event) => {
if (ep && saison) {
event.preventDefault();
var url = elems[i].getElementsByClassName("img")[0].href;
$.get(url, null, function(text) {
var actived = $(text).find('.actived')[0];
if (actived) {
var newEp = calculateEpisodeNumberFromActived(actived, true);
let newEpStr = newEp.toString().padStart(2, '0');
let epStr = parseInt(ep[1]).toString().padStart(2, '0');
let saisonStr = saison ? parseInt(saison[1]).toString().padStart(2, '0') : "01";
if (epStr != newEpStr) {
clickableNyaa.href = "https://nyaa.si/?q=" + title + ` (${newEpStr}|S${saisonStr}E${newEpStr}|${epStr}|S${saisonStr}E${epStr}) ${GM_config.get('customnyaasearch')}`;
}
}
window.open(clickableNyaa.href, '_blank');
});
}
});
elems[i].insertBefore(clickableNyaa, after.nextSibling);
// Magnet or Download icon
let nyaaShortcutMod = GM_config.get('nyaashortcut');
if (nyaaShortcutMod != "disable") {
let clickableNyaaMagnet = document.createElement("img");
clickableNyaaMagnet.addEventListener('click', function() {
var alreadyIframe = clickableNyaaMagnet.getElementsByClassName("nyaaMagnet")[0];
var urlNyaa = "";
if (ep) {
let epBeforeStr = parseInt(ep[1]).toString().padStart(2, '0');
let saisonStr = saison ? parseInt(saison[1]).toString().padStart(2, '0') : "01";
let epStr = ep.toString().padStart(2, '0');
urlNyaa = "https://nyaa.si/?q=" + title + ` (${epStr}|S${saisonStr}E${epStr}) ${GM_config.get('customnyaasearch')}`;
if (epBeforeStr != epStr) {
urlNyaa = "https://nyaa.si/?q=" + title + ` (${epStr}|S${saisonStr}E${epStr}|${epBeforeStr}|S${saisonStr}E${epBeforeStr}) ${GM_config.get('customnyaasearch')}`;
}
}
else if (oav) {
let saisonStr = saison ? parseInt(saison[1]).toString().padStart(2, '0') : "01";
let epStr = oav.toString().padStart(2, '0');
urlNyaa = "https://nyaa.si/?q=" + title + ` (${epStr}|S${saisonStr}E${epStr}) ${GM_config.get('customnyaasearch')}`;
}
else {
urlNyaa = "https://nyaa.si/?q=" + title + " " + GM_config.get('customnyaasearch');
}
urlNyaa += `&adk=true&nyaashortcut=${GM_config.get('nyaashortcut')}&magnetpriority=${GM_config.get('magnetpriority')}`;
let frameMagnet = document.createElement("iframe");
frameMagnet.src = urlNyaa;
frameMagnet.classList.add("nyaaMagnet");
if (alreadyIframe) {
clickableNyaaMagnet.replaceChild(frameMagnet, alreadyIframe);
}
else {
clickableNyaaMagnet.appendChild(frameMagnet);
}
});
clickableNyaaMagnet.classList.add("lecteur-icon");
clickableNyaaMagnet.style.marginRight = "5px";
clickableNyaaMagnet.style.opacity = ".6";
clickableNyaaMagnet.style.float = "right";
clickableNyaaMagnet.style.width = "40px";
clickableNyaaMagnet.style.cursor = "pointer";
clickableNyaaMagnet.src = nyaaShortcutMod == "download" ? DOWNLOAD_ICON : MAGNET_ICON;
elems[i].insertBefore(clickableNyaaMagnet, after.nextSibling);
}
}
}
}
// Any anime page
if (window.location.href.toLowerCase().includes("/anime/")) {
let res = window.location.href.match(/anime\/(\d+)/);
if (res) {
document.title = document.title.replace(' vostfr', '');
try {
let lienNormal = document.getElementsByClassName("normal")
let titleLink = lienNormal.item(0).getElementsByTagName("li")
let titlevostfr = titleLink.item(titleLink.length - 1);
titlevostfr.getElementsByTagName("a").item(0).getElementsByTagName("span").item(0).textContent = titlevostfr.getElementsByTagName("a").item(0).getElementsByTagName("span").item(0).textContent.replace('vostfr', '');
} catch {}
try {
document.getElementById("find_episode").placeholder = document.getElementById("find_episode").placeholder.replace(' (77 vf)', '');
} catch {}
document.getElementsByClassName("title-header-video")[0].innerText = document.getElementsByClassName("title-header-video")[0].innerText.replace(' vostfr', '')
try {
document.getElementById("after-video").getElementsByTagName("span")[0].innerText = document.getElementById("after-video").getElementsByTagName("span")[0].innerText.replace(' vostfr', '');
document.getElementById("before-video").getElementsByTagName("span")[0].innerText = document.getElementById("before-video").getElementsByTagName("span")[0].innerText.replace(' vostfr', '');
document.getElementsByClassName("normal")[0].getElementsByTagName("li")[2].getElementsByTagName("a")[0].getElementsByTagName("span")[0].innerText = document.getElementsByClassName("normal")[0].getElementsByTagName("li")[2].getElementsByTagName("a")[0].getElementsByTagName("span")[0].innerText.replace(' vostfr', '');
} catch {}
let lis = document.getElementsByClassName("os-content")[0].getElementsByTagName("li");
// Add data to all episode
let allEpisodes = document.getElementsByClassName("ul-episodes")[0].getElementsByTagName("li");
for (let episodeFromList of allEpisodes) {
if (episodeFromList.firstElementChild && episodeFromList.firstElementChild.innerText.includes("Episode")) {
let episodeNumber = episodeFromList.firstElementChild.innerText.toLowerCase().match(/episode (\d+)/);
episodeFromList.dataset.epnumber = parseInt(episodeNumber[1]);
};
}
// Remove useless fake EPs (OP, PV, ED, "vostfr in name")
let to_remove_again = [];
for (let i = 0; i < lis.length; i++) {
let toEdit = lis.item(i).getElementsByTagName("a")[0];
if (toEdit !== undefined) {
toEdit.innerText = toEdit.innerText.replace(' vostfr', '');
}
if (GM_config.get('removevfepisode')) {
if (lis.item(i).textContent.toLocaleLowerCase().includes(' vf')) {
to_remove_again.push(lis.item(i));
}
}
if (GM_config.get('removeopedpv')) {
if (lis.item(i).textContent.includes('PV ') ||
lis.item(i).textContent.includes('Ending ') ||
lis.item(i).textContent.includes('Opening ')) {
to_remove_again.push(lis.item(i));
}
}
}
to_remove_again.forEach(elem => {
$(elem).remove();
});
let adk_id = res[1];
// Mavanime.co
let nb = document.getElementsByClassName("title-header-video")[0].innerText.split('-').length - 1;
let title = document.getElementsByClassName("title-header-video")[0].innerText.replace(',', '').replace('.', '').split(':')[0].split('-').slice(0, nb).join('-').trim().toLowerCase().split(' ').join('-');
let originalTitle = document.getElementsByClassName("title-header-video")[0].innerText.replace(',', '').replace('.', '').split(':')[0].split('-').slice(0, nb).join(' ').trim();
let ep = document.getElementsByClassName("title-header-video")[0].innerText.split('-')[nb].toLowerCase().match(/episode (\d+)/);
let oav = document.getElementsByClassName("title-header-video")[0].innerText.split('-')[nb].toLowerCase().match(/oav (\d+)/);
let saison = document.getElementsByClassName("title-header-video")[0].innerText.split('-')[nb].match(/saison (\d+)/);
let film = document.getElementsByClassName("title-header-video")[0].innerText.split('-')[nb].match(/film (\d+)/);
title = title.replace(/[^a-zA-Z0-9!?:-_]/g, "-");
title = title.replace(/[^a-zA-Z0-9-]/g, '');
let titleWithDashes = title;
let activedElement = document.getElementsByClassName("actived")[0];
let newEpElement = calculateEpisodeNumberFromActived(activedElement, false);
let ici = document.getElementsByClassName("anime-information-icon")[0];
var currentSeason = 1
if (saison) {
currentSeason = saison[1];
}
var allSeasonStartWithOne = checkIfAllSeasonStartWithOne();
var seasonNumber = document.getElementById("watchlist-saison").dataset.max
if (!seasonNumber) {
seasonNumber = document.getElementsByClassName("saison").length.toString()
}
// Build MAV url
let titleMav = title;
if (saison) {
titleMav += "-" + saison[1];
}
if (newEpElement) {
titleMav += "-" + (parseInt(newEpElement) > 9 ? parseInt(newEpElement) : "0" + parseInt(newEpElement));
}
if (oav) {
titleMav += "-oav-" + parseInt(oav[1]);
}
if (film) {
titleMav += "-film-" + parseInt(film[1]);
}
titleMav += "-vostfr";
let urlNormalMav = "https://www.mavanimes.co/" + titleMav;
let urlMav = urlNormalMav + "/?adk=true";
// Build FRAnime url
let titleFra = title;
if (oav) {
titleFra += `-oav?s=${currentSeason}&ep=` + parseInt(oav[1]);
}
else if (film) {
titleFra += `-film?s=${currentSeason}&ep=` + parseInt(film[1]);
}
else {
titleFra += "?s=" + currentSeason;
if (newEpElement) {
titleFra += "&ep=" + parseInt(newEpElement);
}
}
titleFra += "&lang=vo"
let urlNormalFra = "https://franime.fr/anime/" + titleFra;
let urlFra = urlNormalFra + "&adk=true";
// Build Voiranime url
let titleVoa = title;
if (currentSeason > 1) {
titleVoa += `-${currentSeason}/${title}-${currentSeason}`;
} else {
titleVoa += "/" + title;
}
if (oav) {
titleVoa += `-oav` + parseInt(oav[1]);
}
else if (film) {
titleVoa += `-film` + parseInt(film[1]);
}
else if (newEpElement) {
titleVoa += "-" + (parseInt(newEpElement) > 9 ? parseInt(newEpElement) : "0" + parseInt(newEpElement));
}
titleVoa += "-vostfr"
let urlNormalVoa = "https://v5.voiranime.com/anime/" + titleVoa;
let urlVoa = urlNormalVoa; // + "/?adk=true";
// Add MAL Icon
if ((["both", "anime"].includes(GM_config.get('malicon'))) || GM_config.get('calculateRealEpisodeNumber') || GM_config.get('syncadklist')) {
let req = new Request(`https://${window.location.hostname}/api/main?objet=adk-mal-all`, {
method: 'GET',
credentials: 'include',
});
fetch(req)
.then(response => response.json())
.then(data => {
if (data.data === undefined) return;
malContent = data.data;
// recalculate episode number
if (GM_config.get('calculateRealEpisodeNumber')) {
if (seasonNumber > 1) {
recalculateEpisodeNumbers("vostfr", adk_id);
recalculateEpisodeNumbers("vf", adk_id);
}
}
if (!["both", "anime"].includes(GM_config.get('malicon'))) return;
let url = data.data.find(el => el["anime_id"] == adk_id);
let malElement = data.data.filter(el => el["anime_id"] == adk_id);
if (saison) {
let malElementSeason = malElement.filter(el => el["saison"] == saison[1]);
if (malElementSeason && malElementSeason.length > 0) {
malElement = malElementSeason;
}
}
malElement = malElement[0];
if (url !== undefined) {
let clickable = document.createElement("a");
clickable.id = "malicon";
clickable.target = "_blank";
clickable.href = "https://myanimelist.net/anime/" + malElement["mal_id"];
let el = document.createElement("img");
clickable.appendChild(el);
el.style = "width: 40px";
el.src = MAL_ICON;
ici.appendChild(clickable);
}
})
.catch(console.error);
}
// Add Nyaa.si Icon
if (["both", "anime"].includes(GM_config.get('nyaaicon'))) {
// Nyaa icon
let clickableNyaa = document.createElement("a");
if (ep) {
let epBeforeStr = parseInt(ep[1]).toString().padStart(2, '0');
let saisonStr = saison ? parseInt(saison[1]).toString().padStart(2, '0') : "01";
let epStr = newEpElement.toString().padStart(2, '0');
clickableNyaa.href = "https://nyaa.si/?q=" + originalTitle + ` (${epStr}|S${saisonStr}E${epStr}) ${GM_config.get('customnyaasearch')}`;
if (epBeforeStr != epStr) {
clickableNyaa.href = "https://nyaa.si/?q=" + originalTitle + ` (${epStr}|S${saisonStr}E${epStr}|${epBeforeStr}|S${saisonStr}E${epBeforeStr}) ${GM_config.get('customnyaasearch')}`;
}
} else if (oav) {
let epBeforeStr = parseInt(oav[1]).toString().padStart(2, '0');
let saisonStr = saison ? parseInt(saison[1]).toString().padStart(2, '0') : "01";
let epStr = newEpElement.toString().padStart(2, '0');
clickableNyaa.href = "https://nyaa.si/?q=" + originalTitle + ` (${epStr}|S${saisonStr}E${epStr}) ${GM_config.get('customnyaasearch')}`;
}
else {
clickableNyaa.href = "https://nyaa.si/?q=" + originalTitle + " " + GM_config.get('customnyaasearch');
}
clickableNyaa.target = "_blank"
let elNyaa = document.createElement("img");
clickableNyaa.appendChild(elNyaa);
elNyaa.style = "width: 40px";
elNyaa.src = NYAA_ICON;
ici.appendChild(clickableNyaa);
// Magnet or Download icon
let nyaaShortcutMod = GM_config.get('nyaashortcut');
if (nyaaShortcutMod != "disable") {
let clickableNyaaMagnet = document.createElement("img");
clickableNyaaMagnet.addEventListener('click', function() {
var alreadyIframe = clickableNyaaMagnet.getElementsByClassName("nyaaMagnet")[0];
var urlNyaa = "";
if (ep) {
let epBeforeStr = parseInt(ep[1]).toString().padStart(2, '0');
let saisonStr = saison ? parseInt(saison[1]).toString().padStart(2, '0') : "01";
let epStr = newEpElement.toString().padStart(2, '0');
urlNyaa = "https://nyaa.si/?q=" + originalTitle + ` (${epStr}|S${saisonStr}E${epStr}) ${GM_config.get('customnyaasearch')}`;
if (epBeforeStr != epStr) {
urlNyaa = "https://nyaa.si/?q=" + originalTitle + ` (${epStr}|S${saisonStr}E${epStr}|${epBeforeStr}|S${saisonStr}E${epBeforeStr}) ${GM_config.get('customnyaasearch')}`;
}
} else if (oav) {
let epBeforeStr = parseInt(oav[1]).toString().padStart(2, '0');
let saisonStr = saison ? parseInt(saison[1]).toString().padStart(2, '0') : "01";
let epStr = newEpElement.toString().padStart(2, '0');
urlNyaa = "https://nyaa.si/?q=" + originalTitle + ` (${epStr}|S${saisonStr}E${epStr}) ${GM_config.get('customnyaasearch')}`;
if (epBeforeStr != epStr) {
urlNyaa = "https://nyaa.si/?q=" + originalTitle + ` (${epStr}|S${saisonStr}E${epStr}|${epBeforeStr}|S${saisonStr}E${epBeforeStr}) ${GM_config.get('customnyaasearch')}`;
}
}
else {
urlNyaa = "https://nyaa.si/?q=" + originalTitle + " " + GM_config.get('customnyaasearch');
}
urlNyaa += `&adk=true&nyaashortcut=${GM_config.get('nyaashortcut')}&magnetpriority=${GM_config.get('magnetpriority')}`;
let frameMagnet = document.createElement("iframe");
frameMagnet.src = urlNyaa;
frameMagnet.classList.add("nyaaMagnet");
if (alreadyIframe) {
clickableNyaaMagnet.replaceChild(frameMagnet, alreadyIframe);
}
else {
clickableNyaaMagnet.appendChild(frameMagnet);
}
});
clickableNyaaMagnet.style.width = "40px";
clickableNyaaMagnet.style.cursor = "pointer";
clickableNyaaMagnet.src = nyaaShortcutMod == "download" ? DOWNLOAD_ICON : MAGNET_ICON;
ici.appendChild(clickableNyaaMagnet);
}
}
function AddPlayer(title, urlNormal, url, openAtStart) {
let iframeLink = document.createElement("iframe");
let main = document.createElement("p");
main.classList.add("h-t-v-a");
let link = document.createElement("a");
link.target = "_blank"
link.href = urlNormal;
link.innerText = " " + title;
let team = document.createElement("a");
team.target = "_blank"
team.href = urlNormal;
team.innerText = "[BetterADK]";
team.classList.add("team");
main.appendChild(team);
main.appendChild(link);
iframeLink.classList.add("lecteur-video");
iframeLink.classList.add("row");
iframeLink.classList.add("active");
iframeLink.classList.add("external-players-betteradk");
iframeLink.classList.add("content");
iframeLink.setAttribute("allowfullscreen", "true");
iframeLink.src = url;
iframeLink.style.width = "100%";
iframeLink.style.height = "500px";
iframeLink.style.border = "none";
iframeLink.style.display = "none";
iframeLink.addEventListener("load", function() {
setTimeout(function() {
iframeLink.style.display = "block"; // Ou une autre valeur d'affichage appropriée
}, 1000); // 1s
});
// if 4 players or less and licensed or no player
if (openAtStart && (document.getElementsByClassName("h-t-v-a").length < 5 && document.getElementsByClassName("licensier-text")[0] !== undefined) || document.getElementsByClassName("h-t-v-a").length < 1) {
iframeLink.style.maxHeight = "2500px";
} else {
iframeLink.style.maxHeight = "0px";
main.classList.add("activedPlayer");
}
let video = document.getElementById("video");
let playerparent = document.createElement("div");
playerparent.appendChild(main);
playerparent.appendChild(iframeLink);
video.appendChild(playerparent);
}
function AddIcon(urlNormal, image) {
let clickable = document.createElement("a");
clickable.href = urlNormal;
clickable.target = "_blank"
let el = document.createElement("img");
clickable.appendChild(el);
el.style = "width: 40px";
el.src = image
ici.appendChild(clickable);
}
// Add Mav Icon
if (['both', 'icon'].includes(GM_config.get('mavanime'))) {
AddIcon(urlNormalMav, MAV_ICON)
}
// Add MAV players
if (['both', 'player'].includes(GM_config.get('mavanime'))) {
AddPlayer("Mavanimes.co", urlNormalMav, urlMav, true)
}
// Add FRAnime Icon
if (['both', 'icon'].includes(GM_config.get('franime'))) {
AddIcon(urlNormalFra, FRA_ICON)
}
// Add FRAnime players
if (['both', 'player'].includes(GM_config.get('franime'))) {
AddPlayer("FRAnime.fr", urlNormalFra, urlFra, true)
}
// Add Voiranime Icon
if (['both', 'icon'].includes(GM_config.get('voiranime'))) {
AddIcon(urlNormalVoa, VOA_ICON)
}
// Add Voiranime players
if (['both', 'player'].includes(GM_config.get('voiranime'))) {
AddPlayer("Voiranime.com", urlNormalVoa, urlVoa, !['both', 'player'].includes(GM_config.get('mavanime')) && !['both', 'icon'].includes(GM_config.get('franime')))
}
if (GM_config.get('syncadklist')) {
waitForElm('#malEpisodes').then((elm) => {
var adklistInput = document.getElementById("watchlist-episode");
var adklistSeasonInput = document.getElementById("watchlist-saison");
if (adklistInput) {
adklistInput.disabled = true;
}
if (adklistSeasonInput) {
adklistSeasonInput.disabled = true;
}
waitForElm('#watchlist-actuel').then((elmButton) => {
var newElem = elmButton.cloneNode(true);
var newElemRemove = elmButton.cloneNode(true);
elmButton.parentNode.replaceChild(newElem, elmButton);
newElem.parentNode.insertBefore(newElemRemove, newElem)
newElem.innerText = "+1 Episode";
newElemRemove.innerText = "-1 Episode";
newElemRemove.style.backgroundColor = "rgba(255,0,0,.65)";
newElem.addEventListener('click', function() {
let maxEpisodes = parseInt(document.getElementById("malTotal").innerText);
let toSet = Math.min(maxEpisodes, parseInt(elm.value) + 1)
if (elm.value != toSet) {
elm.value = toSet;
if (elm.value == maxEpisodes) {
document.getElementById("malStatus").value = 2;
}
elm.dispatchEvent(new Event('change'));
}
});
newElemRemove.addEventListener('click', function() {
let toSet = Math.max(parseInt(elm.value) - 1, 0);
if (elm.value != toSet) {
elm.value = toSet;
elm.dispatchEvent(new Event('change'));
}
});
});
elm.addEventListener('change', (event) => {
adklistInput.value = Math.min(document.getElementById("watchlist-episode").dataset.max, event.target.value)
document.getElementById("watchlist").click()
});
setInterval(() => {
var toSave = false;
var valueToSet = Math.min(document.getElementById("watchlist-episode").dataset.max, elm.value)
if (adklistSeasonInput && adklistSeasonInput.type != "hidden" && valueToSet != 0) {
var seasonToSet = Math.min(document.getElementById("watchlist-saison").dataset.max, currentSeason);
if (adklistSeasonInput.value > currentSeason) {
return;
}
if (adklistSeasonInput.value != seasonToSet && seasonToSet != 0) {
adklistSeasonInput.value = seasonToSet
toSave = true;
}
}
if (seasonToSet > 1 && !allSeasonStartWithOne) {
let activedElement = document.getElementsByClassName("actived")[0];
let episodesSameSeason = document.getElementsByClassName("actived")[0].parentNode.getElementsByTagName("li");
valueToSet = episodesSameSeason[valueToSet - 1].dataset.epnumber;
}
if (adklistInput.value != valueToSet && document.activeElement != elm && valueToSet != 0) {
adklistInput.value = valueToSet
toSave = true;
}
if (toSave) {
document.getElementById("watchlist").click()
}
}, 100);
});
waitForElm('#malStatus').then((elm) => {
var adklistInput = document.getElementById("watchlist_look");
var adklistSeasonInput = document.getElementById("watchlist-saison");
adklistInput.disabled = true;
elm.addEventListener('change', (event) => {
adklistInput.value = (elm.value != 23) ? CORRELATION_ADK_MAL[elm.value] : 1;
document.getElementById("watchlist").click()
});
setInterval(() => {
var valueToSet = (elm.value != 23) ? CORRELATION_ADK_MAL[elm.value] : 1
if (!document.querySelector("#AddMal") && valueToSet && valueToSet != -1 && adklistInput.value != valueToSet) {
if (adklistSeasonInput.value > currentSeason) {
return;
}
adklistInput.value = valueToSet;
document.getElementById("watchlist").click()
}
}, 100);
});
waitForElm('#malUserRating').then((elm) => {
var adklistInput = document.getElementById("watchlist-note");
var adklistSeasonInput = document.getElementById("watchlist-saison");
adklistInput.disabled = true;
elm.addEventListener('change', (event) => {
adklistInput.value = Math.round(event.target.value / 10)
document.getElementById("watchlist").click()
});
setInterval(() => {
var valueToSet = Math.round(elm.value / 10)
if (adklistInput.value != valueToSet && document.activeElement != elm && valueToSet != 0) {
if (adklistSeasonInput.value > currentSeason) {
return;
}
adklistInput.value = valueToSet
document.getElementById("watchlist").click()
}
}, 100);
});
waitForElm('#malRating').then((elm) => {
setInterval(() => {
if (elm && elm.href && elm.href.includes("myanimelist")) {
var malicon = document.getElementById("malicon");
if (malicon && malicon.href != elm.href) {
malicon.href = elm.href;
clearInterval(this)
}
}
}, 100);
});
}
// collapsible comments
function transformCommentsToCollapsible(visible) {
var commentDiv = document.getElementById("comments");
if (commentDiv) {
commentDiv = commentDiv.getElementsByTagName("div")[0]
var titleComment = commentDiv.getElementsByClassName("title")[0];
titleComment.innerText = titleComment.innerText.replace("Commentaire", "Commentaires");
titleComment.classList.add("collapsible");
titleComment.classList.add("collapsibleComments");
titleComment.id = "collapsibleCommentTitle";
titleComment.style.marginLeft = "0px";
var formComment = commentDiv.getElementsByTagName("form")[0]
var commentsComment = commentDiv.getElementsByClassName("comm");
var divComment = document.createElement("div");
divComment.classList.add("commentscontent");
divComment.id = "commentsDiv";
commentDiv.insertBefore(divComment, formComment)
divComment.parentNode.insertBefore(formComment, divComment);
for (var com of commentsComment) {
divComment.appendChild(com);
}
if ((visible == null && (GM_config.get('removecomments') == "always"
|| (GM_config.get('removecomments') == "current" && document.getElementById("watchlist_look") && document.getElementById("watchlist_look").value == 1))) || visible == false)
{
divComment.style.visibility = "hidden"
divComment.style.maxHeight = "2500px"
titleComment.innerText = titleComment.innerText.replace('Commentaires', 'Commentaires (cachés)');
titleComment.classList.toggle("activedPlayer");
}
var btnComment = document.getElementById("comm-add");
if (btnComment) {
btnComment.addEventListener('click', function() {
let visibleOrNot = !document.getElementById("comments").getElementsByClassName("title")[0].classList.contains("activedPlayer");
setInterval(() => {
var elm = document.getElementById("collapsibleCommentTitle")
if (!elm) {
transformCommentsToCollapsible(visibleOrNot);
collapsePlayerAnimation()
clearInterval(this)
}
}, 100);
});
}
var observer = new MutationObserver(function(mutationsList, observer) {
for (let mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'data-token') {
mutation.target.parentNode.dataset.token = mutation.target.dataset.token;
}
}
});
observer.observe(document.getElementById('commentsDiv'), { attributes: true, attributeOldValue: true, attributeFilter: ['data-token'] });
}
}
transformCommentsToCollapsible(null);
// collapsible players
let elemsHeader = document.getElementsByClassName("h-t-v-a");
for (let u = 0; u < elemsHeader.length; u++) {
elemsHeader[u].classList.add("collapsible");
}
let videoBlocks = document.getElementsByClassName("video-block");
for (let u = 0; u < videoBlocks.length; u++) {
videoBlocks[u].classList.add("content");
}
let redirectionBlocks = document.getElementsByClassName("lecteur-redirection");
for (let u = 0; u < redirectionBlocks.length; u++) {
redirectionBlocks[u].classList.add("content");
}
let iframes = document.getElementsByClassName("lecteur-video");
for (let u = 0; u < iframes.length; u++) {
iframes[u].classList.add("content");
}
collapsePlayerAnimation();
}
}
// Agenda page
if (window.location.href.toLowerCase().includes("agenda")) {
const agenda = document.getElementsByClassName("col-12 episode");
let to_delete = [];
for (let u = 0; u < agenda.length; u++) {
if (agenda.item(u).textContent.toLocaleLowerCase().includes(' vf')) {
to_delete.push(agenda.item(u));
} else if (GM_config.get('removevfagenda') && agenda.item(u).textContent.toLocaleLowerCase().includes(' multi')) {
let titleAgendaEp = agenda.item(u).getElementsByClassName("epis");
if (titleAgendaEp && titleAgendaEp.length > 0) {
titleAgendaEp[0].innerText = titleAgendaEp[0].innerText.replace(' multi', '')
}
}
}
if (GM_config.get('removevfagenda')) {
to_delete.forEach(elem => {
$(elem).remove();
});
}
if (GM_config.get('alreadywatchedonagenda') != "disable") {
$.get(`https://${window.location.hostname}/api/main?objet=anime-list`, null, function(text){
if (text && text["data"] && text["data"]["items"]) {
var currentAnimes = text["data"]["items"]
var currentWatchingAnimes = currentAnimes.filter(m => !["4", "2"].includes(m["genre"]))
var currentWatchingAnimesIds = currentWatchingAnimes.map(m => m["anime"]);
var checkbox = document.getElementById("agenda-filter-watch").getElementsByTagName("input")[0];
checkbox.parentNode.id = "agenda-filter-watch-new";
var newCheckbox = checkbox.cloneNode(true);
checkbox.parentNode.replaceChild(newCheckbox, checkbox);
checkbox = newCheckbox;
var epOne = checkbox.parentNode.cloneNode(true);
epOne.id = "agenda-filter-watch-one";
epOne.innerHTML = epOne.innerHTML.replace("En visionnage", "Premier episode")
epOne.title = "Toujours afficher les premiers épisodes (même si filtre)"
checkbox.parentNode.parentNode.insertBefore(epOne, checkbox.parentNode.nextSibling);
epOne = epOne.firstElementChild;
checkbox.checked = GM_config.get('alreadywatchedonagenda') == "yes";
epOne.checked = GM_config.get('alreadywatchedonagenda') == "yes";
epOne.addEventListener('change', function() {
for (let u = 0; u < agenda.length; u++) {
agenda.item(u).style.display = "initial";
}
var event = new Event('change');
checkbox.dispatchEvent(event);
});
var pannelList = document.getElementById("pannel-list");
var legendeDiv = document.getElementsByClassName("legende")[0];
var newElementLegende = legendeDiv.firstElementChild.cloneNode(true);
newElementLegende.id = "already-seen-legend";
newElementLegende.innerText = "Déjà vu";
newElementLegende.style.backgroundColor = "#ff7c2b";
legendeDiv.insertBefore(newElementLegende, pannelList);
addGlobalStyle('.agenda a .episode.vu .date_hour::before { content: "" !important; }');
checkbox.addEventListener('change', function() {
if (this.checked) {
for (let u = 0; u < agenda.length; u++) {
var animeId = agenda.item(u).dataset.info.split(',')[0];
if (!currentWatchingAnimesIds.includes(animeId)) {
if (epOne.checked && agenda.item(u).dataset.info.split(',')[1] == 1 && agenda.item(u).dataset.info.split(',')[3] == 1) {
continue;
}
agenda.item(u).style.display = "none";
}
else {
var animeElement = currentAnimes.find(anime => anime["anime"] == animeId)
if (animeElement && animeElement["genre"] == 3 && agenda.item(u).dataset.info.split(',')[2] > animeElement["saison"]) {
agenda.item(u).style.display = "none";
}
}
}
} else {
for (let u = 0; u < agenda.length; u++) {
agenda.item(u).style.display = "initial";
}
}
});
for (let u = 0; u < agenda.length; u++) {
agenda.item(u).style.display = "initial";
}
var event = new Event('change');
checkbox.dispatchEvent(event);
}
});
}
}
}
})();