🏠 

Greasy Fork is available in English.

Youtube Downloader

This extension add a download tab button on any Youtube page and allows you to download MP3 & Video with just one click (4K Ultra High Definition Supported).


安装此脚本?
  1. // ==UserScript==
  2. // @name Youtube Downloader
  3. // @description This extension add a download tab button on any Youtube page and allows you to download MP3 & Video with just one click (4K Ultra High Definition Supported).
  4. // @icon https://www.vevioz.com/images/icon.png
  5. //
  6. // @author Community.vevioz.com
  7. // @namespace https://community.vevioz.com
  8. //
  9. // @license GPLv3 - https://www.gnu.org/licenses/gpl-3.0.txt
  10. // @copyright Copyright (C) 2020, by Community.vevioz.com
  11. // @include https://www.youtube.com/*
  12. // @include https://www.youtube.com/*
  13. //
  14. // @version 2.7
  15. //
  16. // @run-at document-end
  17. // @unwrap
  18. // ==/UserScript==
  19. dwld_btn_onclick = function (){
  20. var path ='https://addons.vevioz.com/?id='+encodeURIComponent(getYT(window.location));
  21. window.open(path,'_blank');
  22. };
  23. getYT = function(url){
  24. var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
  25. var match = String(url).match(regExp);
  26. return (match&&match[7].length==11)? match[7] : false;
  27. };
  28. getSpan = function(text, className) {
  29. var _tn = document.createTextNode(text);
  30. var span = document.createElement("span");
  31. span.className = className;
  32. span.appendChild(_tn);
  33. return span;
  34. };
  35. var myAppInterface = {
  36. init:function(){
  37. this.insertGlobalCSS();
  38. },
  39. addGlobalStyle: function(doc, css) {
  40. if(document.querySelector('.easy-youtube-mp3-css'))return;
  41. var head = doc.getElementsByTagName('head')[0];
  42. if (!head) {return; }
  43. var style = doc.createElement('style');
  44. style.id = 'easy-youtube-mp3-css';
  45. style.type = 'text/css';
  46. if (style.styleSheet) {
  47. style.styleSheet.cssText = css;
  48. } else {
  49. style.appendChild(document.createTextNode(css));
  50. }
  51. head.appendChild(style);
  52. },
  53. insertGlobalCSS: function(){
  54. var css = function (){
  55. /*start
  56. #downloadyoutubemp3.ytd-watch{padding-top:10px;overflow: auto;padding-bottom: 10px;}
  57. #downloadyoutubemp3 .dwld_btn{background-color: #f16310;border: #f16310;border-radius: 2px;color: #FFF;padding: 10px 16px; font-size: 1.4em;cursor:pointer;display:inline-block}
  58. #downloadyoutubemp3 .dwld_btn:hover{background-color: #f16310}
  59. @media (min-width: 657px){ytd-watch[theater] #downloadyoutubemp3.ytd-watch{margin-right:24px}}
  60. end*/
  61. }.toString().replace("/*start",'').replace("end*/",'').slice(14,-1);
  62. this.addGlobalStyle(document, css);
  63. },
  64. };
  65. createButton = function() {
  66. var obj = document.querySelector('#sponsor-button');
  67. if(obj !== null){
  68. // check if the button has already been created
  69. var btnRow = document.getElementById('downloadyoutubemp3');
  70. if(btnRow === null){
  71. myAppInterface.init();
  72. var downloadyoutubemp3 = document.createElement("div");
  73. downloadyoutubemp3.id = "downloadyoutubemp3";
  74. downloadyoutubemp3.className = "style-scope ytd-watch";
  75. var dwld_btn = document.createElement("div");
  76. dwld_btn.className = "style-scope dwld_btn";
  77. dwld_btn.appendChild(getSpan("DOWNLOAD MP3"));
  78. dwld_btn.onclick = dwld_btn_onclick;
  79. obj.parentNode.insertBefore(downloadyoutubemp3, obj);
  80. downloadyoutubemp3.appendChild(dwld_btn);
  81. }
  82. }
  83. };
  84. // yt does make use of some bogus AJAX functionality which breaks pagemod
  85. // we have to check in intervals if the document has been replaced by yt to
  86. // recreate the button if needed.
  87. var intervalCheck = setInterval(function(){ createButton();}, 250);