Outils Youtube Tout-en-un local Téléchargez des mp4, des MP3
Vous pourriez également aimer Autocollants personnalisés.
// ==UserScript== // @name Youtube Tools All in one local download mp3 mp4 HIGT QUALITY return dislikes and more // @name:zh-TW Youtube 工具 多合一本地下載 MP4、MP3 // @name:zh-HK Youtube 工具 多合一本地下載 MP4、MP3 // @name:zh-CN Youtube 工具 多合一本地下載 MP4、MP3 // @name:ja Youtube ツール オールインワンのローカル ダウンロード MP4、MP3 // @name:kr Youtube 도구 올인원 로컬 다운로드 외부 서비스 없이 MP4, MP3 // @name:ar Youtube Tools All in one local download mp3 mp4 HIGT QUALITY return dislikes and more // @name:bg Youtube-Tools Alles in einem lokalen Download von MP4, MP3. // @name:cs Nástroje YouTube Vše v jednom místní Stahujte MP4, MP3 // @name:da Youtube-værktøjer Alt i én lokal Download MP4, MP3 // @name:de Youtube-Tools Alles in einem lokalen Download von MP4, MP3 // @name:tel Youtube టూల్స్ అన్నీ ఒకే లోకల్ డౌన్లోడ్ MP4, Mp3 // @name:es Youtube Custom Todo en uno Descarga local MP4, MP3. // @name:en Youtube Tools All in one local download mp3 mp4. // @name:fr Outils Youtube Tout-en-un local Téléchargez MP4, MP3. // @name:fr-CA Outils Youtube Tout-en-un local Téléchargez MP4, MP3. // @name:he כלים של YouTube הכל במקום אחד מקומי הורדה MP4, MP3 באיכות גבוהה ללא שירות חיצוני ועוד. // @name:hu Youtube Eszközök Minden egy helyen Letöltés MP4, MP3. // @name:id Alat Youtube Semua dalam satu lokal Unduh MP4, MP3. // @name:it Strumenti Youtube Tutto in uno Scarica locale MP4, MP3. // @name:ko Youtube 도구 올인원 로컬 외부 서비스 없이 MP4, MP3 // @name:nb Youtube-verktøy Alt i ett lokalt Last ned MP4, MP3 // @name:nl Youtube Tools Alles in één lokaal Download MP4, MP3 // @name:pl Narzędzia YouTube Wszystko w jednym lokalnym. Pobierz MP4, MP3 // @name:pt-BR Ferramentas do Youtube Tudo em um local Baixe MP4, MP3 DE ALTA QUALIDAD. // @name:ro YInstrumente Youtube Toate într-un singur local Descărcați MP4, MP3. // @name:ru Инструменты Youtube Все в одном локальном формате. Загрузите MP4, MP3. // @name:sk Nástroje YouTube Všetko v jednom miestne Stiahnite si MP4, MP3 // @name:sr Иоутубе алати Све у једном локалном Преузми МП4, МП3 // @name:sv Youtube-verktyg Allt i ett lokalt Ladda ner MP4, MP3 // @name:th เครื่องมือ Youtube ทั้งหมดในที่เดียว ดาวน์โหลด MP4, MP3 // @name:tr Youtube Araçları Hepsi bir arada yerel Harici hizmet olmadan MP4, MP3 // @name:uk Інструменти Youtube Все в одному локальному завантаженні MP4, MP3 // @name:ug Youtube قوراللىرى ھەممىسى بىر يەرلىك چۈشۈرۈش MP4,mp3 // @name:vi Công cụ Youtube Tất cả trong một cục bộ Tải xuống MP4, MP3 // @description:zh-TW Youtube 工具 多合一本地下載 mp4、MP3 // @description:zh-HK Youtube 工具 多合一本地下載 mp4、MP3 // @description:zh-CN Youtube 工具 多合一本地下載 mp4、MP3 // @description:ja Youtube ツール オールインワン ローカル ダウンロード mp4、MP3 、 // @description:kr Youtube 도구 올인원 로컬 다운로드 mp4, MP3 // @description:ar Herramientas de YouTube Todo en uno Descarga local mp4, MP3 // @description:bg Инструменти за Youtube Всичко в едно локално изтегляне mp4, // @description:cs Nástroje YouTube Vše v jednom místní Stahování mp4, MP3 // @description:da Youtube-værktøjer Alt i ét lokalt Download mp4, MP3 // @description:de YouTube-Tools Alles in einem lokalen Laden Sie MP4, MP3 // @description:tel Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY, // @description:es Youtube tools todo en uno personlizada youtube a tu estilo y descarga MP4 y MP3 // @description:fr Outils Youtube Tout-en-un local Téléchargez des mp4, des MP3 // @description:fr-CA Outils Youtube Tout-en-un local Téléchargez des mp4, des MP3 // @description:he כלים של YouTube הכל במקום אחד מקומי הורד mp4, MP3 // @description:hu Youtube Eszközök Minden egyben helyi Letöltés mp4, MP3 // @description:id Alat Youtube Semua dalam satu lokal Unduh mp4, MP3 // @description:it Strumenti Youtube Tutto in uno locale Scarica mp4, MP3 // @description:ko Youtube 도구 올인원 로컬 다운로드 mp4, MP3 // @description:nb YoYoutube-verktøy Alt i ett lokalt Last ned mp4, MP3 // @description:nl YouTube-tools Alles in één lokaal Download mp4, MP3 // @description:pl Narzędzia Youtube Wszystko w jednym miejscu Pobierz mp4, MP3 // @description:pt-BR Ferramentas do YouTube Tudo em um só local Baixe mp4, MP3 // @description:ro Instrumente Youtube Toate într-un singur local Descărcați mp4, MP3 // @description:ru Инструменты Youtube Все в одном, локально. Загрузите mp4, MP3 // @description:sk Nástroje YouTube Všetko v jednom miestnom Sťahujte mp4, MP3 // @description:sr Иоутубе алати Све у једном локалном Преузми мп4, МП3 // @description:sv Youtube-verktyg Allt i ett lokalt Ladda ner mp4, MP3 // @description:th เครื่องมือ Youtube ทั้งหมดในที่เดียว ดาวน์โหลด mp4, MP3 // @description:tr Youtube Araçları Hepsi bir arada yerel Harici hizmet olmadan mp4, MP3 // @description:uk Інструменти Youtube Все в одному локальному завантаженні mp4, MP3 // @description:ug Youtube قورالىنىڭ ھەممىسى بىر يەرلىك چۈشۈرۈشتە mp4, MP3 HIGH QUAقنى قا // @description:vi Công cụ Youtube Tất cả trong một cục bộ Tải xuống mp4, MP3 // @description:en Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY // @description Youtube Tools All in one local Download mp4, MP3 HIGT QUALITY // @homepage https://github.com/DeveloperMDCM/ // @version 2.3.2 // @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_addStyle // @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 () { 'use strict'; let validoUrl = document.location.href; const $e = (el) => document.querySelector(el); // any element const $id = (el) => document.getElementById(el); // element by id const $m = (el) => document.querySelectorAll(el); // multiple all elements const $cl = (el) => document.createElement(el); // create element const $sp = (el, pty) => document.documentElement.style.setProperty(el, pty); // set property variable css const $ap = (el) => document.body.appendChild(el); // append element const apiDislikes = "https://returnyoutubedislikeapi.com/Votes?videoId="; // Api dislikes function FormatterNumber(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'; } function paramsVideoURL() { const parametrosURL = new URLSearchParams(window.location.search); // Url parametros return parametrosURL.get('v'); } // Dislikes video async function videoDislike() { validoUrl = document.location.href; const validoVentana = $e('#below > ytd-watch-metadata > div'); if (validoVentana != undefined && document.location.href.split('?v=')[0].includes('youtube.com/watch')) { validoUrl = paramsVideoURL(); const urlShorts = `${apiDislikes}${validoUrl}`; try { const respuesta = await fetch(urlShorts); const datosShort = await respuesta.json(); const { dislikes } = datosShort; const dislikes_content = $e('#top-level-buttons-computed > segmented-like-dislike-button-view-model > yt-smartimation > div > div > dislike-button-view-model > toggle-button-view-model > button-view-model > button'); if (dislikes_content !== undefined) { dislikes_content.style = 'width: 90px'; dislikes_content.innerHTML = ` <svg class="svg-dislike-icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M7 13v-8a1 1 0 0 0 -1 -1h-2a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h3a4 4 0 0 1 4 4v1a2 2 0 0 0 4 0v-5h3a2 2 0 0 0 2 -2l-1 -5a2 3 0 0 0 -2 -2h-7a3 3 0 0 0 -3 3" /></svg> ${FormatterNumber(dislikes, 0)}`; } } catch (error) { console.log(error); } } } // dislikes shorts async function shortDislike() { validoUrl = document.location.href; const validoVentanaShort = $m( '#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 = `${apiDislikes}${validoUrl}`; try { const respuesta = await fetch(urlShorts); const datosShort = await respuesta.json(); const { dislikes } = datosShort; for (let i = 0; i < validoVentanaShort.length; i++) { validoVentanaShort[i].textContent = `${FormatterNumber( dislikes, 0 )}`; } } catch (error) { console.log(error); } } } // Url change in second load let prevUrl; let showDislikes = false; setInterval(() => { const svgDislike = $e('.svg-dislike-ico'); // Check svg in dom const currUrl = window.location.href; if (prevUrl !== undefined && currUrl !== prevUrl && !svgDislike && showDislikes) { setTimeout(async() => { await videoDislike(); await shortDislike(); },2000) } prevUrl = currUrl; }, 1000); // Create a Trusted Types policy const policy = window.trustedTypes?.createPolicy('default', { createHTML: (input) => input, }); // Styles for our enhancement panel GM_addStyle(` #cinematics { position: absolute !important; width: 90vw !important; height: 100vh ; } #cinematics div { position: fixed; inset: 0px; pointer-events: none; transform: scale(1.5, 2); } #cinematics > div > div > canvas:nth-child(1), #cinematics > div > div > canvas:nth-child(2) { position: absolute !important; width: 90vw !important; height: 100vh ; } // .html5-video-player.unstarted-mode { // background-image: url('https://avatars.githubusercontent.com/u/54366580?v=4'); // background-repeat: no-repeat; // background-position: 50% 50%; // display: flex; // justify-content: center; // align-items: center; // } #yt-enhancement-panel { position: fixed; top: 60px; right: 20px; background-color: var(--yt-enhance-menu-bg, #ffffff); color: var(--yt-enhance-menu-text, #000000); border: 1px solid #cccccc; border-radius: 8px; padding: 15px; z-index: 9999; box-shadow: 0 2px 10px rgba(0,0,0,0.1); width: 300px; max-height: 80vh; overflow-y: auto; font-size: var(--yt-enhance-menu-font-size, 14px); } #yt-enhancement-panel h3 { margin-top: 0; color: #ff0000; } .enhancement-option { margin-bottom: 10px; } .color-picker { width: 100%; margin: 0; padding: 0; border: none; background: none; } .slider { width: 100%; } #toggle-panel { position: fixed; top: 10px; right: 115px; z-index: 10000; color: white; padding: 5px; border: none; cursor: pointer; display: flex; justify-content: center; transition: all 0.5s ease; width: 43px; border-radius: 100px; } #toggle-panel:hover { background-color: #fff; border-radius: 100px; opacity: 1 !important; } #icon-menu-settings { width: 24px; height: 24px; cursor: pointer; user-select: none; } .tab-buttons { display: flex; justify-content: space-between; margin-bottom: 15px; } .tab-button { background-color: #f0f0f0; border: none; padding: 5px 10px; cursor: pointer; border-radius: 4px; } .tab-button.active { background-color: #ff0000; color: white; } .tab-button-active { background-color: #ff0000; color: white; border: none; border-radius: 2px; } .tab-content { display: none; } .tab-content.active { display: block; } #import-export { margin-top: 15px; } #import-export textarea { width: 100%; height: 100px; } #menu-settings-icon { cursor: pointer; float: right; font-size: 20px; } .theme-option { margin-bottom: 15px; } .theme-option label { display: flex; align-items: center; } .theme-option { position: relative; width: auto; margin-bottom: 10px; padding: 10px; border-radius: 4px; cursor: pointer; } .theme-preview { position: absolute; top: 0; left: 0; right: 0; bottom: 0; border-radius: 10px; border: 1px solid #000; z-index: 1; } .theme-option input[type="radio"] { position: relative; z-index: 2; margin-right: 10px; cursor: pointer; } .theme-name { position: relative; z-index: 2; font-size: 15px; color: #fff; } .theme-option label { display: flex; align-items: center; width: 100%; position: relative; z-index: 2; } .buttons-tranlate { background: #000; font-size: 10px; border: none; color: #fbf4f4 !important; padding: 3px 0; margin-left: 10px; width: 70px; border-radius: 10px;} .buttons-tranlate:hover { cursor: pointer; background-color: #6b6b6b;} button.botones_div { margin: 0; padding: 0; } .tab-button:hover { background-color: #ec3203 !important; color: #ffffff !important; cursor: pointer; } #eyes { opacity: 0; position: absolute; height: 24px; left: 0; width: 24px; } /* width */ ::-webkit-scrollbar { width: 4px; height: 10px; } /* Track */ ::-webkit-scrollbar-track { background: ##d5d5d5; } /* Handle */ ::-webkit-scrollbar-thumb { background: #000; } .containerButtons { display: flex; justify-content: center; align-items: center; flex-wrap: wrap; gap: 10px; } .containerButtons > button:hover { cursor: pointer; } #container.ytd-masthead { height: 56px; padding: 0 16px; display: flexbox; display: flex; flex-direction: row; align-items: center; justify-content: start; } body { padding: 0; margin: 0; overflow-y: scroll; overflow-x: hidden; } .style-scope.ytd-comments { overflow-y: auto; overflow-x: hidden; height: auto; max-height: 100vh; } ytd-item-section-renderer.ytd-watch-next-secondary-r###lts-renderer { --ytd-item-section-item-margin: 8px; overflow-y: auto; overflow-x: hidden; height: auto; max-height: 130vh; } .right-section.ytcp-header { display: flex; flex: 1; align-items: center; gap: 45px; justify-content: end; } #meta.ytd-playlist-panel-video-renderer { min-width: 0; padding: 0 8px; display: flexbox; display: flex; flex-direction: column-reverse; flex: 1; flex-basis: 0.000000001px; } .containerall { display: flex; align-items: center; justify-content: center; width: 50%; margin: auto; } } .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; } .checked_updates { cursor: pointer; } #export-config, #import-config { width: 100%; display: flex; align-items: center; justify-content: center; gap: 10px; background-color: #ec3203; color: #ffffff; border: none; padding: 5px; } #export-config:hover, #import-config:hover { background-color: #ff0000; color: #ffffff; cursor: pointer; } `); // botons bottom video player const thumbnailVideo = ` <button title="Image video" class="botones_div" type="button" id="imagen"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-photo-down" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M15 8h.01"></path> <path d="M12.5 21h-6.5a3 3 0 0 1 -3 -3v-12a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v6.5"></path> <path d="M3 16l5 -5c.928 -.893 2.072 -.893 3 0l4 4"></path> <path d="M14 14l1 -1c.653 -.629 1.413 -.815 2.13 -.559"></path> <path d="M19 16v6"></path> <path d="M22 19l-3 3l-3 -3"></path> </svg> </button> `; const filterEyes = ` <div style="position:relative; "> <button title="Filter eyes" class="botones_div" type="button"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brightness-half" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M12 9a3 3 0 0 0 0 6v-6z"></path> <path d="M6 6h3.5l2.5 -2.5l2.5 2.5h3.5v3.5l2.5 2.5l-2.5 2.5v3.5h-3.5l-2.5 2.5l-2.5 -2.5h-3.5v-3.5l-2.5 -2.5l2.5 -2.5z"> </path> </svg> <input id="eyes" list="presetColors" type="color" value="#ffffff"> <datalist id="presetColors"> <option value="#000000" /> <option value="#fbff00" /> <option value="#ff0000" /> <option value="#00ff00" /> <option value="#0000ff" /> </datalist> <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> </button> `; const resetButton = ` <button title="reset" class="botones_div" type="button" id="reset_button"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-power" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M7 6a7.75 7.75 0 1 0 10 0"></path> <path d="M12 4l0 8"></path> </svg> </button> `; const repeatVideo = ` <button title="Repeat video" class="botones_div" type="button" id="repeatvideo"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-repeat" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M4 12v-3a3 3 0 0 1 3 -3h13m-3 -3l3 3l-3 3"></path> <path d="M20 12v3a3 3 0 0 1 -3 3h-13m3 3l-3 -3l3 -3"></path> </svg> </button> `; const downloadMp4Mp3 = ` <button title="MP4" type="button" class="btn1 botones_div"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-file-download" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M14 3v4a1 1 0 0 0 1 1h4"></path> <path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z"></path> <path d="M12 17v-6"></path> <path d="M9.5 14.5l2.5 2.5l2.5 -2.5"></path> </svg> </button> <button title="MP3" type="button" class="btn2 botones_div"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-file-music" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M14 3v4a1 1 0 0 0 1 1h4"></path> <path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z"></path> <path d="M11 16m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path> <path d="M12 16l0 -5l2 1"></path> </svg> </button> <button title="Close" type="button" class="btn3 botones_div"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-circle-x" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0"></path> <path d="M10 10l4 4m0 -4l-4 4"></path> </svg> </button> `; const donwloadExternal = ` <button title="External Download" type="button" class="external_link botones_div"> <svg class="icon icon-tabler icon-tabler-external-link" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M12 6h-6a2 2 0 0 0 -2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-6"></path> <path d="M11 13l9 -9"></path> <path d="M15 4h5v5"></path> </svg> </button> `; const viewExternalVideo = ` <button title="view External no cookie" type="button" class="view_external_link botones_div"> <svg width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 16m0 1a1 1 0 0 1 1 -1h3a1 1 0 0 1 1 1v3a1 1 0 0 1 -1 1h-3a1 1 0 0 1 -1 -1z" /><path d="M4 12v-6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-6" /><path d="M12 8h4v4" /><path d="M16 8l-5 5" /></svg> </button> `; const pictureToPicture = ` <button title="Picture to picture" type="button" class="video_picture_to_picture botones_div"> <svg width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M11 19h-6a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v4" /><path d="M14 14m0 1a1 1 0 0 1 1 -1h5a1 1 0 0 1 1 1v3a1 1 0 0 1 -1 1h-5a1 1 0 0 1 -1 -1z" /></svg> </button> `; const screenShot = ` <button title="Screenshot video" type="button" class="screenshot_video botones_div"> <svg width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M15 8h.01" /><path d="M6 13l2.644 -2.644a1.21 1.21 0 0 1 1.712 0l3.644 3.644" /><path d="M13 13l1.644 -1.644a1.21 1.21 0 0 1 1.712 0l1.644 1.644" /><path d="M4 8v-2a2 2 0 0 1 2 -2h2" /><path d="M4 16v2a2 2 0 0 0 2 2h2" /><path d="M16 4h2a2 2 0 0 1 2 2v2" /><path d="M16 20h2a2 2 0 0 0 2 -2v-2" /></svg> </button> `; const checkUpdates = ` <button title="Check new updates" type="button" class="checked_updates botones_div"> <svg width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4" /><path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4" /></svg> </button> `; const bufferVideo = ` <button title="Buffer video" type="button" class="buffer_video botones_div"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-align-box-right-stretch"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M15 17h2" /><path d="M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14z" /><path d="M11 12h6" /><path d="M13 7h4" /></svg> </button> `; const menuBotones = ` <main> <div class="container"> <form> <div class="containerButtons"> ${thumbnailVideo} ${bufferVideo} ${filterEyes} ${resetButton} ${repeatVideo} ${downloadMp4Mp3} ${donwloadExternal} ${viewExternalVideo} ${pictureToPicture} ${screenShot} ${checkUpdates} </div> <div> </div> </form> </div> <div class="content_collapsible_colors" style="margin-top: 10px"> <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> </iframe> </div> </form> </main> </html> `; // Define themes const themes = [ { name: 'Default / Reload Page', gradient: '', textColor: '', raised: '', btnTranslate: '', CurrentProgressVideo: '', videoDuration: '', colorIcons: '', textLogo: '', primaryColor: '', secondaryColor: '', }, { name: 'Midnight Blue', gradient: 'linear-gradient(135deg, #1e3a8a, #3b82f6)', textColor: '#ffffff', raised: '#f00', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Forest Green', gradient: 'linear-gradient(135deg, #14532d, #22c55e)', textColor: '#ffffff', raised: '#303131', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Sunset Orange', gradient: 'linear-gradient(135deg, #7c2d12, #f97316)', textColor: '#ffffff', raised: '#303131', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Royal Purple', gradient: 'linear-gradient(135deg, #4c1d95, #8b5cf6)', textColor: '#ffffff', raised: '#303131', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Cherry Blossom', gradient: 'linear-gradient(135deg, #a9005c, #fc008f)', textColor: '#ffffff', raised: '#fc008f', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Red Dark', gradient: 'linear-gradient(135deg, #790909, #f70131)', textColor: '#ffffff', raised: '#303131', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Raind ', gradient: 'linear-gradient(90deg, #3f5efb 0%, #fc466b) 100%', textColor: '#ffffff', raised: '#303131', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Neon', gradient: 'linear-gradient(273deg, #ee49fd 0%, #6175ff 100%)', textColor: '#ffffff', raised: '#303131', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Azure', gradient: 'linear-gradient(273deg, #0172af 0%, #74febd 100%)', textColor: '#ffffff', raised: '#303131', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Butterfly', gradient: 'linear-gradient(273deg, #ff4060 0%, #fff16a 100%)', textColor: '#ffffff', raised: '#303131', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, { name: 'Colombia', gradient: 'linear-gradient(174deg, #fbf63f 0%, #0000bb 45%, #ff0000 99%)', textColor: '#ffffff', raised: '#303131', btnTranslate: '#000', CurrentProgressVideo: '#0f0', videoDuration: '#fff', colorIcons: '#fff', textLogo: '#f00', }, ]; // Create our enhancement panel const panel = $cl('div'); panel.id = 'yt-enhancement-panel'; // Generate theme options HTML const themeOptionsHTML = themes .map( (theme, index) => ` <label > <div class="theme-option"> <div class="theme-preview" style="background: ${theme.gradient};"></div> <input type="radio" name="theme" value="${index}" ${ index === 0 ? 'checked' : '' }> <span style="${theme.name === 'Default / Reload Page' ? 'color: red; ' : '' }" class="theme-name">${theme.name}</span> </div> </label> ` ) .join(''); // find atribute dark in dom const htmlElement = $e('html'); const isDarkMode = htmlElement.hasAttribute('dark'); let isDarkModeActive = isDarkMode; // Use Trusted Types to set innerHTML const panelHTML = policy ? policy.createHTML(` <div style="display: flex;justify-content: space-between;align-items: center;gap: 3px;margin-bottom: 10px;"> <h4 style="display: flex;align-items: center;gap: 10px;">YouTube Tools v2.3.2 <a target="_blank" href="https://github.com/DeveloperMDCM/Youtube-tools-extension"> <svg style="background-color: white; border-radius: 5px;color: #000;" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" ><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /></svg> </a></h4> <div style="display: flex; gap: 5px;"> <span id="menu-settings-icon">⚙️</span> <a href="https://update.greasyfork.org/scripts/460680/Youtube%20Tools%20All%20in%20one%20local%20download%20mp3%20mp4%20HIGT%20QUALITY%20return%20dislikes%20and%20more.user.js" target="_blank" class="checked_updates">🔄️</a> <span style="cursor: pointer" class="close_menu_settings">❎</span> </div> </div> <div class="tab-buttons"> <button class="tab-button active" data-tab="general">General</button> <button class="tab-button" data-tab="themes">Themes</button> <button class="tab-button" data-tab="sidebar">Sidebar</button> <button class="tab-button" data-tab="headers">Header</button> </div> <div id="general" class="tab-content active"> <div class="enhancement-option"> <label> <input type="checkbox" id="hide-comments-toggle"> Hide Comments </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="hide-sidebar-toggle"> Hide Sidebar </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="autoplay-toggle"> Disable Autoplay </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="subtitles-toggle"> Disable Subtitles </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="dislikes-toggle"> Show Dislikes / Reload page </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="themes-toggle"> Active Themes / Reload page </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="translation-toggle"> Translate comments / Reload page </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="reverse-mode-toggle"> Reverse mode </label> </div> <div class="enhancement-option"> <label>Video Player Size: <span id="player-size-value">100</span>%</label> <button class="tab-button-active" id="reset-player-size">Reset video size</button> <input type="range" id="player-size-slider" class="slider" min="50" max="150" value="100"> </div> <div class="enhancement-option"> <label>Default video player quality: </label> <select class="tab-button-active" id="select-video-qualitys-select"> <option value="144">144</option> <option value="240">240</option> <option value="360">360</option> <option value="480">480</option> <option value="720">720</option> <option value="1080">1080</option> <option value="1440">1440</option> <option value="2160">2160</option> </select> </div> </div> <div id="themes" class="tab-content" style="height: auto; max-height: 350px; overflow-y: auto;"> <div class="themes-hidden"> <h4>Choose a Theme</h4> <p>Disable cinematic Lighting</p> <label> <div class="theme-option"> <div class="theme-preview" style="background: dark;"></div> <input type="radio" name="theme" value="custom"> <span class="theme-name">Custom</span> </div> </label> <label> <div class="theme-option theme-selected-normal"> <div class="theme-preview" style="background: dark;"></div> <input type="radio" name="theme" value="normal"> <span class="theme-name">Selected Themes</span> </div> </label> <p>${isDarkModeActive ? '' : 'activate dark mode to use themes'}</p> <div class="themes-options"> ${themeOptionsHTML} </div> <div class="theme-custom-options"> <div class="enhancement-option"> <label>Progressbar Video:</label> <input type="color" id="progressbar-color-picker" class="color-picker" value="#ff0000"> </div> <div class="enhancement-option"> <label>Background Color:</label> <input type="color" id="bg-color-picker" class="color-picker" value="#000000"> </div> <div class="enhancement-option"> <label>Primary Color:</label> <input type="color" id="primary-color-picker" class="color-picker" value="#ffffff"> </div> <div class="enhancement-option"> <label>Secondary Color:</label> <input type="color" id="secondary-color-picker" class="color-picker" value="#ffffff"> </div> <div class="enhancement-option"> <label>Header Color:</label> <input type="color" id="header-color-picker" class="color-picker" value="#000000"> </div> <div class="enhancement-option"> <label>Icons Color:</label> <input type="color" id="icons-color-picker" class="color-picker" value="#ffffff"> </div> <div class="enhancement-option"> <label>Menu Color:</label> <input type="color" id="menu-color-picker" class="color-picker" value="#000000"> </div> <div class="enhancement-option"> <label>Line Color Preview:</label> <input type="color" id="line-color-picker" class="color-picker" value="#ff0000"> </div> <div class="enhancement-option"> <label>Time Color Preview:</label> <input type="color" id="time-color-picker" class="color-picker" value="#ffffff"> </div> </div> </div> </div> <div id="sidebar" class="tab-content"> <h4>Available in next update</h4> </div> <div id="headers" class="tab-content"> <h4>Available in next update</h4> </div> <div id="menu-settings" class="tab-content"> <h4 style="margin: 10px 0">Menu Appearance</h4> <div class="enhancement-option"> <label>Menu Background Color:</label> <input type="color" id="menu-bg-color-picker" class="color-picker" value="#000000"> </div> <div class="enhancement-option"> <label>Menu Text Color:</label> <input type="color" id="menu-text-color-picker" class="color-picker" value="#ff0000"> </div> " </div> <div id="import-export"> <div style="display: flex;width: 100%;justify-content: space-between;"> <button id="export-config">Export <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" ><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" /></svg> </button> <button id="import-config">Import <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M15 15h-6" /><path d="M11.5 17.5l-2.5 -2.5l2.5 -2.5" /></svg> </button> </div> <textarea id="config-data" placeholder="Paste configuration here to import"></textarea> </div> `) : ` <div style="display: flex;justify-content: space-between;align-items: center;gap: 3px;margin-bottom: 10px;"> <h4 style="display: flex;align-items: center;gap: 10px;">YouTube Tools v2.2.92 <a target="_blank" href="https://github.com/DeveloperMDCM/Youtube-tools-extension"> <svg style="background-color: white; border-radius: 5px;color: #000;" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" ><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /></svg> </a></h4> <div style="display: flex; gap: 5px;"> <span id="menu-settings-icon">⚙️</span> <a href="https://update.greasyfork.org/scripts/460680/Youtube%20Tools%20All%20in%20one%20local%20download%20mp3%20mp4%20HIGT%20QUALITY%20return%20dislikes%20and%20more.user.js" target="_blank" class="checked_updates">🔄️</a> <span style="cursor: pointer" class="close_menu_settings">❎</span> </div> </div> <div class="tab-buttons"> <button class="tab-button active" data-tab="general">General</button> <button class="tab-button" data-tab="themes">Themes</button> <button class="tab-button" data-tab="sidebar">Sidebar</button> <button class="tab-button" data-tab="headers">Header</button> </div> <div id="general" class="tab-content active"> <div class="enhancement-option"> <label> <input type="checkbox" id="hide-comments-toggle"> Hide Comments </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="hide-sidebar-toggle"> Hide Sidebar </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="autoplay-toggle"> Disable Autoplay </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="subtitles-toggle"> Disable Subtitles </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="dislikes-toggle"> Show Dislikes / Reload page </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="themes-toggle"> Active Themes / Reload page </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="translation-toggle"> Translate comments / Reload page </label> </div> <div class="enhancement-option"> <label> <input type="checkbox" id="reverse-mode-toggle"> Reverse mode </label> </div> <div class="enhancement-option"> <label>Video Player Size: <span id="player-size-value">100</span>%</label> <button class="tab-button-active" id="reset-player-size">Reset video size</button> <input type="range" id="player-size-slider" class="slider" min="50" max="150" value="100"> </div> <div class="enhancement-option"> <label>Default video player quality: </label> <select class="tab-button-active" id="select-video-qualitys-select"> <option value="144">144</option> <option value="240">240</option> <option value="360">360</option> <option value="480">480</option> <option value="720">720</option> <option value="1080">1080</option> <option value="1440">1440</option> <option value="2160">2160</option> </select> </div> </div> <div id="themes" class="tab-content" style="height: auto; max-height: 350px; overflow-y: auto;"> <div class="themes-hidden"> <h4>Choose a Theme</h4> <p>Disable cinematic Lighting</p> <label> <div class="theme-option"> <div class="theme-preview" style="background: dark;"></div> <input type="radio" name="theme" value="custom"> <span class="theme-name">Custom</span> </div> </label> <label> <div class="theme-option theme-selected-normal"> <div class="theme-preview" style="background: dark;"></div> <input type="radio" name="theme" value="normal"> <span class="theme-name">Selected Themes</span> </div> </label> <p>${isDarkModeActive ? '' : 'activate dark mode to use themes'}</p> <div class="themes-options"> ${themeOptionsHTML} </div> <div class="theme-custom-options"> <div class="enhancement-option"> <label>Progressbar Video:</label> <input type="color" id="progressbar-color-picker" class="color-picker" value="#ff0000"> </div> <div class="enhancement-option"> <label>Background Color:</label> <input type="color" id="bg-color-picker" class="color-picker" value="#000000"> </div> <div class="enhancement-option"> <label>Primary Color:</label> <input type="color" id="primary-color-picker" class="color-picker" value="#ffffff"> </div> <div class="enhancement-option"> <label>Secondary Color:</label> <input type="color" id="secondary-color-picker" class="color-picker" value="#ffffff"> </div> <div class="enhancement-option"> <label>Header Color:</label> <input type="color" id="header-color-picker" class="color-picker" value="#000000"> </div> <div class="enhancement-option"> <label>Icons Color:</label> <input type="color" id="icons-color-picker" class="color-picker" value="#ffffff"> </div> <div class="enhancement-option"> <label>Menu Color:</label> <input type="color" id="menu-color-picker" class="color-picker" value="#000000"> </div> <div class="enhancement-option"> <label>Line Color Preview:</label> <input type="color" id="line-color-picker" class="color-picker" value="#ff0000"> </div> <div class="enhancement-option"> <label>Time Color Preview:</label> <input type="color" id="time-color-picker" class="color-picker" value="#ffffff"> </div> </div> </div> </div> <div id="sidebar" class="tab-content"> <h4>Available in next update</h4> </div> <div id="headers" class="tab-content"> <h4>Available in next update</h4> </div> <div id="menu-settings" class="tab-content"> <h4 style="margin: 10px 0">Menu Appearance</h4> <div class="enhancement-option"> <label>Menu Background Color:</label> <input type="color" id="menu-bg-color-picker" class="color-picker" value="#000000"> </div> <div class="enhancement-option"> <label>Menu Text Color:</label> <input type="color" id="menu-text-color-picker" class="color-picker" value="#ff0000"> </div> </div> <div id="import-export"> <div style="display: flex;width: 100%;justify-content: space-between;"> <button id="export-config" style="width: 100%;display: flex;align-items: center;justify-content: center;">Export <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" ><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" /></svg> </button> <button id="import-config" style="width: 100%;display: flex;align-items: center;justify-content: center;">Import <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M15 15h-6" /><path d="M11.5 17.5l-2.5 -2.5l2.5 -2.5" /></svg> </button> </div> <textarea id="config-data" placeholder="Paste configuration here to import"></textarea> </div> `; panel.innerHTML = panelHTML; $ap(panel); // Create toggle button const toggleButton = $cl('div'); toggleButton.id = 'toggle-panel'; const icon = $cl('img'); icon.id = 'icon-menu-settings'; icon.src = 'https://cdn.iconscout.com/icon/premium/png-512-thumb/settings-782-1095915.png?f=webp&w=256'; toggleButton.appendChild(icon); // Add panel and toggle button to the page $ap(panel); $ap(toggleButton); // Toggle panel visibility let openMenu = false; toggleButton.addEventListener('click', () => { openMenu = !openMenu; // openMenu // ? (toggleButton.style.backgroundColor = '#f00') // : (toggleButton.style.backgroundColor = 'transparent'); panel.style.display = panel.style.display === 'none' ? 'block' : 'none'; }); const close_menu_settings = $e('.close_menu_settings'); close_menu_settings.addEventListener('click', () => { openMenu = !openMenu; panel.style.display = panel.style.display === 'none' ? 'block' : 'none'; }); // Tab functionality const tabButtons = $m('.tab-button'); const tabContents = $m('.tab-content'); tabButtons.forEach((button) => { button.addEventListener('click', () => { const tabName = button.getAttribute('data-tab'); tabButtons.forEach((btn) => btn.classList.remove('active')); tabContents.forEach((content) => content.classList.remove('active')); button.classList.add('active'); $id(tabName).classList.add('active'); }); }); // Menu settings icon functionality $id('menu-settings-icon').addEventListener('click', () => { tabButtons.forEach((btn) => btn.classList.remove('active')); tabContents.forEach((content) => content.classList.remove('active')); $id('menu-settings').classList.add('active'); }); // Function to save settings function saveSettings() { const settings = { theme: $e('input[name="theme"]:checked').value, bgColorPicker: $id('bg-color-picker').value, progressbarColorPicker: $id('progressbar-color-picker').value, primaryColorPicker: $id('primary-color-picker').value, secondaryColorPicker: $id('secondary-color-picker').value, headerColorPicker: $id('header-color-picker').value, iconsColorPicker: $id('icons-color-picker').value, menuColorPicker: $id('menu-color-picker').value, lineColorPicker: $id('line-color-picker').value, timeColorPicker: $id('time-color-picker').value, dislikes: $id('dislikes-toggle').checked, themes: $id('themes-toggle').checked, translation: $id('translation-toggle').checked, reverseMode: $id('reverse-mode-toggle').checked, hideComments: $id('hide-comments-toggle').checked, hideSidebar: $id('hide-sidebar-toggle').checked, disableAutoplay: $id('autoplay-toggle').checked, // cinematicLighting: $id('cinematic-lighting-toggle').checked, disabl###btitles: $id('subtitles-toggle').checked, // fontSize: $id('font-size-slider').value, playerSize: $id('player-size-slider').value, selectVideoQuality: $id('select-video-qualitys-select').value, menuBgColor: $id('menu-bg-color-picker').value, menuTextColor: $id('menu-text-color-picker').value, // menuFontSize: $id('menu-font-size-slider').value, }; GM_setValue('ytSettingsMDCM', JSON.stringify(settings)); } // Function to load settings function loadSettings() { const settings = JSON.parse(GM_getValue('ytSettingsMDCM', '{}')); if (settings.theme) { $e(`input[name="theme"][value="${settings.theme}"]`).checked = true; } $id('bg-color-picker').value = settings.bgColorPicker || '#000000'; $id('progressbar-color-picker').value = settings.progressbarColorPicker || '#ff0000'; $id('primary-color-picker').value = settings.primaryColorPicker || '#ffffff'; $id('secondary-color-picker').value = settings.secondaryColorPicker || '#ffffff'; $id('header-color-picker').value = settings.headerColorPicker || '#000'; $id('icons-color-picker').value = settings.iconsColorPicker || '#ffffff'; $id('menu-color-picker').value = settings.menuColorPicker || '#000'; $id('line-color-picker').value = settings.lineColorPicker || '#ff0000'; $id('time-color-picker').value = settings.timeColorPicker || '#ffffff'; $id('dislikes-toggle').checked = settings.dislikes || true; $id('themes-toggle').checked = settings.themes || false; $id('translation-toggle').checked = settings.translation || false; $id('reverse-mode-toggle').checked = settings.reverseMode || false; $id('hide-comments-toggle').checked = settings.hideComments || false; $id('hide-sidebar-toggle').checked = settings.hideSidebar || false; $id('autoplay-toggle').checked = settings.disableAutoplay || false; // $id('cinematic-lighting-toggle').checked = settings.cinematicLighting || false; $id('subtitles-toggle').checked = settings.disabl###btitles || false; // $id('font-size-slider').value = settings.fontSize || 16; $id('player-size-slider').value = settings.playerSize || 100; $id('select-video-qualitys-select').value = settings.selectVideoQuality || '720'; $id('menu-bg-color-picker').value = settings.menuBgColor || '#000000'; $id('menu-text-color-picker').value = settings.menuTextColor || '#ffffff'; // $id('menu-font-size-slider').value = settings.menuFontSize || 14; updateSliderValues(); setTimeout(() => { applySettings(); if(settings.dislikes) { videoDislike(); shortDislike(); showDislikes = true; } }, 500); } // Function to update slider values function updateSliderValues() { // $id('font-size-value').textContent = $id('font-size-slider').value; $id('player-size-value').textContent = $id('player-size-slider').value; // $id('menu-font-size-value').textContent = $id('menu-font-size-slider').value; } $id('reset-player-size').addEventListener('click', () => { $id('player-size-slider').value = 100; updateSliderValues(); applySettings(); }); // Function to apply settings function applySettings() { const formulariodescarga = $e('.formulariodescarga'); const formulariodescargaaudio = $e('.formulariodescargaaudio'); if (formulariodescarga != undefined) { formulariodescarga.classList.add('ocultarframe'); formulariodescargaaudio.classList.add('ocultarframe'); } const settings = { theme: $e('input[name="theme"]:checked').value, bgColorPicker: $id('bg-color-picker').value, progressbarColorPicker: $id('progressbar-color-picker').value, primaryColorPicker: $id('primary-color-picker').value, secondaryColorPicker: $id('secondary-color-picker').value, headerColorPicker: $id('header-color-picker').value, iconsColorPicker: $id('icons-color-picker').value, menuColorPicker: $id('menu-color-picker').value, lineColorPicker: $id('line-color-picker').value, timeColorPicker: $id('time-color-picker').value, dislikes: $id('dislikes-toggle').checked, themes: $id('themes-toggle').checked, translation: $id('translation-toggle').checked, reverseMode: $id('reverse-mode-toggle').checked, hideComments: $id('hide-comments-toggle').checked, hideSidebar: $id('hide-sidebar-toggle').checked, disableAutoplay: $id('autoplay-toggle').checked, // cinematicLighting: $id('cinematic-lighting-toggle').checked, disabl###btitles: $id('subtitles-toggle').checked, // fontSize: $id('font-size-slider').value, playerSize: $id('player-size-slider').value, selectVideoQuality: $id('select-video-qualitys-select').value, menuBgColor: $id('menu-bg-color-picker').value, menuTextColor: $id('menu-text-color-picker').value, // menuFontSize: $id('menu-font-size-slider').value, }; renderizarButtons(); function isFullscreen() { return document.fullscreenElement !== null; } document.addEventListener("fullscreenchange", () => { let panel = $e('#toggle-panel'); if (isFullscreen()) { panel.style.opacity = 0; } else { panel.style.opacity = 1; } }); // Hide comments const commentsSection = $id('comments'); if (commentsSection) { commentsSection.style.display = settings.hideComments ? 'none' : 'block'; } // Active inactive Themes const themesMenuSection = $e('.themes-hidden'); if (themesMenuSection) { themesMenuSection.style.display = settings.themes ? 'block' : 'none'; } // Hide sidebar const sidebarSection = $e('#secondary > #secondary-inner'); if (sidebarSection) { sidebarSection.classList.add('side-moi'); const sidebarSection2 = $e('.side-moi'); sidebarSection2.style.display = settings.hideSidebar ? 'none' : 'block'; } // Disable autoplay const autoplayToggle = $e('.ytp-autonav-toggle-button'); if (autoplayToggle) { const isCurrentlyOn = autoplayToggle.getAttribute('aria-checked') === 'true'; if (settings.disableAutoplay && isCurrentlyOn) { autoplayToggle.click(); } else if (!settings.disableAutoplay && !isCurrentlyOn) { autoplayToggle.click(); } } // Disable subtitles const subtitleToggle = $e('.ytp-subtitles-button'); if (subtitleToggle) { const isCurrentlyOn = subtitleToggle.getAttribute('aria-pressed') === 'true'; if (settings.disabl###btitles && isCurrentlyOn) { subtitleToggle.click(); } else if (!settings.disabl###btitles && !isCurrentlyOn) { subtitleToggle.click(); } } // Disable cinematicLighting // const buttonSettingVideo = $e(".ytp-settings-button"); // if(buttonSettingVideo && !settings.cinematicLighting) { // buttonSettingVideo.click(); // setTimeout(() => { // buttonSettingVideo.click(); // },50) // } // Adjust font size // $e('body').style.fontSize = `${settings.fontSize}px`; // Adjust player size const player = $e('video'); if (player) { player.style.transform = `scale(${settings.playerSize / 100})`; } // selected video quality const video = $e('div#movie_player'); let ytPlayerQuality = localStorage.getItem('yt-player-quality'); $e('#select-video-qualitys-select').addEventListener('change', () => { applySettings(); }) if (video != undefined) { if (ytPlayerQuality) { let qualitySettings = JSON.parse(ytPlayerQuality); qualitySettings.data = JSON.stringify({ quality: settings.selectVideoQuality, previousQuality: 240 }); localStorage.setItem('yt-player-quality', JSON.stringify(qualitySettings)); } else { let defaultQualitySettings = { data: JSON.stringify({ quality: 720, previousQuality: 240 }), expiration: Date.now() + (365 * 24 * 60 * 60 * 1000), creation: Date.now() }; localStorage.setItem('yt-player-quality', JSON.stringify(defaultQualitySettings)); } } // Apply menu appearance settings $sp('--yt-enhance-menu-bg', settings.menuBgColor); $sp('--yt-enhance-menu-text', settings.menuTextColor); // $sp('--yt-enhance-menu-font-size', `${settings.menuFontSize}px`); // Apply theme const selectedTheme = themes[settings.theme]; const isThemeCustom = $e(`input[name="theme"][value="custom"]`).checked; const isThemeNormal = $e(`input[name="theme"][value="normal"]`).checked; const themeCustomOptions = $e('.theme-custom-options'); const themeNormal = $e('.theme-selected-normal'); if(isThemeCustom != undefined) { themeNormal.style.display = "block" themeCustomOptions.style.display = "block"; $e('.themes-options').style.display = "none"; } if(isThemeNormal) { $e(`input[name="theme"][value="custom"]`).checked = false; } function checkDarkMode() { if(settings.themes) { if (isDarkMode && !isThemeCustom) { // Apply theme $e('.themes-options').style.display = "block"; themeNormal.style.display = "none"; themeCustomOptions.style.display = "none"; if(settings.theme === 'normal') { $e(`input[name="theme"][value="0"]`).checked = true; // applySettings(); } else { $sp('--yt-spec-base-background', selectedTheme.gradient); $sp('--yt-spec-text-primary', selectedTheme.textColor); $sp('--yt-spec-text-secondary', selectedTheme.textColor); $sp('--yt-spec-menu-background', selectedTheme.gradient); $sp('--yt-spec-icon-inactive', selectedTheme.textColor); $sp('--yt-spec-brand-icon-inactive', selectedTheme.textColor); $sp('--yt-spec-brand-icon-active', selectedTheme.gradient); $sp('--yt-spec-static-brand-red', selectedTheme.gradient); // line current time $sp('--yt-spec-raised-background', selectedTheme.raised); $sp('--yt-spec-static-brand-red', selectedTheme.CurrentProgressVideo); $sp('--yt-spec-static-brand-white', selectedTheme.textColor); $sp('--ytd-searchbox-background', selectedTheme.gradient); $sp('--ytd-searchbox-text-color', selectedTheme.textColor); $sp('--ytcp-text-primary', settings.textColor); GM_addStyle(` .botones_div { background-color: transparent; border: none; color: #999999; user-select: none; } .ytp-menuitem[aria-checked=true] .ytp-menuitem-toggle-checkbox { background: ${selectedTheme.gradient} !important; } #background.ytd-masthead { background: ${selectedTheme.gradient} !important; } .ytp-swatch-background-color { background: ${ selectedTheme.gradient } !important; } #shorts-container, #page-manager.ytd-app { background: ${selectedTheme.gradient.replace(/(#[0-9a-fA-F]{6})/g, `$1${36}`)}; } ytd-engagement-panel-title-header-renderer[shorts-panel] #header.ytd-engagement-panel-title-header-renderer { background: ${selectedTheme.gradient} !important;} .buttons-tranlate { background: ${selectedTheme.btnTranslate} !important; } .badge-shape-wiz--thumbnail-default { color: ${selectedTheme.videoDuration} !important; background: ${selectedTheme.gradient} !important; } #logo-icon { color: ${selectedTheme.textLogo} !important; } .yt-spec-button-shape-next--overlay.yt-spec-button-shape-next--text { color: ${selectedTheme.iconsColor} !important; } .ytd-topbar-menu-button-renderer #button.ytd-topbar-menu-button-renderer { color: ${selectedTheme.iconsColor} !important; } .yt-spec-icon-badge-shape--style-overlay .yt-spec-icon-badge-shape__icon { color: ${selectedTheme.iconsColor} !important; } .ytp-svg-fill { fill: ${selectedTheme.iconsColor} !important; } #ytp-id-30,#ytp-id-17,#ytp-id-19,#ytp-id-20{ fill: ${selectedTheme.iconsColor} !important; } `); } } else { $sp('--yt-spec-base-background', settings.bgColorPicker); $sp('--yt-spec-text-primary', settings.primaryColorPicker); $sp('--yt-spec-text-secondary', settings.secondaryColorPicker); $sp('--yt-spec-menu-background', settings.menuColorPicker); $sp('--yt-spec-icon-inactive', settings.iconsColorPicker); $sp('--yt-spec-brand-icon-inactive', settings.primaryColorPicker); $sp('--yt-spec-brand-icon-active', settings.primaryColorPicker); $sp('--yt-spec-raised-background', settings.headerColorPicker); $sp('--yt-spec-static-brand-red', settings.lineColorPicker); $sp('--yt-spec-static-brand-white', settings.timeColorPicker); $sp('--ytd-searchbox-background', settings.primaryColorPicker); $sp('--ytd-searchbox-text-color', settings.secondaryColorPicker); $sp('--ytcp-text-primary', settings.primaryColorPicker); GM_addStyle(` .html5-video-player { color: ${settings.primaryColorPicker} !important; } .ytp-volume-slider-handle:before, .ytp-volume-slider-handle, .ytp-tooltip.ytp-preview:not(.ytp-text-detail) { background-color: ${settings.iconsColorPicker} !important; } .ytp-autonav-toggle-button[aria-checked=true] { background-color: ${settings.iconsColorPicker} !important; } .tp-yt-iron-icon { fill: ${settings.iconsColorPicker} !important; } #columns.style-scope.ytd-watch-flexy { flex-direction: ${settings.reverseMode ? 'row-reverse' : 'row'} !important; } .botones_div { background-color: transparent; border: none; color: ${settings.iconsColorPicker} !important; user-select: none; } .ytp-volume-slider-handle:before, .ytp-volume-slider-handle, .ytp-tooltip.ytp-preview:not(.ytp-text-detail){ background-color: } #container.ytd-searchbox { color: red !important; } .ytp-menuitem[aria-checked=true] .ytp-menuitem-toggle-checkbox { background: ${settings.primaryColorPicker} !important; } .yt-spec-icon-shape { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; color: ${settings.iconsColorPicker} !important; } .ytp-time-current, .ytp-time-separator, .ytp-time-duration { color: ${settings.iconsColorPicker} !important; } #background.ytd-masthead { background: ${settings.headerColorPicker} !important; } .ytp-swatch-background-color { background: ${ settings.progressbarColorPicker } !important; } #shorts-container, #page-manager.ytd-app { background: ${settings.bgColorPicker}36; } ytd-engagement-panel-title-header-renderer[shorts-panel] #header.ytd-engagement-panel-title-header-renderer { background: ${settings.bgColorPicker} !important;} .badge-shape-wiz--thumbnail-default { color: ${settings.timeColorPicker} !important; background: ${settings.secondaryColor} !important; } #logo-icon { color: ${settings.primaryColorPicker} !important; } .yt-spec-button-shape-next--overlay.yt-spec-button-shape-next--text { color: ${settings.iconsColorPicker} !important; } .ytd-topbar-menu-button-renderer #button.ytd-topbar-menu-button-renderer { color: ${settings.iconsColorPicker} !important; } .yt-spec-icon-badge-shape--style-overlay .yt-spec-icon-badge-shape__icon { color: ${settings.iconsColorPicker} !important; } .ytp-svg-fill { fill: ${settings.iconsColorPicker} !important; } #ytp-id-30,#ytp-id-17,#ytp-id-19,#ytp-id-20{ fill: ${settings.iconsColorPicker} !important; } `); } } else { GM_addStyle(` .botones_div { background-color: transparent; border: none; color: #ccc !important; user-select: none; } `) } } checkDarkMode(); let currentUrl = window.location.href; let urlCheckInterval = setInterval(function () { if (window.location.href !== currentUrl) { currentUrl = window.location.href; checkUrlChange(); } }, 1000); function checkUrlChange() { setTimeout(() => { applySettings(); }, 1000); clearInterval(urlCheckInterval); } let traducido; // Texto traducido let urlLista; // Url lista async function traductor() { const texto = $m('#content-text'); let o = `?client=dict-chrome-ex&sl=auto&tl=${navigator.language}&q=`; for (let i = 0; i < texto.length; i++) { const botonTraducir = $cl('BUTTON'); botonTraducir.classList.add('buttons-tranlate'); botonTraducir.textContent = 'Translate'; botonTraducir.setAttribute('id', `btn${i}`); texto[i].insertAdjacentElement('afterend', botonTraducir); const mdcm = $m(`.buttons-tranlate`); 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'; }); }; } } // clean buttoms dom function limpiarHTML(element) { const buttons = $m(`${element}`); [].forEach.call(buttons, function (buttons) { buttons.remove(); }); traductor(); } window.onscroll = () => { const divEl = $e('#content-text'); const divEl2 = $e( 'ytd-item-section-renderer[static-comments-header] #contents' ); if(settings.translation) { if (divEl != undefined || divEl2 != undefined) { limpiarHTML('.buttons-tranlate'); } } }; const targetNode = $e('body'); if (targetNode != undefined) { const element = $e('ytd-item-section-renderer[static-comments-header] #contents'); if(element != undefined) { const observerElementDom = (elem) => { const observer = new IntersectionObserver(entries => { if(entries[0].isIntersecting) { element.style.background = `${selectedTheme.gradient ?? ''}`; } else {return} }) return observer.observe($e(`${elem}`)) } observerElementDom('ytd-item-section-renderer[static-comments-header] #contents') } } saveSettings(); } let validoBotones = true; function renderizarButtons() { const addButton = $e('.style-scope .ytd-watch-metadata'); const addButton2 = $e('#contents'); if (addButton != undefined && validoBotones) { validoBotones = false; const isVisible = !!( addButton.offsetWidth || addButton.offsetHeight || addButton.getClientRects().length ); if (isVisible) { addButton.insertAdjacentHTML("beforebegin", menuBotones); } else if (addButton2 != undefined) { addButton.insertAdjacentHTML("beforebegin", menuBotones); } } // Formulario de botones para descargar const formulariodescarga = $e( '.formulariodescarga' ); const formulariodescargaaudio = $e( '.formulariodescargaaudio' ); const framedescarga = $e('#descargando'); const framedescargamp3 = $e('#descargandomp3'); if (formulariodescarga && formulariodescargaaudio) { formulariodescarga.addEventListener('click', (e) => { e.preventDefault(); }); formulariodescargaaudio.addEventListener('click', (e) => { e.preventDefault(); }); } const btn1mp4 = $e('.btn1'); const btn2mp3 = $e('.btn2'); const btn3cancel = $e('.btn3'); const selectcalidades = $e('.selectcalidades'); const selectcalidadesaudio = $e( '.selectcalidadesaudio' ); if(selectcalidades != undefined) { 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'); }); } if(selectcalidadesaudio != undefined) { 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'); }); } if (btn3cancel != undefined) { btn3cancel.onclick = () => { formulariodescarga.style.display = 'none'; formulariodescargaaudio.style.display = 'none'; }; } if (btn1mp4 != undefined) { 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(); }; } if (btn2mp3 != undefined) { 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(); }; } // Invertir contenido // const background_image = $e('#background_image'); // const color_bg = $e('#color_bg'); // const alertShown = localStorage.getItem('alertShown'); // const alertShownBg = localStorage.getItem('alertShownBg'); // if (!alertShown) { // color_bg.addEventListener('change', () => { // alert('disable cinematic mode in the video'); // localStorage.setItem('alertShown', true); // }); // } // if (!alertShownBg) { // background_image.addEventListener('input', () => { // alert('disable cinematic mode in the video'); // localStorage.setItem('alertShownBg', true); // }); // } const btnImagen = $e('#imagen'); const formularioButtons = $e('#eyes'); function initClickEvent() { const bufferVideo = $e('.buffer_video'); if (!bufferVideo) { console.log("Botón no encontrado, esperando..."); return; } // Evita duplicar el evento if (!bufferVideo.dataset.listenerAdded) { bufferVideo.addEventListener("click", () => { const video = document.querySelector("video"); if (!video) { console.log("No se encontró el video en la página."); return; } // Simular clic derecho const event = new MouseEvent("contextmenu", { bubbles: true, cancelable: true }); video.dispatchEvent(event); setTimeout(() => { const option = document.querySelector("body > div.ytp-popup.ytp-contextmenu > div > div > div:nth-child(7)"); if (option) { option.click(); } else { console.log("Opción no encontrada, intenta aumentar el tiempo de espera."); } }, 1000); }); bufferVideo.dataset.listenerAdded = "true"; console.log("Evento registrado con éxito."); } } setInterval(initClickEvent, 2000); // valido modo oscuro y venta de video // Repeat video button let countRepeat = 0; // count const repeat = $e('#repeatvideo'); // Repeat button const imarepeat = $e('.icon-tabler-repeat'); // img repeat const videoFull = $e( '#movie_player > div.html5-video-container > video' ); if(repeat != undefined) { repeat.onclick = () => { if ( $e('#cinematics > div') != undefined || videoFull != undefined ) { countRepeat += 1; setInterval(() => { switch (countRepeat) { case 1: document .querySelector( '#movie_player > div.html5-video-container > video' ) .setAttribute('loop', 'true'); imarepeat.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-repeat-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M4 12v-3c0 -1.336 .873 -2.468 2.08 -2.856m3.92 -.144h10m-3 -3l3 3l-3 3"></path> <path d="M20 12v3a3 3 0 0 1 -.133 .886m-1.99 1.984a3 3 0 0 1 -.877 .13h-13m3 3l-3 -3l3 -3"></path> <path d="M3 3l18 18"></path> </svg> `; // img repeat break; case 2: countRepeat = 0; document .querySelector( '#movie_player > div.html5-video-container > video' ) .removeAttribute('loop'); imarepeat.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-repeat" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M4 12v-3a3 3 0 0 1 3 -3h13m-3 -3l3 3l-3 3"></path> <path d="M20 12v3a3 3 0 0 1 -3 3h-13m3 3l-3 -3l3 -3"></path> </svg>`; break; } }, 1000); } } } // Background transparent const cinematica = $e('#cinematics > div'); if (cinematica != undefined) { cinematica.style = 'position: fixed; inset: 0px; pointer-events: none; transform: scale(1.5, 2)'; } const btnReset = $e('#reset_button'); // Reset button if (btnReset != undefined) { btnReset.addEventListener('click', function () { if (localStorage.getItem('colores') != null) { localStorage.removeItem('colores'); $e('#ojosprotect').style.backgroundColor = 'transparent'; setTimeout(() => { location.reload(); }, 400); } }); } if (btnImagen != undefined) { btnImagen.onclick = () => { if ( $e('#cinematics > div') != undefined || videoFull != undefined ) { const parametrosURL = new URLSearchParams(window.location.search); let enlace = parametrosURL.get('v'); // Construir la URL de la imagen const imageUrl = `https://i.ytimg.com/vi/${enlace}/maxresdefault.jpg`; // Realizar la solicitud para obtener la imagen fetch(imageUrl) .then((response) => { if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } return response.blob(); }) .then((blob) => { // Obtener el tamaño de la imagen en kilobytes const imageSizeKB = blob.size / ####; // Verificar si el tamaño de la imagen es menor o igual a 20 KB if (imageSizeKB >= 20) { 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' ); // Crear una URL para la imagen const imageUrlObject = URL.createObjectURL(blob); // Crear un enlace para descargar la imagen const enlaceDescarga = $cl('a'); enlaceDescarga.href = imageUrlObject; const titleVideo = $e( 'h1.style-scope.ytd-watch-metadata' ).innerText; enlaceDescarga.download = `${titleVideo}_maxresdefault.jpg`; // Simular un clic en el enlace para iniciar la descarga enlaceDescarga.click(); // Limpiar la URL del objeto después de la descarga URL.revokeObjectURL(imageUrlObject); } else { console.log( 'La imagen no excede los 20 KB. No se descargará.' ); } }) .catch((error) => { alert('No found image'); console.error('Error al obtener la imagen:', error); }); } }; } // for background image file photo higt quality // const fileInput = document.getElementById('background_image'); // const backgroundDiv = $e('ytd-app'); // const storedImage = localStorage.getItem('backgroundImage'); // if (storedImage) { // backgroundDiv.style = `background-size: contain; background-repeat: repeat; background-image: url(${storedImage}) !important`; // } // fileInput.addEventListener('change', (event) => { // const file = event.target.files[0]; // if (file) { // const reader = new FileReader(); // reader.onload = function (e) { // const imageUrl = e.target.r###lt; // localStorage.setItem('backgroundImage', imageUrl); // backgroundDiv.style.backgroundImage = `url(${imageUrl})`; // }; // reader.readAsDataURL(file); // } // }); const externalLink = $e('.external_link'); if (externalLink != undefined) { externalLink.onclick = () => { const parametrosURL = new URLSearchParams(window.location.search); // Url parametros let enlace; enlace = parametrosURL.get('v'); window.open( `https://www.y2mate.com/es/convert-youtube/${enlace}`, 'popUpWindow', 'height=800,width=1000,left=50%,top=100,resizable=no,scrollbars=yes,toolbar=no,menubar=yes,location=no,directories=yes, status=no' ); }; } const viewExternalLink = $e('.view_external_link'); if (viewExternalLink != undefined) { viewExternalLink.onclick = () => { $e('video').click(); const parametrosURL = new URLSearchParams(window.location.search); // Url parametros let enlace; enlace = parametrosURL.get('v'); window.open( `https://www.youtube.com/embed/${enlace}?rel=0&controls=2&color=white&iv_load_policy=3&showinfo=0&modestbranding=1&autoplay=1` ); }; } const viewPictureToPicture = $e( '.video_picture_to_picture' ); if (viewPictureToPicture != undefined) { viewPictureToPicture.onclick = () => { const video = $e('video'); // Verifica si el navegador admite Picture-in-Picture if ('pictureInPictureEnabled' in document) { // Verifica si el video aún no está en modo Picture-in-Picture if (!document.pictureInPictureElement) { // Intenta activar el modo Picture-in-Picture video .requestPictureInPicture() .then(() => { // El video está ahora en modo Picture-in-Picture }) .catch((error) => { console.error( 'Error al activar el modo Picture-in-Picture:', error ); }); } else { // video picture } } else { alert('Picture-in-Picture not supported'); } }; // Filtro de pantalla if (formularioButtons != undefined) { formularioButtons.addEventListener('input', function () { if ( $e('#cinematics > div') != undefined || videoFull != undefined ) { $e('#ojosprotect').style.backgroundColor = formularioButtons.value; } }); } clearInterval(renderizarButtons); } const checked_updates = $e('.checked_updates'); if (checked_updates != undefined) { checked_updates.onclick = () => { window.open( `https://update.greasyfork.org/scripts/460680/Youtube%20Tools%20All%20in%20one%20local%20download%20mp3%20mp4%20HIGT%20QUALITY%20return%20dislikes%20and%20more.user.js` ); }; } const screenShotVideo = $e('.screenshot_video'); if (screenShotVideo != undefined) { screenShotVideo.onclick = () => { const video = $e('video'); const canvas = $cl('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; const context = canvas.getContext('2d'); context.drawImage(video, 0, 0, canvas.width, canvas.height); const imagenURL = canvas.toDataURL('image/png'); const enlaceDescarga = $cl('a'); enlaceDescarga.href = imagenURL; const titleVideo = $e( 'h1.style-scope.ytd-watch-metadata' ).innerText; enlaceDescarga.download = `${video.currentTime.toFixed( 0 )}s_${titleVideo}.png`; enlaceDescarga.click(); }; } else { const containerButtons = $e('.containerButtons'); if (containerButtons != undefined) { containerButtons.innerHTML = ''; } } clearInterval(renderizarButtons); } console.log('Scrip en ejecución by: DeveloperMDCM MDCM'); const HEADER_STYLE = 'color: #F00; font-size: 24px; font-family: sans-serif;'; const MESSAGE_STYLE = 'color: #00aaff; font-size: 16px; font-family: sans-serif;'; const CODE_STYLE = 'font-size: 14px; font-family: monospace;'; console.log( '%cYoutube Tools Extension NEW UI\n' + '%cRun %c(v2.3.2)\n' + 'By: DeveloperMDCM.', HEADER_STYLE, CODE_STYLE, MESSAGE_STYLE ); // Add event listeners to all inputs const inputs = $m('input'); inputs.forEach((input) => { input.addEventListener('change', applySettings); if (input.type === 'range') { input.addEventListener('change', () => { updateSliderValues(); applySettings(); }); } }); // Export configuration // Settings saved // const settings = GM_getValue('ytSettingsMDCM', '{}'); // $id('config-data').value = settings; $id('export-config').addEventListener('click', () => { const settings = GM_getValue('ytSettingsMDCM', '{}'); $id('config-data').value = settings; const configData = settings; try { JSON.parse(configData); // Validate JSON GM_setValue('ytSettingsMDCM', configData); alert('Configuration export successfully!'); } catch (e) { alert('Invalid configuration data. Please check and try again.'); } }); // Import configuration $id('import-config').addEventListener('click', () => { const configData = $id('config-data').value; try { JSON.parse(configData); // Validate JSON GM_setValue('ytSettingsMDCM', configData); alert('Configuration imported successfully!'); window.location.reload(); } catch (e) { alert('Invalid configuration data. Please check and try again.'); } }); panel.style.display = 'none'; // Ensure panel is hidden on load // Load saved settings // Visible element DOM function checkElement(selector, callback) { const interval = setInterval(() => { if ($e(selector)) { clearInterval(interval); callback(); } }, 100); } checkElement('ytd-topbar-menu-button-renderer', loadSettings); })();