本地 YouTube 下載器

無需第三方服務即可下載 YouTube 視頻等。

目前為 2023-04-07 提交的版本,檢視 最新版本

// ==UserScript== dislikes, auto repeat vid
// @name         Youtube Tools All in one local download mp3 mp4 HIGT QUALITY return dislikes and more
// @name:zh-TW   本地 YouTube 下載器
// @name:zh-HK   本地 YouTube 下載器
// @name:zh-CN   本地 YouTube 下载器
// @name:ja      ローカル YouTube ダウンローダー
// @name:kr      로컬 YouTube 다운로더
// @name:ar      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:bg      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:cs      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:da      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:de      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:el      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:eo      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:es      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:fi      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:fr      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:fr-CA   Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:he      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:hu      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:id      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:it      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:ko      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:nb      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:nl      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:pl      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:pt-BR   Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:ro      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:ru      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:sk      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:sr      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:sv      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:th      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:tr      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:uk      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:ug      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @name:vi      Youtube Tools All in one local Download MP4, MP3 HIGT QUALITY without external service and more.
// @description         Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:ar      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:bg      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:da      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:de      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:el      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:eo      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:fi      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:fr-CA   Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:he      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:hu      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:id      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:it      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:ko      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:nb      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:nl      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:pl      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:pt-BR   Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:ro      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:ru      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:sk      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:sr      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:sv      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:th      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:tr      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:uk      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:ug      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:vi      Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @homepage     https://github.com/DeveloperMDCM/
// @version      1.6
// @description        Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @description:zh-TW  無需第三方服務即可下載 YouTube 視頻等。
// @description:zh-HK  無需第三方服務即可下載 YouTube 視頻等
// @description:zh-CN  无需通过第三方服务等即可下载 YouTube 视频
// @description:ja     外部サービスなどを使わずに YouTube 動画をダウンロード
// @description:kr     외부 서비스 등 없이 YouTube 동영상 다운로드
// @description:fr     Obtenez un lien brut de YouTube sans service externe. et de plus
// @description:cs     Stahujte videa z YouTube bez externích služeb. a více
// @description:en     Download MP4, MP3 HIGT QUALITY without external services. and more
// @description:es     Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY without external service auto repeat video, skip ads, return dislikes and more
// @author       MDCM
// @match        https://*.youtube.com/*
// @exclude      *://music.youtube.com/*
// @exclude      *://*.music.youtube.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant        GM_info
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        unsafeWindow
// @run-at       document-end
// @compatible chrome
// @compatible firefox
// @compatible opera
// @compatible safari
// @compatible edge
// @license MIT
// @namespace https://github.com/DeveloperMDCM/
// ==/UserScript==

(function () {
  // Youtube tools by: DeveloperMDCM
  // https://github.com/DeveloperMDCM/Youtube-tools-extension

  "use strict";

  function paramsVideoURL() {
    const parametrosURL = new URLSearchParams(window.location.search); // Url parametros
    return parametrosURL.get("v");
  }

  function cargarScript() {
    console.log("Scrip en ejecución by: DeveloperMDCM  MDCM");
    

   // alert('Script by: DeveloperMDCM', cat)
    let ad = true;
    // Menu Buttons
    const menuBotones = `
            <meta http-equiv="Expires" content="0">
            <meta http-equiv="Last-Modified" content="0">
            <meta http-equiv="Cache-Control" content="no-cache, mustrevalidate">
            <meta http-equiv="Pragma" content="no-cache">
            <style>
            .mdcm:hover {
              cursor: pointer;
            }
            .mdcm{
              font-size: 10px;
            }
            #subscribe-button > ytd-subscribe-button-renderer > yt-button-shape > button:hover {
            zoom: 0.9;
            }
            .containerButtons {
              position: relative;
              display: flex;
              justify-content: center;
              flex-wrap: wrap;
              user-select: none;
            }
            .containerButtons button , input {
              display: flex;
              flex-direction: column-reverse;
              margin: 0 4px;
              align-items: center;
              cursor: pointer;
              border-radius: 10px;
            }
            .containerButtons h1, h2 {
              user-select: none;
            }
            #MDCM {
              animation: mdcm 10s infinite alternate;
              position: relative;
              transition: 4s;
            }
           
            .containerButtons button .containerButtons button svg {
              width: 50px;
              height: 40px;
            }
            #color, #eyes {
              opacity:0;position:absolute;height: 93%;bottom: 0; top: 2px; width: 62px;
            }
                      /* width */
          ::-webkit-scrollbar {
            width: 4px;
            height: 10px;
          }

          /* Track */
          ::-webkit-scrollbar-track {
            background: ##d5d5d5; 
            
          }
          
          /* Handle */
          ::-webkit-scrollbar-thumb {
            background: #000; 

          }

            .containerall {
              width: 100%;
              display: flex;
              align-items: center;
              justify-content: center;
            }
            .container .botoncalidades {
              margin: 3px 2px;
              width: 24.6%;
            }
            .botoncalidades:first-child {
              background-color: #0af;
            }
            .botoncalidades:last-child {
              background-color: red;
              width: 100px;
            }
            .selectcalidades , .botoncalidades, .selectcalidadesaudio{
              width: 50%;
              height: 27.8px;
              background-color: #fff;
              color: #000;
              font-size: 25px;
              text-align: center;
              border: none;
              font-size: 20px;
              margin: 2px 2px;
            }
            .botoncalidades {
              width: 70px;
              height: 30px;
              background-color: rgb(4, 156, 22);
              border: 0px solid #000;
              color: #fff;
              font-size: 20px;
              border-radius: 10px;
              margin: 2px 2px;
            }
            .botoncalidades:hover, .bntcontainer:hover {
              cursor: pointer;
            }
            .ocultarframe, .ocultarframeaudio {
              display: none;
            }
            .progress-button:hover {
              background-color: #000;
            }

            .progress-button {
                display: inline-block;
                font-size: 1em;
                color: #fff ;
                text-decoration: none;
                line-height: 1;
                overflow: hidden;
                position: relative;
                text-align: center;
                width: 100%;
                height: 100%;
                box-shadow: 0 1px 1px #ccc;
                border-radius: 2px;
                cursor: pointer;
                background-color: #000;
            }

            #downloadButton:hover .progress-button {
                filter: brightness(95%);
            }

            .progress-button.in-progress,
            .progress-button.finished {
                color: red !;
            }

            .progress-button.in-progress:after,
            .progress-button.finished:after {
                position: absolute;
                z-index: 2;
                width: 100%;
                height: 100%;
                text-align: center;
                top: 0;
                padding-top: inherit;
                color: #fff !;
                left: 0;
            }

            .progress-button.in-progress:after {
                content: attr(data-loading);
            }

            .progress-button.finished:after {
                content: attr(data-finished);
            }

            .progress-button .tz-bar {
                background-color: #f00;
                height: 3px;
                bottom: 0;
                left: 0;
                width: 0;
                position: absolute;
                z-index: 1;
                border-radius: 0 0 2px 2px;
                -webkit-transition: width 0.5s, height 0.5s;
                -moz-transition: width 0.5s, height 0.5s;
                transition: width 0.5s, height 0.5s;
            }

            .progress-button .tz-bar.background-horizontal {
                height: 100%;
                border-radius: 2px;
            }

            .progress-button .tz-bar.background-vertical {
                height: 0;
                top: 0;
                width: 100%;
                border-radius: 2px;
            }

            .buttonTitle {
                font-size: 0.5em;
                margin-top: 4px;
            }

            #containerbutton {
                height: 100px;
                text-align: center;
            }

            #containerbutton:before {
                content: '';
                display: inline-block;
                vertical-align: middle;
                height: 100%;

            }


            #percentageText {
                width: 95%;
                display: inline-block;
                position: relative;
                vertical-align: middle;
                z-index: 3;
            }

            .headerbutton {
                position: fixed;
                top: 0;
                z-index: 1;
                width: 100%;
                background-color: #f1f1f1;
            }

            .progress-containerbutton {
                width: 99%;
                height: 20px;
                background: #3e3e3c;
            }

            .progress-bar {
                height: 20px;
                background: #f00;
                width: 0%;
            }

            .grecaptcha-badge {
                visibility: hidden;
            }
            </style>
            <body>

            <div class="container">
            <form>
            <div class="containerButtons">
              <div style="position:relative; display:inline-block ">
              
              <button type="button" class="btn btn-secondary"><img width="35" src="https://cdn-icons-png.flaticon.com/512/674/674468.png"><input id="color"  list="presetColors1" type="color" value="#ffffff" ></button></div>
               <datalist id="presetColors1">
              <option value="#ff00aa"/>
              <option value="#fbff00"/>
              <option value="#ff0000"/>
              <option value="#00ff00"/>
              <option value="#0000ff"/>
              </datalist>
              <button type="button"  id="imagen"> <img width="35" src="https://cdn-icons-png.flaticon.com/512/3342/3342119.png"></button>
              <button type="button"  id="invertir"> <img width="35" src="https://cdn-icons-png.flaticon.com/512/556/556716.png"></button>
              <button type="button"  id="fondo"> <img width="35" src="https://cdn-icons-png.flaticon.com/512/4789/4789442.png"></button>
              <button type="button"  id="reset"> <img width="35" src="https://cdn-icons-png.flaticon.com/512/5632/5632370.png"></button>

              <div style="position:relative; display:inline-block ">
              <button type="button"><img width="35" src="https://cdn-icons-png.flaticon.com/512/5946/5946143.png"><input id="eyes" list="presetColors" type="color" value="#ffffff" ></button>
              <datalist id="presetColors">
              <option value="#000000"/>
              <option value="#fbff00"/>
              <option value="#ff0000"/>
              <option value="#00ff00"/>
              <option value="#0000ff"/>
              </datalist>
              </div>
              <button type="button"  id="repeatvideo"> <img class="imarepeat" width="35" src="https://cdn-icons-png.flaticon.com/512/3447/3447562.png"></button>
              <button type="button"  class="btn1"> <img width="35" src="https://cdn-icons-png.flaticon.com/512/5063/5063695.png"></button>
              <button type="button"  class="btn2"> <img width="35" src="https://cdn-icons-png.flaticon.com/512/2284/2284806.png"></button>
              <button type="button"  class="btn3"> <img width="35" src="https://cdn-icons-png.flaticon.com/512/1828/1828527.png"></button>
              </div>
              <div>
              </div>
            </form>
            <div id="ojosprotect" style="position: fixed; pointer-events: none; width: 100%; height: 100%; left: 0px; top: 0px; opacity: 0.2; z-index: 10; display: block;"></div>
            </div>

            <form class="formulariodescarga" action="">
            <div class="containerall">
            <select class="selectcalidades  ocultarframe" required>
              <option selected disabled>Calidad del video / Quality video</option>
              <option value="360">360p Mp4</option>
              <option value="480">480p Mp4</option>
              <option value="720">720p HD Mp4 Default</option>
              <option value="1080">1080p FULL HD Mp4</option>
              <option value="4k">2160p 4K WEBM</option>
              <option value="8k">4320p 8K WEBM</option>
              </select>
              <iframe id="descargando"  style="z-index: 99; border: none; height: 27.4px; width: 50%;"  class="containerall ocultarframe" src="" frameborder="0"></iframe>
            </div>
            </form>
            <form class="formulariodescargaaudio" action="">
            <div class="containerall">
            <select class="selectcalidadesaudio ocultarframeaudio" required>
              <option selected disabled>Calidad del Audio / Quality Audio</option>
              <option value="flac">Audio FLAC UHQ</option>
              <option value="wav">Audio WAV UHQ</option>
              <option value="mp3">Audio MP3 Default</option>
              <option value="m4a">Audio M4A</option>
              <option value="aac">Audio AAC</option>
              <option value="opus">Audio OPUS</option>
              <option value="ogg">Audio OGG</option>
              </select>
              <iframe id="descargandomp3"  style="z-index: 99; border: none; height: 27.4px; width: 50%;"  class="containerall ocultarframeaudio" src="" frameborder="0"></iframe>
            </div>
            </form>
            </a>
            <center>
            </center>
            </body>
            `;




    const addDislike = document.createElement("P"); // Texto count dislikes
    let validoBotones = true;
    // TODO: Inicia y inserta los botones
    setInterval(() => {
      // se repite  1 vez
      const addButton = document.querySelector(".style-scope .ytd-watch-metadata");
      if (addButton != undefined && validoBotones) {
          validoBotones = false;
          addButton.insertAdjacentHTML("beforebegin", menuBotones);
          // document.querySelector("video").style.borderRadius = "30px";
          // Formulario de botones para descargar
          const formulariodescarga = document.querySelector(".formulariodescarga");
          const formulariodescargaaudio = document.querySelector(".formulariodescargaaudio");
          const framedescarga = document.querySelector("#descargando");
          const framedescargamp3 = document.querySelector("#descargandomp3");
          formulariodescarga.addEventListener('click', e=> {
            e.preventDefault();
          });
          formulariodescargaaudio.addEventListener('click', e=> {
            e.preventDefault();
          });
          const btn1mp4 = document.querySelector(".btn1");
          const btn2mp3 = document.querySelector(".btn2");
          const btn3cancel = document.querySelector(".btn3");
          const selectcalidades = document.querySelector(".selectcalidades");
          const selectcalidadesaudio = document.querySelector(".selectcalidadesaudio");

          selectcalidades.addEventListener("change", (e) => {
            framedescarga.src = `https://loader.to/api/button/?url=${window.location.href}&f=${e.target.value}&color=0af`;
            framedescarga.classList.remove("ocultarframe");
          });

          selectcalidadesaudio.addEventListener("change", (e) => {
            framedescargamp3.src = `https://loader.to/api/button/?url=${window.location.href}&f=${e.target.value}&color=049c16`;
            // console.log(e.target.value)
            framedescargamp3.classList.remove("ocultarframeaudio");
          });

          btn3cancel.onclick = () => {
            formulariodescarga.style.display = "none";
            formulariodescargaaudio.style.display = "none";
          

          }

          btn1mp4.onclick = () => {
            selectcalidades.classList.remove("ocultarframe");
            framedescarga.classList.add("ocultarframe");
            formulariodescarga.classList.remove("ocultarframe");
            formulariodescarga.style.display = ""
            selectcalidadesaudio.classList.add("ocultarframeaudio");
            formulariodescargaaudio.classList.add("ocultarframe");
            formulariodescarga.reset();

          };
          btn2mp3.onclick = () => {
            formulariodescargaaudio.classList.remove("ocultarframe");
            formulariodescarga.classList.add("ocultarframe");
            framedescargamp3.classList.remove("ocultarframeaudio");
            formulariodescargaaudio.style.display = ""
            selectcalidadesaudio.classList.remove("ocultarframeaudio");
            framedescargamp3.classList.add("ocultarframeaudio")
            formulariodescargaaudio.reset();

          };

          const reverse = document.querySelector("#columns"); // Invertir contenido
          const btnReset = document.querySelector("#reset"); // Reset button
          const InputColor = document.querySelector("#color"); // Input color
          const btnImagen = document.querySelector("#imagen"); // Download image video
          const formularioButtons = document.querySelector("#eyes"); // Filtro de pantalla
          const btnFondo = document.querySelector("#fondo"); // Fondo cinematica completa
          const invertirVista = document.querySelector("#invertir"); // Intercambiar vista

          const buttonsVideo = document.querySelector(
            "#top-row.ytd-watch-metadata"
          ); // Botones para video

          reverse.style.flexDirection = "row";
          buttonsVideo.style = "display: flex;flex-direction: column;justify-content: center;align-items: center ;";
          document.querySelector("#title > h1").style = "text-align: center; color: red;";
          document.querySelector("#owner").style.justifyContent = "center";
          //document.querySelector("#search-icon-legacy.ytd-searchbox").style.backgroundColor = "gray";


          let countViewRow = 0; // Count
          invertirVista.onclick = () => {
            countViewRow += 1;
            switch (countViewRow) {
              case 1:
                reverse.style.flexDirection = "row-reverse";
                break;
              case 2:
                reverse.style.flexDirection = "row";
                countViewRow = 0;
                break;
            }
          };

                // Color text page in localstorage refresh page
                   const colorTextPageValidate = localStorage.getItem('colorTextPage');
                //   console.log('validando nuevo color', colorTextPageValidate)
                if(colorTextPageValidate !== null) {
                  document.body.style.setProperty("--yt-spec-text-primary", colorTextPageValidate);
                    //document.body.style.setProperty("--yt-spec-text-secondary", "#ffffff");
                    document.body.style.setProperty("--yt-spec-static-overlay-background-brand", "red");
                    document.body.style.setProperty("--yt-spec-static-brand-red", colorTextPageValidate);
                    //document.body.style.setProperty("--yt-spec-static-brand-white", colorTextPageValidate);
                    document.body.style.setProperty("--ytd-searchbox-legacy-border-color", colorTextPageValidate);
                    document.body.style.setProperty("--ytd-searchbox-legacy-border-shadow-color", colorTextPageValidate);
                    document.querySelector("#logo-icon").style.color = colorTextPageValidate;
                    document.querySelector("#subscribe-button > ytd-subscribe-button-renderer > yt-button-shape > button").style = "color: black; background-color: white; border: 2px solid black; ";
                }



            // valido modo oscuro y venta de video
            // Repeat video button
                let countRepeat = 0; // count
                const repeat = document.querySelector("#repeatvideo"); // Repeat button
                const imarepeat = document.querySelector(".imarepeat"); // img repeat
                const videoFull = document.querySelector("#movie_player > div.html5-video-container > video")
                repeat.onclick = () => {
                  if(document.querySelector("#cinematics > div") != undefined || videoFull != undefined){
                  countRepeat += 1;
                  setInterval(() => {
                    const videoRepeat = document.querySelector("video"); // vIDEO PLAYER
                    let aux = videoRepeat.duration - 2;
                    const buttonLeft = document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > a.ytp-prev-button.ytp-button");
                    switch (countRepeat) {
                      case 1:
                        if (videoRepeat.duration) {
                          if (videoRepeat.currentTime >= aux) {
                            videoRepeat.currentTime = 0;
                            buttonLeft.click();
                          }
                          imarepeat.src = "https://cdn-icons-png.flaticon.com/512/3447/3447552.png"; // img repeat
                        }
                        break;
                      case 2:
                        countRepeat = 0;
                        imarepeat.src = "https://cdn-icons-png.flaticon.com/512/3447/3447562.png";
                        break;
                    }
                  }, 1000);
                }else {
                  mostrarAlerta('Active Dark Theme in Youtube page')
                }
                };
              // Background transparent
              btnFondo.onclick = function () {

                if(document.querySelector("#cinematics > div") != undefined && videoFull != undefined){
                document.querySelector("#cinematics > div").style = "position: fixed; inset: 0px; pointer-events: none; transform: scale(1.5, 2)";
                document.querySelector("#cinematics > div > canvas:nth-child(1)").style = "position: absolute; width: 100%; height: 100vh;";
                document.querySelector("#cinematics > div > canvas:nth-child(2)").style = "position: absolute; width: 100vw; height: 100%; opacity: 0.2;";
                document.querySelector("html[dark] [dark]").style.backgroundColor = "transparent";
                document.body.style.setProperty("--yt-spec-general-background-a", "transparent");
                document.querySelector("ytd-playlist-panel-renderer[modern-panels]:not([within-miniplayer]) #container.ytd-playlist-panel-renderer").style = "border: 3px solid red; background-color: #352e2e29";
              }else if(document.querySelector("#cinematics > div") === null) {
                alert('NOT support live video And Theme Light')
              }

              else {
                mostrarAlerta('Active Dark Theme in Youtube page')
              }
              };
                
            btnReset.addEventListener('click', function () {
                localStorage.clear();
              if(document.querySelector("#cinematics > div") != undefined){
                
                  document.body.style.setProperty("--yt-spec-text-primary","#ffffff");
                  // document.body.style.setProperty('--yt-spec-text-secondary', '#ffffff');
                  document.body.style.setProperty("--yt-spec-static-overlay-background-brand", "#ffffff");
                  document.body.style.setProperty("--yt-spec-static-overlay-background-brand", "red");
                document.querySelector("#cinematics > div").style = "position: relative; inset: 0px; pointer-events: none; background: transparent";
                document.body.style.setProperty("--yt-spec-static-brand-red", "#ff0000");
                document.body.style.setProperty("--yt-spec-static-brand-white", "gray");
                document.querySelector("#ojosprotect").style.backgroundColor = "transparent";
                // document.body.style.setProperty("--ytd-searchbox-legacy-border-color", "#ffffff");
                document.querySelector("#logo-icon").style.color = "#ffffff";
                document.body.style.setProperty("--yt-spec-general-background-a", "#000000");
                document.querySelector("html[dark] [dark]").style.backgroundColor = "#000000";
                document.querySelector("ytd-playlist-panel-renderer[modern-panels]:not([within-miniplayer]) #container.ytd-playlist-panel-renderer").style = "";
              

            }else if(document.querySelector("#cinematics > div") === null) {
                document.body.style.setProperty("--yt-spec-text-primary","#000");
                document.body.style.setProperty("--yt-spec-static-brand-red", "#ff0000");
                document.body.style.setProperty("--yt-spec-static-brand-white", "#fff");
                document.querySelector("#ojosprotect").style.backgroundColor = "transparent";
                document.querySelector("#logo-icon").style.color = "#000";
                document.querySelector("ytd-playlist-panel-renderer[modern-panels]:not([within-miniplayer]) #container.ytd-playlist-panel-renderer").style = "";
              }

            else {
              mostrarAlerta('Active Dark Theme in Youtube page')
            }
            })
            reverse.style.flexDirection = "row";

            btnImagen.onclick = () => {
              if(document.querySelector("#cinematics > div") != undefined || videoFull != undefined){
              const parametrosURL = new URLSearchParams(window.location.search); // Url parametros
              let enlace;
              enlace = parametrosURL.get("v");
              window.open(
                `https://i.ytimg.com/vi/${enlace}/maxresdefault.jpg`,
                "popUpWindow",
                "height=500,width=400,left=100,top=100,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no, status=yes"
              );
            }else {
              mostrarAlerta('Active Dark Theme in Youtube page')
            }
            };
            // Input color
            InputColor.addEventListener("input", function () {
              localStorage.setItem('colorTextPage', InputColor.value);
              const colorTextPage = localStorage.getItem('colorTextPage');
            //   console.log(colorTextPage);
              if(document.querySelector("#cinematics > div") != undefined || videoFull != undefined){
                document.body.style.setProperty("--yt-spec-text-primary", colorTextPage);
                //document.body.style.setProperty("--yt-spec-text-secondary", "#ffffff");
                document.body.style.setProperty("--yt-spec-static-overlay-background-brand", "red");
                document.body.style.setProperty("--yt-spec-static-brand-red", colorTextPage);
                //document.body.style.setProperty("--yt-spec-static-brand-white", colorTextPage);
                document.querySelector("#logo-icon").style.color = colorTextPage;
                document.querySelector("#subscribe-button > ytd-subscribe-button-renderer > yt-button-shape > button").style = "color: black; background-color: white; border: 2px solid black; ";

            }else {
              mostrarAlerta('Active Dark Theme in Youtube page')
            }
         
              });

                    // Filtro de pantalla
          formularioButtons.addEventListener("input", function () {
            if(document.querySelector("#cinematics > div") != undefined || videoFull != undefined){
            document.querySelector("#ojosprotect").style.backgroundColor =
              formularioButtons.value;
            }else {
              mostrarAlerta('Active Dark Theme in Youtube page')
            }
          });

        }

        //

    }, 1000); // Termina setIterval


    // Función para link github project
    const existeFormButton = document.querySelector("#below > ytd-watch-metadata > div.container > form");

    function MDCM() {
      if (!existeFormButton) {
        const mdcm = document.querySelector("#MDCM");
        const sms = document.querySelector("#below > ytd-watch-metadata");
        if (!mdcm) {
          if (sms != undefined) {
            const mdcm = document.createElement("P");
            mdcm.innerHTML = '<a id="MDCM" target="_blank" style="margin: 10px 0; font-size: 14px; color: #24ff; text-decoration: none; display: flex; align-items: center; justify-content: center; font-style: italic;font-weight: 700;" href="https://github.com/DeveloperMDCM/Youtube-tools-extension">Link GitHub Repository<h4></h4</a>';
            sms.appendChild(mdcm);
          }
        }
      }
    }
    // Función para adaptar dislikes
    let validoUrl = document.location.href;
    async function cargarDislikes() {
      const enlace = paramsVideoURL();
      validoUrl = document.location.href;
      const btnDislike = document.querySelector("#segmented-dislike-button yt-button-shape > button");
      const validoVentana = document.querySelector("#below > ytd-watch-metadata > div.container > form > div.containerButtons");
      const resultado = document.querySelector("#segmented-dislike-button > ytd-toggle-button-renderer > yt-button-shape > button > yt-touch-feedback-shape");
      if (
        validoUrl.split("/")[3] !== "shorts" &&
        validoVentana != undefined &&
        validoUrl != "https://www.youtube.com/"
      ) {
        const url = `https://returnyoutubedislikeapi.com/Votes?videoId=${enlace}`;
        try {
          const respuesta = await fetch(url);
          const datos = await respuesta.json();
          const {
            dislikes,
            dateCreated,
            rating
          } = datos; // Objeto
          addDislike.textContent = `${FormatiarNumero(dislikes, 0)}`;
          btnDislike.style = "width: 100px";
          resultado.style = "margin: 0 6px";
          resultado.insertAdjacentElement("afterend", addDislike);
          const iconLike = document.querySelector("#segmented-like-button > ytd-toggle-button-renderer > yt-button-shape > button > div.yt-spec-button-shape-next__icon > yt-icon > yt-animated-icon");
          const inconDislike = document.querySelector("#segmented-dislike-button > ytd-toggle-button-renderer > yt-button-shape > button > div > yt-icon");
          if (iconLike != undefined && iconLike != inconDislike) {
            document.querySelector("#segmented-like-button > ytd-toggle-button-renderer > yt-button-shape > button > div.yt-spec-button-shape-next__icon > yt-icon > yt-animated-icon").innerHTML = `
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6">
          <path d="M7.493 18.75c-.425 0-.82-.236-.975-.632A7.48 7.48 0 016 15.375c0-1.75.599-3.358 1.602-4.634.151-.192.373-.309.6-.397.473-.183.89-.514 1.212-.924a9.042 9.042 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75 2.25 2.25 0 012.25 2.25c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H14.23c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23h-.777zM2.331 10.977a11.969 11.969 0 00-.831 4.398 12 12 0 00.52 3.507c.26.85 1.084 1.368 1.973 1.368H4.9c.445 0 .72-.498.523-.898a8.963 8.963 0 01-.924-3.977c0-1.708.476-3.305 1.302-4.666.245-.403-.028-.959-.5-.959H4.25c-.832 0-1.612.453-1.918 1.227z" />
          </svg>`;
            document.querySelector("#segmented-dislike-button > ytd-toggle-button-renderer > yt-button-shape > button > div > yt-icon").innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6">
          <path d="M15.73 5.25h1.035A7.465 7.465 0 0118 9.375a7.465 7.465 0 01-1.235 4.125h-.148c-.806 0-1.534.446-2.031 1.08a9.04 9.04 0 01-2.861 2.4c-.723.384-1.35.956-1.653 1.715a4.498 4.498 0 00-.322 1.672V21a.75.75 0 01-.75.75 2.25 2.25 0 01-2.25-2.25c0-1.152.26-2.243.723-3.218C7.74 15.724 7.366 15 6.748 15H3.622c-1.026 0-1.945-.694-2.054-1.715A12.134 12.134 0 011.5 12c0-2.848.992-5.464 2.649-7.521.388-.482.987-.729 1.605-.729H9.77a4.5 4.5 0 011.423.23l3.114 1.04a4.5 4.5 0 001.423.23zM21.669 13.773c.536-1.362.831-2.845.831-4.398 0-1.22-.182-2.398-.52-3.507-.26-.85-1.084-1.368-1.973-1.368H19.1c-.445 0-.72.498-.523.898.591 1.2.924 2.55.924 3.977a8.959 8.959 0 01-1.302 4.666c-.245.403.028.959.5.959h1.053c.832 0 1.612-.453 1.918-1.227z" />
        </svg>
        `;
          }


        } catch (error) {
          // Error
          console.log(error);
        }
      }
    }
    // Función para formatear los dislikes
    function FormatiarNumero(num, digits) {
      const lookup = [{
          value: 1,
          symbol: "",
        },
        {
          value: 1e3,
          symbol: " K",
        },
        {
          value: 1e6,
          symbol: " M",
        },
      ];
      const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
      const item = lookup
        .slice()
        .reverse()
        .find((item) => {
          return num >= item.value;
        });
      return item ?
        (num / item.value).toFixed(digits).replace(rx, "$1") + item.symbol :
        "0";
    }

    // Función para mostrar los dislikes en shorts
    async function shortDislike() {
      validoUrl = document.location.href;
      const validoVentanaShort = document.querySelectorAll(
        "#dislike-button > yt-button-shape > label > div > span"
      );
      if (
        validoVentanaShort != undefined &&
        document.location.href.split("/")[3] === "shorts"
      ) {
        validoUrl = document.location.href.split("/")[4];
        const urlShorts = `https://returnyoutubedislikeapi.com/Votes?videoId=${validoUrl}`;
        try {
          const respuesta = await fetch(urlShorts);
          const datosShort = await respuesta.json();
          const {
            dislikes
          } = datosShort;
          for (var i = 0; i < validoVentanaShort.length; i++) {
            validoVentanaShort[i].textContent = `${FormatiarNumero(
              dislikes,
              0
            )}`;
          }
        } catch (error) {
          console.log(error);
        }
      }
    }

    // Mostrar alerta de activar modo oscuro
    function mostrarAlerta(mensaje) {
      alert('Active Dark Theme in Youtube page')
      const addButton = document.querySelector(
        "#below > ytd-watch-metadata > div.container > form"
      );
      const existeAlerta = document.querySelector(".alerta");
      if (!existeAlerta) {
        if (addButton != undefined) {
          const modeDark = document.createElement("P");
          modeDark.innerHTML = `<h1 class="alerta" style="color: red; background-color: white; border: 2px solid white; text-aling: center; display: flex;  align-items: center; justify-content: center;">${mensaje}</h1>`;
          addButton.appendChild(modeDark);
          setTimeout(() => {
            modeDark.remove();
          }, 7000);
        }
      }
    }
    // Función para eliminar los posibles anuncios
    function eliminarAnuancios() {
      // Skip ads video / saltar publicidad
      const buttonSkip = document.querySelector(".ytp-ad-skip-button.ytp-button");
      const validar = undefined;
      let ytpminiplayerscrim = document.querySelector("ytp-miniplayer-scrim");
      let cross = document.getElementsByClassName("ytp-ad-overlay-close-container")[0];
      let skip = document.getElementsByClassName("ytp-ad-skip-button")[0];
      let ad1 = document.querySelector("#contents > ytd-promoted-sparkles-web-renderer");
      let ad2 = document.querySelector("#player-ads > ytd-player-legacy-desktop-watch-ads-renderer");
      let ad3 = document.querySelector("#action-companion-click-target");
      let ad4 = document.querySelector("#player-overlay\\:0 > div.ytp-ad-player-overlay-flyout-cta.ytp-ad-player-overlay-flyout-cta-rounded");
      let ad5 = document.querySelector("#invideo-overlay\\:0 > div > div.ytp-ad-image-overlay");
      let ad6 = document.querySelector("#root");
      let ad7 = document.querySelector("#rendering-content > ytd-video-masthead-ad-v3-renderer");
      let ad8 = document.querySelector("#player-ads > ytd-player-legacy-desktop-watch-ads-renderer");
      let ad9 = document.querySelector(".ytp-ad-text-overlay");
      const adVideo = document.querySelectorAll(".ad-showing")[0];
      const adTimeVideo = document.querySelector(".ytp-ad-text.ytp-ad-preview-text");
      const video = document.querySelector("video");
      if (adVideo != validar && video != validar && adTimeVideo != validar) {
        video.currentTime = video.duration;
      }
      if (ytpminiplayerscrim != validar) alert("eliminado");
      if (ad1 != validar) ad1.remove();
      if (ad2 != validar) ad2.remove();
      if (ad3 != validar) ad3.remove();
      if (ad4 != validar) ad4.remove();
      if (ad5 != validar) ad5.remove();
      if (ad6 != validar && ad) {
        ad6.style.display = "none";
        ad = false;
      }
      if (ad7 != validar) ad7.remove();
      if (ad8 != validar) ad8.remove();
      if (ad9 != validar) ad9.remove();
      if (cross != validar) cross.click();
      if (skip != validar) skip.click();
      if (buttonSkip != validar) {
        buttonSkip.click();
      }
    }


    // Validar que la url a cambiado por una nueva
    let prevUrl = undefined; // Sin cambios
    setInterval(() => {
      // URL changed / Cambio
      const currUrl2 = window.location.href;
      const video = document.querySelector("#movie_player > div.html5-video-container > video")
      if (currUrl2 != prevUrl && video != undefined) {
        setTimeout(() => {
        cargarDislikes();
        }, 500)
      }
      const currUrl = window.location.href;
      if (currUrl != prevUrl) {
        MDCM();
        setTimeout(() => {
          shortDislike();
        }, 1000)
        const formulariodescarga = document.querySelector(".formulariodescarga");
        const formulariodescargaaudio = document.querySelector(".formulariodescargaaudio");
        setTimeout(() => {
          if (formulariodescarga != undefined) {
            formulariodescarga.classList.add("ocultarframe");
            formulariodescargaaudio.classList.add("ocultarframe");
          }
        }, 500);
        prevUrl = currUrl;
        setTimeout(() => {
          cargarDislikes();
        }, 1000)
      }

      const ventanaShortComentarios = document.querySelector("body > ytd-app > ytd-popup-container > tp-yt-paper-dialog > ytd-engagement-panel-section-list-renderer");
      const historias = document.querySelectorAll("#shorts-inner-container");
      if (ventanaShortComentarios && historias) {
        limpiarHTML();
      }
      eliminarAnuancios();
    }, 500); // Cada 2 segundos se ejecuta mientras la url cambie
    eliminarAnuancios();
  }



  // Variables para la traduccion de comentarios
  let traducido; // Texto traducido
  let urlLista; // Url lista
  //TODO: Traducir comentarios
  async function traductor() {
    const texto = document.querySelectorAll("#content-text");
    let o = `?client=dict-chrome-ex&sl=auto&tl=${navigator.language}&q=`;
    for (let i = 0; i < texto.length; i++) {
      const botonTraducir = document.createElement("BUTTON");
      botonTraducir.classList.add("mdcm");
      botonTraducir.textContent = "Traducir";
      botonTraducir.style.backgroundColor = "white";
      botonTraducir.style.color = "black";
      botonTraducir.style.borderRadius = "5px";
      botonTraducir.setAttribute("id", `btn${i}`);
      texto[i].insertAdjacentElement("afterend", botonTraducir);
      const mdcm = document.querySelectorAll(`.mdcm`);
      mdcm[i].onclick = function () {
        traducido = o;
        urlLista = traducido + texto[i].textContent;
        fetch("https://translate.googleapis.com/translate_a/t" + urlLista) //API
          .then((response) => response.json())
          .then((datos) => {
            texto[i].textContent = datos[0][0];
            mdcm[i].textContent = "Translated";
          });
      };
    }
  }

  // Limpiar botones de comentarios
  function limpiarHTML() {
    const buttons = document.querySelectorAll(".mdcm");
    [].forEach.call(buttons, function (buttons) {

      buttons.remove();

    });
    traductor();
  }

  // TODO: mostrar boton de traducir en comentarios cuando sean visibles
  window.onscroll = () => {
    const divEl = document.querySelector("#content-text");
    if (divEl != undefined) {
      limpiarHTML();
    }
  };
  setTimeout(() => {
    cargarScript();
  }, 1500);
})();

QingJ © 2025

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