MS Downloader

Ajoute un bouton de téléchargement sous les vidéos et images sur YouTube, Instagram, Twitter et TikTok

目前為 2025-01-31 提交的版本,檢視 最新版本

// ==UserScript==
// @name         MS Downloader
// @namespace    https://greasyfork.org/users/1429467
// @version      1.0
// @description  Ajoute un bouton de téléchargement sous les vidéos et images sur YouTube, Instagram, Twitter et TikTok
// @author       Lakfu Sama
// @match        *://*.youtube.com/*
// @match        *://*.instagram.com/*
// @match        *://*.twitter.com/*
// @match        *://*.tiktok.com/*
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let autoShowButtons = true; // Par défaut, les boutons DL sont visibles

    // Fonction pour créer un bouton de téléchargement
    function createDownloadButton(url) {
        let button = document.createElement("button");
        button.innerText = "DL";
        button.style.position = "absolute";
        button.style.top = "5px";
        button.style.right = "5px";
        button.style.backgroundColor = "rgba(0, 0, 0, 0.7)";
        button.style.color = "white";
        button.style.border = "none";
        button.style.padding = "5px 10px";
        button.style.borderRadius = "5px";
        button.style.cursor = "pointer";
        button.style.fontSize = "12px";
        button.style.zIndex = "1000";
        button.style.opacity = "0.8";
        button.style.transition = "opacity 0.2s";
        button.style.display = autoShowButtons ? "block" : "none";

        // Effet de survol pour rendre le bouton plus visible
        button.onmouseover = () => button.style.opacity = "1";
        button.onmouseout = () => button.style.opacity = "0.8";

        // Action du bouton pour télécharger la vidéo
        button.onclick = () => {
            if (url.startsWith("blob:")) {
                alert("Le téléchargement de vidéos blob n'est pas supporté directement. Utilisez un outil de téléchargement adapté.");
            } else {
                let a = document.createElement("a");
                a.href = url;
                a.download = "video.mp4"; // Nom générique pour le fichier
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
            }
        };

        return button;
    }

    // Fonction pour ajouter le bouton de téléchargement uniquement pour les vidéos valides
    function addDownloadButtons() {
        console.log("Recherche de vidéos...");

        // Vérification des vidéos dans les balises <video>
        document.querySelectorAll("video").forEach(video => {
            if (!video.dataset.hasDownloadButton && video.src) {
                // Affiche une vidéo valide dans la console pour le debug
                console.log("Vidéo trouvée: ", video.src);

                // Vérifie si la vidéo a une source MP4 ou WebM
                if (video.src.includes(".mp4") || video.src.includes(".webm")) {
                    let button = createDownloadButton(video.src);
                    video.style.position = "relative";
                    video.parentNode.appendChild(button);
                    video.dataset.hasDownloadButton = "true";
                }
            }
        });

        // Vérification des vidéos dans les tweets Twitter (balises <div> avec des liens de vidéo)
        document.querySelectorAll("div[data-testid='tweet']").forEach(tweet => {
            const video = tweet.querySelector("video"); // Cherche la vidéo dans le tweet
            if (video && !video.dataset.hasDownloadButton && video.src) {
                console.log("Vidéo Twitter trouvée: ", video.src);
                let button = createDownloadButton(video.src);
                video.style.position = "relative";
                video.parentNode.appendChild(button);
                video.dataset.hasDownloadButton = "true";
            }
        });

        // Vérification des vidéos intégrées dans les <iframe> (ex. YouTube)
        document.querySelectorAll("iframe").forEach(iframe => {
            if (!iframe.dataset.hasDownloadButton && iframe.src && iframe.src !== "about:blank") {
                // Affiche les iframes pour le debug
                console.log("Iframe trouvée: ", iframe.src);

                // Vérifie si l'iframe contient une vidéo YouTube
                if (iframe.src.includes("youtube.com/embed/")) {
                    let videoUrl = iframe.src.replace("https://www.youtube.com/embed/", "https://www.youtube.com/watch?v=");
                    let button = createDownloadButton(videoUrl);
                    iframe.style.position = "relative";
                    iframe.parentNode.appendChild(button);
                    iframe.dataset.hasDownloadButton = "true";
                }
            }
        });
    }

    // Observer pour les vidéos chargées dynamiquement (scroll infini)
    const observer = new MutationObserver(addDownloadButtons);
    observer.observe(document.body, { childList: true, subtree: true });

    // Touche "D" pour afficher/cacher les boutons DL
    document.addEventListener('keydown', function(event) {
        if (event.key.toLowerCase() === 'd') {
            autoShowButtons = !autoShowButtons;
            document.querySelectorAll("button").forEach(button => {
                if (button.innerText === "DL") {
                    button.style.display = autoShowButtons ? "block" : "none";
                }
            });
        }
    });

    console.log("Script DL activé :\n[D] Afficher/Cacher les boutons de téléchargement");
})();