Greasy Fork

Greasy Fork is available in English.

YouTube™ Multi Downloader (Desktop & Mobile) v10.5 🌐🚀💯 — YT Shorts, Videos & Music | ZERO ADS! 🚫🔥

Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name YouTube™ Multi Downloader (Desktop & Mobile) v10.5 🌐🚀💯 — YT Shorts, Videos & Music | ZERO ADS! 🚫🔥
// @name:pt-BR YouTube™ Multi Downloader (PC & Celular) v10.5 🌐🚀💯 — YT Shorts, Vídeos & Music | ZERO ANÚNCIOS! 🚫🔥
// @description Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:pt-BR Adicione um botão de download flutuante para vídeos, curtas e músicas do YouTube de alta qualidade. Rápido, fácil de usar e melhor de todos!
// @description:ar Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:bg Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:cs Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:da Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:de Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:el Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:eo Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:es Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:fi Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:fr Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:fr-CA Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:he Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:hu Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:id Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:it Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:ja Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:ko Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:nb Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:nl Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:pl Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:ro Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:ru Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:sk Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:sr Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:sv Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:th Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:tr Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:uk Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:ug Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:vi Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:zh-CN Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @description:zh-TW Adds a floating download button for YouTube videos, shorts and music in high quality. Fast, easy to use and the best of all!
// @namespace http://greasyfork.icu/users/152924
// @homepageURL http://greasyfork.icu/scripts/34613
// @supportURL http://greasyfork.icu/scripts/34613/feedback
// @author Punisher
// @version 10.5
// @date 2026-01-08
// @icon https://iili.io/fOyuFFS.png
// @compatible chrome
// @compatible firefox
// @compatible opera
// @compatible safari
// @compatible edge
// @license CC-BY-NC-ND-4.0
// @match https://*.youtube.com/*
// @match https://music.youtube.com/*
// @grant GM_addStyle
// @run-at document-idle
// ==/UserScript==
 
(function () {
    "use strict";
 
    const punisherURL = "//evdfrance.fr/convert/?id=";
    const playerBtnID = "ytDownloadBtn";
    const floatBtnID = "ytPunisherBtn";
    const btnColor = "#575656";
    GM_addStyle(`
        #${playerBtnID} {
            background: ${btnColor};
            color: #fff;
            border: 1px solid rgba(255,255,255,0.2);
            margin-left: 8px;
            padding: 0 16px;
            border-radius: 18px;
            font: 500 14px Roboto,Noto,sans-serif;
            display: inline-flex;
            align-items: center;
            height: 36px;
            text-decoration: none;
        }
        #${floatBtnID} {
            background: ${btnColor} url("https://iili.io/fObpSDv.png") no-repeat center;
            background-size: 65%;
            position: fixed;
            top: 70%;
            right: 20px;
            transform: translateY(-50%);
            width: 60px;
            height: 60px;
            border-radius: 50%;
            border: none;
            cursor: grab;
            display: flex;
            justify-content: center;
            align-items: center;
            z-index: 9999;
            box-shadow: 0 6px 12px rgba(0,0,0,0.3);
        }
    `);
 
    const getVideoID = url => {
        const m = url.match(/(?:v=|\/)([0-9A-Za-z_-]{11})|\/shorts\/([0-9A-Za-z_-]{11})/);
        return m ? m[1] || m[2] : null;
    };
 
    const waitFor = selector =>
        new Promise(resolve => {
            const el = document.querySelector(selector);
            if (el) return resolve(el);
            const obs = new MutationObserver(() => {
                const e = document.querySelector(selector);
                if (e) {
                    obs.disconnect();
                    resolve(e);
                }
            });
            obs.observe(document.documentElement, { childList: true, subtree: true });
        });
 
    let lastVideoId = null;
    async function addPlayerButton() {
        const vid = getVideoID(location.href);
        if (!vid || vid === lastVideoId) return;
        lastVideoId = vid;
 
        const container = location.hostname.includes("music.youtube.com")
            ? await waitFor("ytmusic-player-bar")
            : await waitFor("ytd-video-primary-info-renderer #top-level-buttons-computed");
        if (!container) return;
 
        let btn = document.getElementById(playerBtnID);
        if (!btn) {
            btn = document.createElement("a");
            btn.id = playerBtnID;
            btn.target = "_blank";
            btn.textContent = "Download";
            container.appendChild(btn);
        }
        btn.href = punisherURL + vid;
    }
 
    function addFloatButton() {
        if (document.getElementById(floatBtnID)) return;
        const btn = document.createElement("button");
        btn.id = floatBtnID;
        btn.textContent = "";
        let dragging = false, ox = 0, oy = 0;
        const limit = (x, y) => ({
            x: Math.max(0, Math.min(x, innerWidth - btn.offsetWidth)),
            y: Math.max(0, Math.min(y, innerHeight - btn.offsetHeight))
        });
 
        const open = () => {
            const vid = getVideoID(location.href);
            if (vid) window.open(punisherURL + vid, "_blank");
        };
 
        const start = (x, y) => {
            dragging = true;
            const r = btn.getBoundingClientRect();
            ox = x - r.left;
            oy = y - r.top;
            btn.style.cursor = "grabbing";
        };
 
        const move = (x, y) => {
            if (!dragging) return;
            const p = limit(x - ox, y - oy);
            btn.style.left = p.x + "px";
            btn.style.top = p.y + "px";
            btn.style.right = btn.style.bottom = "auto";
        };
        const end = () => dragging = false;
 
        btn.addEventListener("mousedown", e => start(e.clientX, e.clientY));
        document.addEventListener("mousemove", e => move(e.clientX, e.clientY));
        document.addEventListener("mouseup", end);
 
        btn.addEventListener("touchstart", e => start(e.touches[0].clientX, e.touches[0].clientY), { passive: true });
        document.addEventListener("touchmove", e => move(e.touches[0].clientX, e.touches[0].clientY), { passive: true });
        document.addEventListener("touchend", end);
 
        btn.addEventListener("click", () => !dragging && open());
        document.body.appendChild(btn);
    }
 
    const update = () => {
        addPlayerButton();
        addFloatButton();
    };
 
    let lastURL = location.href;
    setInterval(() => {
        if (location.href !== lastURL) {
            lastURL = location.href;
            update();
        }
    }, 800);
    update();
})();