ygg Bouton Téléchargement

Ajoute un bouton téléchargement dans les résultats de recherche sur Ygg

// ==UserScript==
// @name         ygg Bouton Téléchargement
// @namespace    https://greasyfork.org/scripts/520362
// @version      1.0
// @description  Ajoute un bouton téléchargement dans les résultats de recherche sur Ygg
// @author       MASTERD
// @include      /^https?\:\/\/.*\.yggtorrent\..*\/.*$/
// @include      /^https?\:\/\/.*\.ygg\..*\/.*$/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=ygg.re
// @grant        none
// ==/UserScript==

// Fonction qui ajoute un bouton de téléchargement dans la table
function addDownloadButton(table) {
    // Sélectionner toutes les lignes du tbody de la table
    const rows = table.querySelectorAll('tbody tr');

    rows.forEach((row) => {
        // Vérifier si le bouton a déjà été ajouté
        if (row.querySelector('.download-btn')) {
            return; // Ne rien faire si le bouton existe déjà
        }

        // Trouver le lien de téléchargement dans la ligne
        const torrentLink = row.querySelector('td:nth-child(2) a'); // Trouver le lien dans la 2ème cellule de chaque ligne
        if (torrentLink) {
            // Extraire l'ID du torrent depuis l'URL du lien
            const torrentId = torrentLink.href.split("/").pop().split("-")[0]; // Ajustez la logique si nécessaire
            const downloadUrl = `/engine/download_torrent?id=${torrentId}`; // Utilisation de l'URL relative

            // Créer un bouton de téléchargement
            const downloadButton = document.createElement('button');
            downloadButton.classList.add('download-btn'); // Ajouter une classe pour la stylisation
            downloadButton.innerHTML = `<span class="ico_download"></span>`; // Ajouter l'icône du bouton

            downloadButton.style.width = '40px';
            downloadButton.style.padding = '5px';
            downloadButton.style.margin = '0px';
            downloadButton.style.display = 'table-cell';
            downloadButton.style.setProperty('width', '40px', 'important'); // Assurer que la largeur soit appliquée avec !important


            // Ajouter un événement au bouton pour rediriger vers l'URL de téléchargement
            downloadButton.addEventListener('click', () => {
                window.location.href = downloadUrl; // Rediriger vers l'URL du torrent
            });

            // Trouver l'indice de la colonne "Télécharger"
            const headerRow = table.querySelector('thead tr');
            const downloadColumnIndex = Array.from(headerRow.children).findIndex(th => th.innerHTML.includes('ico_download'));

            // Ajouter le bouton dans la cellule de la bonne colonne sous forme de <td>
            const cell = row.querySelectorAll('td')[downloadColumnIndex]; // Sélectionner la cellule de la colonne "Télécharger"
            if (cell) {
                // Créer une cellule <td> contenant le bouton de téléchargement
                const downloadCell = document.createElement('td');
                downloadCell.appendChild(downloadButton); // Ajouter le bouton dans cette cellule
                cell.parentNode.insertBefore(downloadCell, cell); // Insérer la nouvelle cellule avant la cellule cible
            }
        }
    });
}


// Fonction pour ajouter la colonne d'en-tête "Télécharger"
function addDownloadHeader(table) {
    const thead = table.querySelector('thead tr'); // Sélectionner la ligne de l'en-tête
    if (thead) {
        // Vérifier si la colonne "Télécharger" existe déjà
        if (thead.querySelector('th span.ico_download')) {
            return; // Ne rien faire si la colonne existe déjà
        }

        const nfoColumnIndex = Array.from(thead.children).findIndex(th => th.innerText === "NFO"); // Trouver l'indice de la colonne "NFO"

        if (nfoColumnIndex !== -1) {
            // Créer une nouvelle cellule <th> avec l'icône de téléchargement
            const newHeaderCell = document.createElement('th');
            newHeaderCell.classList.add('no'); // Ajouter la classe "no"
            newHeaderCell.style.width = '10px';
            newHeaderCell.innerHTML = `<span class="ico_download"></span>`; // Ajouter l'icône de téléchargement
            // Insérer la cellule à la position correcte
            thead.insertBefore(newHeaderCell, thead.children[nfoColumnIndex + 1]); // Insérer après la colonne "NFO"
        }
    }
}

// Fonction pour ajouter les boutons aux sections déjà présentes dans le DOM
function checkExistingSections() {
    // Sélectionner toutes les sections avec la classe "table-responsive results"
    const torrentSections = document.querySelectorAll('.table-responsive.results');
    torrentSections.forEach((torrentSection, i) => {
        // Trouver la table dans la section
        const table = torrentSection.querySelector('.table');
        if (table) {
            addDownloadHeader(table); // Ajouter la colonne "Télécharger"
            addDownloadButton(table); // Ajouter les boutons de téléchargement
        }
    });
}

// Observer les changements dans les images loader-id
function observeImages() {

    const observer = new MutationObserver(() => {
        // Sélectionner toutes les images avec l'attribut loader-id
        const allImages = document.querySelectorAll('img[loader-id]');
        // Vérifier si toutes les images ont le style display: none
        const allLoaded = Array.from(allImages).every(img => img.style.display === 'none');
        // Si toutes les images sont chargées (display: none), procéder à l'ajout des boutons et des en-têtes
        if (allLoaded) {
            checkExistingSections(); // Ajouter les boutons et en-têtes
            //observer.disconnect();
        }
    });

    // Vérifier si l'URL actuelle correspond à l'une des pages cibles
    const currentPath = window.location.pathname;
    if (currentPath === "/engine/mostseeded" || currentPath === "/engine/mostcompleted") {
        // Observer l'ajout de la table si elle n'existe pas encore
        const bodyObserver = new MutationObserver(() => {
            const table = document.querySelector('#DataTables_Table_0');
            if (table) {
                checkExistingSections();
                bodyObserver.disconnect(); // Arrêter l'observation du corps une fois la table trouvée
            }
        });

        // Démarrer l'observation du corps du document pour détecter la table
        bodyObserver.observe(document.body, { childList: true, subtree: true });
    } else {
        const allImages = document.querySelectorAll('img[loader-id]');
        // Si aucune image n'est trouvée au chargement initial, appeler checkExistingSections()
        if (allImages.length === 0) {
            checkExistingSections(); // Appel direct de la fonction si aucune image n'est trouvée
            return; // Sortie de la fonction
        } else {
            // Observer les ajouts d'images, ainsi que les changements dans le DOM
            observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style'] });
        }
    }
}
// Observer au chargement initial des images
observeImages();