nautiljon-total-time

Dans le bloc-notes, calcule la durée totale de la liste des animes et dramas sélectionnés ainsi que la durée totale par série. Calcule également la durée totale des séries sur leur fiche.

// ==UserScript==
// @name             nautiljon-total-time
// @namespace        http://tampermonkey.net/
// @version          0.5.2
// @description      Dans le bloc-notes, calcule la durée totale de la liste des animes et dramas sélectionnés ainsi que la durée totale par série. Calcule également la durée totale des séries sur leur fiche.
// @author           Ed38
// @license          MIT
// @match            https://www.nautiljon.com/membre/a-voir,*,anime.html*
// @match            https://www.nautiljon.com/membre/a-voir,*,drama.html*
// @match            https://www.nautiljon.com/animes/*
// @match            https://www.nautiljon.com/dramas/*
// @icon             https://www.google.com/s2/favicons?sz=64&domain=nautiljon.com
// @grant            GM_addStyle
// @noframes
// ==/UserScript==

(function() {
    'use strict';

    const testListURL = /^https:\/\/www.nautiljon.com\/membre\/a-voir,.*/ ;

    if (testListURL.test(document.location)) {
        document.querySelector("input[data-id='listingListe']").addEventListener("keyup", totalTimeCounter,false);
        totalTimeCounter();
    }
    else {
        let numberOfEpisodesSpan = document.querySelector('span[itemprop = "numberOfEpisodes"]')
        let numberOfEpisodes = numberOfEpisodesSpan.textContent ;
        if(~~numberOfEpisodes > 1){

            let episodeDuration = numberOfEpisodesSpan.nextSibling.textContent.replace(/\s+/g, '').replace(/^.*[x×]/,'');
            let hours = 0;
            let minutes = 0;
            // hours & minutes
            if (episodeDuration.match(/^(\d+)h.*/)) {
                hours = episodeDuration.replace(/^(\d+)h.*/,"$1") ;
                minutes = episodeDuration.replace(/^\d+h/,"") ;
            }
            else
            {
                hours = 0;
                if (episodeDuration.match(/^(\d+)min.*/)) {
                    minutes = episodeDuration.replace(/^(\d+)min.*/,"$1") ;
                }
                else
                {
                    minutes = 0;
                }
            }
            let totalDuration = ~~numberOfEpisodes * (~~hours * 60 + ~~minutes) ;
            let itemHours = Math.trunc(totalDuration / 60) ;
            let itemMinutes = totalDuration % 60 ;
            numberOfEpisodesSpan.parentNode.insertAdjacentHTML('beforeend', '<span class="infos_small"> (' + itemHours + ' h ' + itemMinutes.toString().padStart(2,"0") + ' min)</span>') ;
        }
    }

    function totalTimeCounter() {
        GM_addStyle('@media (min-width:1025px) {.total-time::before {content:"\\A"; white-space: pre;}}');
        let durationLabel = "Temps total : " ;
        let episodesLabel = "Épisodes à voir : " ;
        let counter = 0 ;
        let episodesCounter = 0 ;
        let durationNode ;
        let durationText ;
        let itemTotal = 0 ;
        let itemHours = 0 ;
        let itemMinutes = 0 ;
        let durationsNode = document.getElementsByClassName("t_progression") ;

        for (var i = 0 ; i < durationsNode.length; i++) {
            let numberOfEpisodes = 0 ;
            let hours = 0 ;
            let minutes = 0 ;
            if (durationsNode[i].checkVisibility()) {
                durationText = durationsNode[i].textContent;
                durationText = durationText.replace(/\s+/g, ''); // remove whitespaces

                // Number of episodes
                if (durationText.match(/^(\d+)x.*/)) {
                    numberOfEpisodes = durationText.replace(/^(\d+)x.*/,"$1");
                    durationText = durationText.replace(/^\d+x/,"");
                }
                else {
                    numberOfEpisodes = 1;
                }

                // hours & minutes
                if (durationText.match(/^(\d+)h.*/)) {
                    hours = durationText.replace(/^(\d+)h.*/,"$1") ;
                    minutes = durationText.replace(/^\d+h/,"") ;
                }
                else {
                    hours = 0;
                    if (durationText.match(/^(\d+)min.*/)) {
                        minutes = durationText.replace(/^(\d+)min.*/,"$1") ;
                    }
                    else {
                        minutes = 0;
                    }

                }
            }

            itemTotal = ~~numberOfEpisodes * (~~hours * 60 + ~~minutes) ;
            counter=counter+itemTotal ;

            if (numberOfEpisodes > 1){
                itemHours = Math.trunc(itemTotal / 60) ;
                itemMinutes = itemTotal % 60 ;
                let itemTotalText = '(' + itemHours + ' h ' + itemMinutes.toString().padStart(2,"0") + ' min)' ;
                let itemTotalDisplay = durationsNode[i].querySelector('[data-id="itemTotalDuration"]') ;
                if (itemTotalDisplay) {
                    itemTotalDisplay.innerHTML=itemTotalText;
                }
                else {
                    durationsNode[i].insertAdjacentHTML('beforeend', ' <span class="infos_small total-time" data-id="itemTotalDuration">' + itemTotalText + '</span>') ;
                }
            }

            episodesCounter = ~~episodesCounter + ~~numberOfEpisodes ;
        }

        let counterHours = Math.trunc(counter / 60);
        let counterMinutes = counter % 60 ;
        let totalDurationText = episodesLabel + "<strong>" + episodesCounter.toLocaleString() + "</strong>. " + durationLabel + "<strong>" + counterHours.toLocaleString() + " h " + counterMinutes.toString().padStart(2,"0") + " min</strong>";
        let totalDisplay = document.querySelector('[data-id="totalDuration"]');
        if (totalDisplay) {
            totalDisplay.innerHTML = totalDurationText ;
        }
        else {
            let statsStatut = document.getElementsByClassName("stats_statut") ;
            let counterDiv = document.createElement("div") ;
            counterDiv.setAttribute("class","stats_prix") ;
            counterDiv.dataset.id="totalDuration";
            counterDiv.innerHTML = totalDurationText ;
            statsStatut[0].parentNode.insertBefore(counterDiv,statsStatut[0]) ;
        }
    }
})();