Youtube Video Downloader | MP3,MP4

A basic youtube video downloader using y2mate, faster, a single click!

  1. // ==UserScript==
  2. // @name Youtube Video Downloader | MP3,MP4
  3. // @name:pt-BR Youtube Video Downloader | MP3,MP4
  4. // @name:es Youtube Video Downloader | MP3,MP4
  5. // @namespace http://tampermonkey.net/
  6. // @version 2022.08.12.1
  7. // @description A basic youtube video downloader using y2mate, faster, a single click!
  8. // @description:pt-BR Um downloader básico de vídeo do youtube usando y2mate, mais rápido, um único clique!
  9. // @description:es ¡Un descargador básico de videos de YouTube usando y2mate, más rápido, con un solo clic!
  10. // @author misteregis
  11. // @match *://www.youtube.com/*
  12. // @icon https://www.google.com/s2/favicons?domain=youtube.com
  13. // @grant none
  14. // @license MIT
  15. // ==/UserScript==
  16.  
  17. /* jshint esversion:6 */
  18.  
  19. (function () {
  20. 'use strict';
  21.  
  22. const downloadButton = document.createElement("div");
  23.  
  24. downloadButton.innerHTML = "<b>&#x2913;</b>";
  25. downloadButton.style.backgroundColor = "var(--yt-spec-brand-button-background)";
  26. downloadButton.style.borderRadius = "2px";
  27. downloadButton.style.position = "absolute";
  28. downloadButton.style.right = 0;
  29. downloadButton.style.color = "var(--yt-spec-static-brand-white)";
  30. downloadButton.style.padding = "6px 14px";
  31. downloadButton.style.marginTop = "10px";
  32. downloadButton.style.userSelect = "none";
  33. downloadButton.style.fontSize = "2rem";
  34. downloadButton.style.fontWeight = "var(--ytd-tab-system-font-weight)";
  35. downloadButton.style.letterSpacing = "var(--ytd-tab-system-letter-spacing)";
  36. downloadButton.style.textTransform = "var(--ytd-tab-system-text-transform)";
  37. downloadButton.style.cursor = "pointer";
  38. downloadButton.style.zIndex = 999;
  39.  
  40. const createButton = (target, callback) => {
  41. const btn = downloadButton.cloneNode(true);
  42. const content = document.createElement("div");
  43. const tooltip = document.createElement("tp-yt-paper-tooltip");
  44.  
  45. tooltip.setAttribute("offset", 4);
  46. tooltip.textContent = "Download Video";
  47.  
  48. content.style.position = "absolute";
  49. content.style.width = "200px";
  50. content.style.right = 0;
  51.  
  52. content.appendChild(btn);
  53. content.appendChild(tooltip);
  54. target.appendChild(content);
  55.  
  56. btn.onclick = () => callback();
  57. };
  58.  
  59. const waitForElement = (selector, callback) => {
  60. const element = document.querySelector(selector);
  61.  
  62. if (element) return callback(element);
  63.  
  64. return window.requestAnimationFrame(() => {
  65. waitForElement(selector, callback);
  66. });
  67. };
  68.  
  69. const dl = (url) => {
  70. const videoId = new URL(url || window.location).searchParams.get("v");
  71. const api = `https://saveanyvideo.com/#url=https://youtu.be/${videoId}`;
  72.  
  73. const win = window.open(api, "_blank");
  74. const video = document.querySelector("video");
  75.  
  76. video.pause();
  77.  
  78. const timer = setInterval(() => {
  79. if (win.closed) {
  80. clearInterval(timer);
  81. video.play();
  82. }
  83. }, 400);
  84. }
  85.  
  86. const selector = [
  87. "ytd-player#ytd-player:not([data-has-download-button])",
  88. "ytd-rich-grid-media a#thumbnail:not([data-has-download-button])",
  89. "ytd-rich-grid-slim-media a#thumbnail:not([data-has-download-button])",
  90. // "ytd-compact-video-renderer a#thumbnail:not([data-has-download-button])",
  91. ];
  92.  
  93. const addButtons = () => {
  94. document.querySelectorAll(selector).forEach((element) => {
  95. const localName = element.closest("ytd-rich-grid-slim-media")?.localName;
  96. const target = element.parentElement;
  97. let url = element.href;
  98.  
  99. if (localName === "ytd-rich-grid-slim-media") {
  100. url += `?v=${url.split("/").pop()}`;
  101. }
  102.  
  103. element.dataset.hasDownloadButton = true;
  104.  
  105. createButton(target, () => dl(url));
  106. });
  107. };
  108.  
  109. window.onload = () => {
  110. addButtons();
  111.  
  112. const elementNext = document.querySelector("ytd-watch-next-secondary-results-renderer");
  113. const elementBrowse = document.querySelector("ytd-browse");
  114. const element = elementBrowse ? elementBrowse : elementNext;
  115.  
  116. if (element) {
  117. let mutationTimeout = null;
  118.  
  119. element.addEventListener("DOMNodeInserted", (e) => {
  120. if (e.target.localName !== "ytd-rich-grid-row") return;
  121.  
  122. clearTimeout(mutationTimeout);
  123.  
  124. mutationTimeout = setTimeout(addButtons, 750);
  125. });
  126. }
  127. };
  128. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址