// ==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.7.3
// @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;
border-radius: 20px;
margin: 0 auto;
padding: 4px;
}
.containerButtons button , input {
display: flex;
flex-direction: column-reverse;
margin: 0 5px;
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: 30px;
}
/* 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;
}
.botones_div {
background-color: #fff;
border: none;
}
</style>
<body>
<div class="container">
<form>
<div class="containerButtons">
<div style="position:relative; display:inline-block ">
<button class="botones_div" type="button"><img width="35" src="https://www.svgrepo.com/show/277433/pantone-paint.svg"><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 class="botones_div" type="button" id="imagen"> <img width="35" src="https://www.svgrepo.com/show/33989/jpg.svg"></button>
<button class="botones_div" type="button" id="invertir"> <img width="35" src="https://www.svgrepo.com/show/253535/reverse.svg"></button>
<button class="botones_div" type="button" id="reset"> <img width="35" src="https://www.svgrepo.com/show/285786/turn-on-reset.svg"></button>
<div style="position:relative; display:inline-block ">
<button class="botones_div" type="button"><img width="35" src="https://www.svgrepo.com/show/195571/brightness-sun.svg"><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 class="botones_div" type="button" id="repeatvideo"> <img class="imarepeat" width="35" src="https://www.svgrepo.com/show/498215/money-change.svg"></button>
<button type="button" class="btn1 botones_div"> <img width="35" src="https://www.svgrepo.com/show/41018/mp4.svg"></button>
<button type="button" class="btn2 botones_div"> <img width="35" src="https://www.svgrepo.com/show/25848/mp3.svg"></button>
<button type="button" class="btn3 botones_div"> <img width="35" src="https://www.svgrepo.com/show/286637/cancel-close.svg"></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;
}
};
// 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://www.svgrepo.com/show/496405/money-change.svg"; // img repeat
}
break;
case 2:
countRepeat = 0;
imarepeat.src = "https://www.svgrepo.com/show/498215/money-change.svg";
break;
}
}, 1000);
}else {
mostrarAlerta('Active Dark Theme in Youtube page')
}
};
// Background transparent
// localStorage.setItem('colorTextPage', "");
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: 100%; height: 100vh; 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";
const colorTextPage = localStorage.getItem('colorTextPage');
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", colorTextPage);
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;";
}
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", colorTextPage);
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);
cargarDislikes();
}
}
}
// 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();
}, 1000)
}
const currUrl = window.location.href;
if (currUrl != prevUrl) {
MDCM();
cargarDislikes();
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)
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();
}, 2000);
})();