YouTube Lite (更佳體驗)

使YouTube介面更加動態,隱藏包含關鍵字的影片,新增下載按鈕,並在無廣告頁面(嵌入youtube-nocookie)中開啟影片。

目前為 2023-10-30 提交的版本,檢視 最新版本

// ==UserScript==
// @name       YouTube Lite (melhor experiência)
// @name:pt       YouTube Lite (melhor experiência)
// @name:pt-PT       YouTube Lite (melhor experiência)
// @name:pt-BR       YouTube Lite (melhor experiência)
// @name:es       YouTube Lite (la mejor experiencia)
// @name:en       YouTube Lite (best experience)
// @name:fr       YouTube Lite (meilleure expérience)
// @name:ru       YouTube Lite (лучший опыт)
// @name:ja       YouTube Lite (最高のエクスペリエンス)
// @name:ko       YouTube Lite (최고의 경험)
// @name:zh-TW       YouTube Lite (更佳體驗)
// @name:zh-CN       YouTube Lite (更好的体验)
// @name:id       YouTube Lite (pengalaman terbaik)
// @name:ug       YouTube Lite (ئەڭ ياخشى تەجرىبە)
// @name:ar       YouTube Lite (أفضل تجربة)
// @name:he       YouTube Lite (חוויית השימוש הטובה ביותר)
// @name:hi       YouTube Lite (सर्वश्रेष्ठ अनुभव)
// @name:th       YouTube Lite (ประสบการณ์ที่ดีที่สุด)
// @name:bg       YouTube Lite (най-добър опит)
// @name:ro       YouTube Lite (cea mai bună experiență)
// @name:fi       YouTube Lite (paras kokemus)
// @name:it       YouTube Lite (migliore esperienza)
// @name:el       YouTube Lite (καλύτερη εμπειρία)
// @name:eo       YouTube Lite (plej bona sperto)
// @name:hu       YouTube Lite (legjobb élmény)
// @name:nb       YouTube Lite (beste opplevelse)
// @name:sk       YouTube Lite (najlepšia skúsenosť)
// @name:sv       YouTube Lite (bästa upplevelsen)
// @name:sr       YouTube Lite (најбоље искуство)
// @name:pl       YouTube Lite (najlepsze doświadczenie)
// @name:nl       YouTube Lite (beste ervaring)
// @name:de       YouTube Lite (beste Erfahrung)
// @name:da       YouTube Lite (bedste oplevelse)
// @name:cs       YouTube Lite (nejlepší zkušenost)
// @name:uk       YouTube Lite (найкращий досвід)
// @name:tr       YouTube Lite (en iyi deneyim)
// @name:vi       YouTube Lite (trải nghiệm tốt nhất)
// @name:fr-CA       YouTube Lite (meilleure expérience au Canada)

// @namespace    http://linkme.bio/jhonpergon/?userscript=youtube_lite
// @version      2.3
// @author       Jhon Pérgon
// @license      MIT

// @description       Deixa a interface do YouTube mais leve, oculta vídeos com palavras-chaves, adiciona botão de download e abre o vídeo em uma página livre de anúncios (embed youtube-nocookie).
// @description:pt       Deixa a interface do YouTube mais leve, oculta vídeos com palavras-chaves, adiciona botão de download e abre o vídeo em uma página livre de anúncios (embed youtube-nocookie).
// @description:pt-PT       Deixa a interface do YouTube mais leve, oculta vídeos com palavras-chaves, adiciona botão de download e abre o vídeo em uma página livre de anúncios (embed youtube-nocookie).
// @description:pt-BR       Deixa a interface do YouTube mais leve, oculta vídeos com palavras-chaves, adiciona botão de download e abre o vídeo em uma página livre de anúncios (embed youtube-nocookie).
// @description:es      Hace que la interfaz de YouTube sea más dinámica, oculta videos con palabras clave, agrega un botón de descarga y abre el video en una página sin publicidad (embed youtube-nocookie).
// @description:en      Makes the YouTube interface lighter, hides videos with keywords, adds a download button and opens the video on an ad-free page (embed youtube-nocookie).
// @description:fr      Il rend l'interface YouTube plus dynamique, masque les vidéos avec des mots-clés, ajoute un bouton de téléchargement et ouvre la vidéo sur une page sans publicité (embed youtube-nocookie).
// @description:ru      Он делает интерфейс YouTube более динамичным, скрывает видео с ключевыми словами, добавляет кнопку загрузки и открывает видео на странице без рекламы (встроить youtube-nocookie).
// @description:ja      YouTube インターフェースをより動的にし、キーワードを含むビデオを非表示にし、ダウンロード ボタンを追加して、広告なしのページ (youtube-nocookie embed) でビデオを開きます。
// @description:ko      YouTube 인터페이스를 더욱 동적으로 만들고, 키워드로 동영상을 숨기고, 다운로드 버튼을 추가하고, 광고 없는 페이지에서 동영상을 엽니다(youtube-nocookie embed).
// @description:zh-TW      使YouTube介面更加動態,隱藏包含關鍵字的影片,新增下載按鈕,並在無廣告頁面(嵌入youtube-nocookie)中開啟影片。
// @description:zh-CN      使YouTube界面更加动态,隐藏包含关键词的视频,添加下载按钮并在无广告页面(嵌入youtube-nocookie)中打开视频。
// @description:id      Membuat antarmuka YouTube lebih ringan, menyembunyikan video dengan kata kunci, menambahkan tombol unduh, dan membuka video di halaman tanpa iklan (sematkan youtube-nocookie).
// @description:ug      يوتۇب يېڭىلاندۇرغۇچى كىرىشتىمىنى ياقسى قىلىدۇ، ئاڭلىق سۆزلىك ۋىدېئولارنى يوپۇش قىلىدۇ، چۈشۈرمە تومبۇلى قوشىدۇ ۋە چىراق ئېكراندا (youtube-nocookie sematka qilish) ۋىدېئونى ئېچىدۇ.
// @description:ar      يجعل واجهة يوتيوب أخف وزنًا، يخفي مقاطع الفيديو بكلمات مفتاحية، يضيف زر تنزيل ويفتح الفيديو على صفحة خالية من الإعلانات (تضمين youtube-nocookie).
// @description:he      הופך את ממשק YouTube לקל יותר, מסתיר סרטונים עם מילות מפתח, מוסיף לחצן הורדה ופותח את הסרטון על דף נטול פרסומות (הטמעת youtube-nocookie).
// @description:hi      यूट्यूब इंटरफ़ेस को हल्का बनाता है, कीवर्ड के साथ वीडियो को छुपाता है, डाउनलोड बटन जोड़ता है और एड-मुक्त पृष्ठ पर वीडियो खोलता है (youtube-nocookie embed)।
// @description:th      ทำให้อินเตอร์เฟซ YouTube เบาขึ้น, ซ่อนวิดีโอด้วยคำสำคัญ, เพิ่มปุ่มดาวน์โหลด และเปิดวิดีโอบนหน้าไม่มีโฆษณา (ฝัง youtube-nocookie) ให้ดู
// @description:bg      Прави интерфейса на YouTube по-лек, скрива видеоклипове с ключови думи, добавя бутон за изтегляне и отваря видеоклипа на страница без реклами (вграждане на youtube-nocookie).
// @description:ro      Face interfața YouTube mai ușoară, ascunde videoclipurile cu cuvinte cheie, adaugă un buton de descărcare și deschide videoclipul pe o pagină fără reclame (încorporare youtube-nocookie).
// @description:fi      Tekee YouTube-liittymästä kevyemmän, piilottaa avainsanalla varustetut videot, lisää latauspainikkeen ja avaa videon mainoksettomalle sivulle (upottaa youtube-nocookie).
// @description:it      Rende l'interfaccia di YouTube più leggera, nasconde i video con parole chiave, aggiunge un pulsante di download e apre il video su una pagina senza pubblicità (embed youtube-nocookie).
// @description:el      Καθιστά τη διεπαφή του YouTube πιο ελαφριά, αποκρύπτει τα βίντεο με λέξεις-κλειδιά, προσθέτει ένα κουμπί λήψης και ανοίγει το βίντεο σε μια σελίδα χωρίς διαφημίσεις (ενσωμάτωση youtube-nocookie).
// @description:eo      Faras la interfaco de YouTube pli malpeza, kaŝas videojn kun ŝlosilvortoj, aldonas elŝut-butonon kaj malfermas la videon en senanonca paĝo (enteni youtube-nocookie).
// @description:hu      Könnyebbé teszi a YouTube felületét, kulcsszavakkal elrejti a videókat, hozzáad egy letöltés gombot, és az videót hirdetések nélküli oldalon nyitja meg (beágyazott youtube-nocookie).
// @description:nb      Gjør YouTube-grensesnittet lettere, skjuler videoer med søkeord, legger til en nedlastingsknapp og åpner videoen på en annonsefri side (innbygg youtube-nocookie).
// @description:sk      Robí rozhranie YouTube ľahším, skrýva videá s kľúčovými slovami, pridáva tlačidlo na stiahnutie a otvára video na stránke bez reklám (vložiť youtube-nocookie).
// @description:sv      Gör YouTube-gränssnittet lättare, gömmer videor med nyckelord, lägger till en nedladdningsknapp och öppnar videon på en annonsfri sida (bädda in youtube).
// @description:sr      Прави интерфејс YouTube-а лакшим, сакрива видее са кључним речима, додаје дугме за преузимање и отвара видео на страници без реклама (уградња youtube-nocookie).
// @description:pl      Uczy interfejs YouTube'a lżejszym, ukrywa filmy z słowami kluczowymi, dodaje przycisk do pobierania i otwiera film na stronie bez reklam (osadzanie youtube-nocookie).
// @description:nl      Maakt de YouTube-interface lichter, verbergt video's met trefwoorden, voegt een downloadknop toe en opent de video op een advertentievrije pagina (insluiten youtube-nocookie).
// @description:de      Macht die YouTube-Benutzeroberfläche leichter, versteckt Videos mit Schlüsselwörtern, fügt einen Download-Button hinzu und öffnet das Video auf einer werbefreien Seite (einbetten youtube-nocookie).
// @description:da      Gør YouTube-grænsefladen lettere, skjuler videoer med søgeord, tilføjer en downloadknap og åbner videoen på en reklamefri side (indlejre youtube-nocookie).
// @description:cs      Dělá YouTube rozhraní lehčí, skrývá videa s klíčovými slovy, přidává tlačítko ke stažení a otevírá video na stránce bez reklam (vložit youtube-nocookie).
// @description:uk      Робить інтерфейс YouTube легшим, приховує відео з ключовими словами, додає кнопку завантаження та відкриває відео на сторінці без реклами (вбудовувати youtube-nocookie).
// @description:tr      YouTube arayüzünü daha hafif hale getirir, anahtar kelimelerle videoları gizler, indirme düğmesi ekler ve videoyu reklamsız bir sayfada açar (yerleştirme youtube-nocookie).
// @description:vi      Làm cho giao diện YouTube nhẹ hơn, ẩn đi các video có từ khóa, thêm nút tải xuống và mở video trên trang không có quảng cáo (nhúng youtube-nocookie).
// @description:fr-CA      Rend l'interface YouTube plus légère, masque les vidéos avec des mots-clés, ajoute un bouton de téléchargement et ouvre la vidéo sur une page sans publicité (intégrer youtube-nocookie au Canada).

// @match           https://www.youtube.com/*
// @match           https://m.youtube.com/*
// @match           https://music.youtube.com/*
// @match           https://youtu.be/*
// @match           https://www.youtube-nocookie.com/*
// @icon         https://icons.iconarchive.com/icons/designbolts/cute-social-media/256/Youtube-icon.png

// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue
// @license      MIT
// @run-at      document-start

// @compatible      chrome
// @compatible      firefox
// @compatible      opera
// @compatible      edge
// @compatible      safari
// @compatible      berrybrowser
// ==/UserScript==


(function() {
    'use strict';

    let sessao = 1;
    let videoId = getVideoIdFromUrl();

    // Lista de URLs de API conhecidas para capturar o IP
    const blockedApiUrls = [
        'https://api.ipify.org',
        'https://api.ipify.org?format=json',
        'https://ipinfo.io',
        'https://ipinfo.io/ip',
        'https://ipinfo.io/api',
        'https://api.ipapi.com',
        'https://www.iplocation.net',
        'https://api.iplocation.net',
        'https://website-cdn.ipinfo.io',
        'https://p.typekit.net',
        'https://use.typekit.net',
        'https://pagead2.googlesyndication.com',
        'https://www.gstatic.com',
        '/ip',
        '/ajax',
        '/ads',
        '/static',
        '/js',
        '/script',
        '/scripts',
        '/event',
        '/events',
        'https://accounts.youtube.com',
        'https://www.google.com',
        'https://www.google.com.br',
        '/api/session',
        'https://youtube.com',
        'https://www.youtube.com',
        'https://m.youtube.com',
        'https://play.google.com',
        '//googleads.g.doubleclick.net',
        'https://rr',
        '/youtubei',
        'https://yt3.ggpht.com',
        'https://i.ytimg.com',
        'https://rr5---sn-o097znze.googlevideo.com',
        'https://rr4---sn-5ufvuxaxxpgxap-hj1e.googlevideo.com',
        'https://jnn-pa.googleapis.com',
        'https://yt3.ggpht.com/',
        '/player',
        '/a',
        '/b',
        '/c',
        '/d',
        '/e',
        '/f',
        '/g',
        '/i',
        '/j',
        '/k',
        '/l',
        '/m',
        '/n',
        '/o',
        '/p',
        '/q',
        '/r',
        '/s',
        '/t',
        '/u',
        '/v',
        '/w',
        '/x',
        '/y',
        '/z',
        // Adicione mais URLs de API que deseja bloquear, se necessário
    ];


    // Intercepta as solicitações AJAX feitas pelo website
    var verifyc1 = false;
  if(window.location.href.includes("youtube.com")){
    const open = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function(method, url) {
        // Verifica se a URL da solicitação corresponde a uma URL de API bloqueada
        //console.log('====>>', url);
        if (blockedApiUrls.some(apiUrl => url.startsWith(apiUrl))) {
            verifyc1 = true;
            //console.log(`Solicitação de API bloqueada: ${url}`);
            limparCookies();
            addLinks();
            return; // Interrompe a execução da solicitação
        }
        // Continua com a execução normal da solicitação
        open.apply(this, arguments);
    };
  }



  let bloquearFetch = true;
  var verifyc2 = false;

  function interceptarFetch(url, options) {
      //console.log('---->>', url);
    if (bloquearFetch && correspondeAUrlBloqueada(url)) {
      //console.log('Solicitação fetch bloqueada:', url);
      limparCookies();
      addLinks();
      verifyc2 = true;
      return Promise.resolve({ status: 200, body: 'A solicitação foi bloqueada.' });
    } else {
      return window.originalFetch.call(this, url, options);
    }
  }

  function correspondeAUrlBloqueada(url) {
    for (const urlBloqueada of blockedApiUrls) {
      if (url.startsWith(urlBloqueada)) {
        return true;
      }
    }
    return false;
  }

  // Substituir a função fetch globalmente
  if(window.location.href.includes("youtube.com")){
    window.originalFetch = window.fetch;
    window.fetch = interceptarFetch;
  }

  // Aguarde o evento de carregamento total da página
  window.addEventListener('load', function() {
    // Após o carregamento total da página, permitir todas as solicitações fetch
    bloquearFetch = false;
  });



  function getUrl(xxx) {
    try {
      if (typeof xxx !== 'string') {
        throw new Error('Input is not a string');
      }
      const url = new URL(xxx);
      const vParam = url.searchParams.get('v');

      if (vParam) {
        return vParam;
      }
    } catch (error) {
      console.error('ERROR "v":', error);
    }
    return null;
  }







  GM_addStyle('@import url("https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css");');



// Função para extrair o ID do vídeo da URL
function getVideoIdFromUrl() {
    const url = window.location.href;
    const match = url.match(/[?&]v=([^&]+)/);
    if (match && match[1]) {
        return match[1];
    }
    return null;
}





  // Recupere o texto salvo no armazenamento local
  var palavrasSalvas = GM_getValue('keyWords', '')

  function stringParaArray(xpalavrasChave) {
    const arrayDePalavras = xpalavrasChave.split(',');
    const palavrasLimparEspacos = arrayDePalavras
      .map(palavra => palavra.trim())
      .filter(palavra => palavra !== '');
    return palavrasLimparEspacos;
  }

  const palavrasChaveString = palavrasSalvas;
  const palavrasChave = stringParaArray(palavrasChaveString);;

  console.log(palavrasChave);

  function converterParaArray() {
      // Obtém o valor da textarea
      const listaTexto = document.getElementById('listaDeTermos').value;

      // Divide o texto em termos separados por vírgulas
      const termosArray = listaTexto.split(',');

      // Remove espaços em branco em excesso em cada termo
      const termosLimpos = termosArray.map(termo => termo.trim());

      // Exibe o resultado na página
      const resultado = document.getElementById('resultado');
      resultado.textContent = JSON.stringify(termosLimpos);
  }

  // Função para verificar se uma palavra-chave está presente em um elemento
  function verificaPalavrasChave(elemento) {
    var texto = elemento.textContent.toLowerCase();
    for (var i = 0; i < palavrasChave.length; i++) {
      var palavra = palavrasChave[i].toLowerCase();
      if (texto.includes(palavra)) {
        return true;
      }
    }
    return false;
  }


function getUrl(xxx) {
  try {
    if (typeof xxx !== 'string') {
      throw new Error('Input is not a string');
    }
    const url = new URL(xxx);
    const vParam = url.searchParams.get('v');

    if (vParam) {
      return vParam;
    }
  } catch (error) {
    console.error('ERROR "v":', error);
  }
  return null;
}



  // Função para remover tags "ytd-rich-item-renderer" com base nas palavras-chave
  function removeTagsComPalavrasChave() {
    var elementos = document.querySelectorAll("ytd-rich-item-renderer");
    elementos.forEach(function (elemento) {
      if (verificaPalavrasChave(elemento)) {
        elemento.remove();
      }
    });
  }






  // CÓDIGO IMPORTADO
  const equalText1 = "Skip Ads";
  const equalText2 = "Skip Ad";

  function addNewStyle(newStyle) {
      var styleElement = document.getElementById('styles_js');
      if (!styleElement) {
          styleElement = document.createElement('style');
          styleElement.type = 'text/css';
          styleElement.id = 'styles_js';
          document.getElementsByTagName('head')[0].appendChild(styleElement);
      }
      styleElement.appendChild(document.createTextNode(newStyle));
  }
  function skipAd(){
      if(document.getElementsByClassName("ytp-ad-skip-button").length > 0){
          if(document.getElementsByClassName("ytp-ad-skip-button")[0].childNodes[0].textContent === equalText1 || document.getElementsByClassName("ytp-ad-skip-button")[0].childNodes[0].textContent === equalText2){
              document.getElementsByClassName("ytp-ad-skip-button")[0].click();
          } else {
              setTimeout(skipAd(), 1000);
          }
      }
  }


    // Função para remover todos os elementos desnecessários
    function removerTagsScript() {
        if(sessao == 1 && window.location.href.includes("watch?v=") !== true){
          addButtons();
          sessao = 2;
        }
        if(sessao == 2 && window.location.href.includes("watch?v=") == true){
          window.location.reload();
        }

        setTimeout(function(){
          const scripts = document.querySelectorAll('script');
          scripts.forEach(function(script) {
              script.parentNode.removeChild(script);
          });
          const tagthumbnails = document.querySelectorAll('ytd-playlist-thumbnail');
          tagthumbnails.forEach(function(thumbnail) {
              thumbnail.parentNode.removeChild(thumbnail);
          });
          const tagthumbnail2s = document.querySelectorAll('ytd-moving-thumbnail-renderer');
          tagthumbnail2s.forEach(function(thumbnail2) {
              thumbnail2.parentNode.removeChild(thumbnail2);
          });
          const tagthumbnail3s = document.querySelectorAll('ytd-thumbnail-overlay-toggle-button-renderer');
          tagthumbnail3s.forEach(function(thumbnail3) {
              thumbnail3.parentNode.removeChild(thumbnail3);
          });
          const tagthumbnail4s = document.querySelectorAll('ytd-thumbnail-overlay-inline-unplayable-renderer');
          tagthumbnail4s.forEach(function(thumbnail4) {
              thumbnail4.parentNode.removeChild(thumbnail4);
          });
          const iconsets = document.querySelectorAll('iron-iconset-svg');
          iconsets.forEach(function(iconset) {
              iconset.parentNode.removeChild(iconset);
          });
          const renderers = document.querySelectorAll('ytd-rich-shelf-renderer');
          renderers.forEach(function(renderer) {
              renderer.parentNode.removeChild(renderer);
          });
          const recomendados = document.querySelectorAll('ytd-watch-next-secondary-results-renderer');
          recomendados.forEach(function(recomendado) {
              recomendado.parentNode.removeChild(recomendado);
          });
          const recomendado2s = document.querySelectorAll('ytd-statement-banner-renderer');
          recomendado2s.forEach(function(recomendado2) {
              recomendado2.parentNode.removeChild(recomendado2);
          });
          const xplayers = document.querySelectorAll('ytd-player');
          xplayers.forEach(function(player) {
              player.parentNode.removeChild(player);
          });
          const interactions = document.querySelectorAll('yt-interaction');
          interactions.forEach(function(interaction) {
              interaction.parentNode.removeChild(interaction);
          });
          const ychats = document.querySelectorAll('ytd-live-chat-frame');
          ychats.forEach(function(ychat) {
              ychat.parentNode.removeChild(ychat);
          });
          const players = document.querySelectorAll('video');
          players.forEach(function(playerx) {
              playerx.parentNode.removeChild(playerx);
          });
          const ycanvas = document.querySelectorAll('canvas');
          ycanvas.forEach(function(ycanva) {
              ycanva.parentNode.removeChild(ycanva);
          });
          const yminiplayers = document.querySelectorAll('ytd-miniplayer');
          yminiplayers.forEach(function(yminiplayer) {
              yminiplayer.parentNode.removeChild(yminiplayer);
          });

          const ythirds = document.querySelectorAll('ytd-third-party-manager');
          ythirds.forEach(function(ythird) {
              ythird.parentNode.removeChild(ythird);
          });
          const yannouncers = document.querySelectorAll('iron-a11y-announcer');
          yannouncers.forEach(function(yannouncer) {
              yannouncer.parentNode.removeChild(yannouncer);
          });
          const ymediaQuerys = document.querySelectorAll('iron-media-query');
          ymediaQuerys.forEach(function(ymediaQuery) {
              ymediaQuery.parentNode.removeChild(ymediaQuery);
          });
          const ytdAds = document.querySelectorAll('ytd-ad-slot-renderer');
          ytdAds.forEach(function(ytdAd) {
              ytdAd.parentNode.removeChild(ytdAd);
          });
          const ytdAd2s = document.querySelectorAll('ytd-rich-section-renderer');
          ytdAd2s.forEach(function(ytdAd2) {
              ytdAd2.parentNode.removeChild(ytdAd2);
          });
          const ytdAd3s = document.querySelectorAll('ytd-merch-shelf-renderer');
          ytdAd3s.forEach(function(ytdAd3) {
              ytdAd3.parentNode.removeChild(ytdAd3);
          });
          const ytdAd4s = document.querySelectorAll('tp-yt-paper-dialog');
          ytdAd4s.forEach(function(ytdAd4) {
              ytdAd4.parentNode.removeChild(ytdAd4);
          });
          const ytdAd5s = document.querySelectorAll('ytd-action-companion-ad-renderer');
          ytdAd5s.forEach(function(ytdAd5) {
              ytdAd5.parentNode.removeChild(ytdAd5);
          });
          const ytdAd6s = document.querySelectorAll('ytm-video-with-context-renderer');
          ytdAd6s.forEach(function(ytdAd6) {
              ytdAd6.parentNode.removeChild(ytdAd6);
          });
          const ytdAd7s = document.querySelectorAll('ytm-continuation-item-renderer');
          ytdAd7s.forEach(function(ytdAd7) {
              ytdAd7.parentNode.removeChild(ytdAd7);
          });

          const videosAds = document.querySelectorAll('.video-ads');
          if(videosAds){
            if (videosAds.length > 0) {
            videosAds.forEach(function(videosAd) {
                videosAd.parentNode.removeChild(videosAd);
              });
            }
          }
          const previews = document.querySelectorAll('.ytp-gradient-top');
          if(previews){
            if (previews.length > 0) {
            previews.forEach(function(preview) {
                preview.style.display = 'none';
                preview.parentNode.removeChild(preview);
              });
            }
          }

          if(window.location.href.includes("youtube.com")){
              skipAd();
          }

        // Selecione todos os elementos do DOM
        var allElements = document.querySelectorAll('*');
        // Itere por todos os elementos e remova os manipuladores de eventos de clique
        allElements.forEach(function(element) {
            element.click = "";
            element.keydown = "";
            element.mousedown = "";
            element.down = "";
            element.attached = "";
            element.onclick = "";
            element.auxclick = "";
            element.dblclick = "";
            element.copy = "";
            element.change = "";
            element.keypress = "";
            element.mouseover = "";
        });



          let mediaElements = document.querySelectorAll('video, audio');
          if(mediaElements){
            mediaElements.forEach(function (media) {
              if (typeof media.play === 'function') {
                  media.play = function () {};
                }
              });
          }


          // Obtém todos os elementos pelo ID e os remove
          let currentURL = window.location.href;
          if (currentURL.includes("watch?v=")) {
              const playerPrincipal = document.querySelectorAll('#player-container-outer');
              for (const element of playerPrincipal) {
                  element.remove();
                };
              const allSecundary = document.querySelectorAll('#secondary');
              for (const element of allSecundary) {
                  element.remove();
                };
              const primaryx = document.querySelector('#primary');
              if (primaryx) {
                  primaryx.style.maxWidth = "720px";
                  primaryx.style.margin = "auto";
                  primaryx.style.padding = "2px 10px";
                }
            };
          const playerAds = document.querySelectorAll('#player-ads');
          for (const element of playerAds) {
              element.remove();
            };
          const alertRemoves = document.querySelectorAll('#clarify-box');
          for (const element of alertRemoves) {
              element.remove();
            };
          const elementsToRemove = document.querySelectorAll('#video-preview');
          for (const element of elementsToRemove) {
              element.remove();
            };

          const adsInfo = document.querySelectorAll('#ads-info-button');
          for (const element of adsInfo) {
              element.remove();
            };

      }, 500);
    }

  let errorPlay = false;
  function tagsNonePlay(){
    const vernoYt = document.querySelector('.ytp-impression-link');
    if (vernoYt) {
        vernoYt.style.display = "none";
      }
    const pausenokoo = document.querySelector('.ytp-pause-overlay');
    if (pausenokoo) {
        pausenokoo.style.display = "none";
      }
    const notificKoo1 = document.querySelector('.ytp-info-panel-preview');
    if (notificKoo1) {
        notificKoo1.style.display = "none";
      }
    const notificKoo2 = document.querySelector('.html5-endscreen.ytp-player-content.videowall-endscreen.ytp-endscreen-paginate.ytp-show-tiles');
    if (notificKoo2) {
        notificKoo2.style.display = "none";
      }
    const errorx1 = document.querySelector('.ytp-error-content');
    if (errorx1 && errorPlay == false) {
        errorPlay = true;
        let notError= document.querySelector('.ytp-error-content-wrap');
        let videoId = "";
        let currentURL = window.location.href;
          var urlxx = currentURL;
          var videoCode = urlxx.match(/embed\/([A-Za-z0-9_-]+)/);
          if (videoCode && videoCode.length > 1) {
              var codigoDoVideo = videoCode[1];
              videoId = codigoDoVideo;
          }
        notError.innerHTML = `
        <div class="ytp-error-content-wrap-reason">
          <span>Youtube Lite (error). Options:</span></div>
        <div class="ytp-error-content-wrap-subreason">
          <div style="line-height: 1.8">
            <a style="text-decoration: none" href="https://invidious.slipfox.xyz/latest_version?id=${videoId}">→ Open with Player 2</a>
            <br>
            <a style="text-decoration: none" href="https://riservato-xyz.frama.io/watch/?v=${videoId}">→ Open with Player 3</a>
            <br>
            <a style="text-decoration: none" href="https://invidious.slipfox.xyz/watch?v=${videoId}&dark_mode=true&hl=pt-BR&iv_load_policy=3&quality=medium&related_videos=false&region=3166&controls=1&player_style=youtube" target="_blank">→ Open in Invidious</a>
        </div>`;
        let baixeError = document.querySelector('.ytp-small-redirect');
        baixeError.innerHTML = `<i class="bi bi-download"></i>`;
        baixeError.href = `https://www.y2mate.com/pt/youtube/${videoId}`;
        baixeError.title = "Download";
        baixeError.style.fontSize = "2.1rem";
        baixeError.setAttribute('target', '_blank');
      }
  }


    function addLinks(){
      // Troca links
      function removaTudo(event) {
        event = ``;
      }

      const richItemRenderers = document.querySelectorAll('ytd-rich-item-renderer');
      const brocken = document.querySelectorAll('body');
      for (const xbrocken of brocken) {
        const childElements = xbrocken.querySelectorAll('*'); // Seleciona todos os elementos filhos do elemento
          childElements.forEach((retiraEvento) => {
            retiraEvento.removeEventListener('click', removaTudo(this));
            retiraEvento.removeEventListener('mousedown', removaTudo(this));
            retiraEvento.removeEventListener('down', removaTudo(this));
            retiraEvento.removeEventListener('pointerdown', removaTudo(this));
            retiraEvento.removeEventListener('mouseover', removaTudo(this));
            retiraEvento.removeEventListener('keypress', removaTudo(this));
            retiraEvento.removeEventListener('keydown', removaTudo(this));
            retiraEvento.removeEventListener('load', removaTudo(this));
            retiraEvento.removeEventListener('yt-action', removaTudo(this));
            retiraEvento.removeEventListener('mouseenter', removaTudo(this));
            retiraEvento.removeEventListener('mouseleave', removaTudo(this));
            retiraEvento.removeEventListener('wheel', removaTudo(this));
          });
      };
      //alert(richItemRenderers)
      for (const renderer of richItemRenderers) {
        const links = renderer.querySelectorAll('a');
        for (const link of links) {
          if (link.href.indexOf('/watch?v=') !== -1) {
            let linkID = getUrl(link.href);
            link.setAttribute('href', `https://www.youtube-nocookie.com/embed/${linkID}?rel=0&controls=2&color=white&iv_load_policy=3&showinfo=0&modestbranding=1&hl=pt-BR&autoplay=1`);
            link.setAttribute('target', '_blank')
            //link.setAttribute('onclick', `event.preventDefault(); window.location.href='https://www.youtube-nocookie.com/embed/${linkID}?rel=0&controls=2&color=white&iv_load_policy=3&showinfo=0&modestbranding=1&hl=pt-BR&autoplay=1', '_blank';`);
          }
        }
      }
    }




    // Função para criar o iframe personalizado
    function createCustomIframe(videoId) {
      document.body.innerHTML = ``;
    }


    // Função para limpar todos os cookies do site na primeira vez
    function limparCookies() {
        if(localStorage.getItem('verificarCookies') == null){
            localStorage.setItem('verificarCookies', "primeiraVez");
        }
        if (localStorage.getItem('verificarCookies') == "primeiraVez" || localStorage.getItem('verificarVersao') !== "2.3"){
          localStorage.setItem('verificarVersao', "2.3");
          alert("Note: You are accessing this version 2.3 of Youtube Lite for the first time. To ensure its correct functioning, we will clear the cookies and restart the page.")
          localStorage.setItem('verificarCookies', "tudoSuave");
          var cookies = document.cookie.split(';');
          for (var i = 0; i < cookies.length; i++) {
              var cookie = cookies[i];
              var igualPos = cookie.indexOf('=');
              var nome = igualPos > -1 ? cookie.substr(0, igualPos) : cookie;
              document.cookie = nome + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';
          }
          window.location.reload();
        }
    }





  function addButtons(){
    if(window.location.href.includes("watch?v=") !== true && window.location.href.includes("youtube-nocookie.com") !== true){
      var xmyMenus = document.createElement('div');
      xmyMenus.style.position = 'absolute';
      xmyMenus.id = 'xmenus';
      xmyMenus.style.width = '80%';
      xmyMenus.style.height = '40px';
      xmyMenus.style.top = '52px';
      xmyMenus.style.right = '2%';
      xmyMenus.style.textAlign = 'center';
      xmyMenus.style.zIndex = '999';
      xmyMenus.style.marginTop = '1px';
      xmyMenus.style.borderBottom = '1px solid #332a73';
      xmyMenus.style.backgroundColor = '#130f24a1';

      // Cria o botão "Editar Palavras"
      var editarPalavrasButton = document.createElement('button');
      editarPalavrasButton.style.fontSize = '17px';
      editarPalavrasButton.style.marginTop = '9px';
      editarPalavrasButton.style.backgroundColor = '#000';
      editarPalavrasButton.style.color = '#fff';
      editarPalavrasButton.style.borderRadius = '3px';
      editarPalavrasButton.style.height = '27px';
      editarPalavrasButton.style.padding = '2px 1.5%';
      editarPalavrasButton.innerHTML = "<i style='font-size:14px'>Abc</i> → <i class='bi bi-card-list'></i> = <i class='bi bi-trash3'></i>";


      var gaveta = document.createElement('div');
      gaveta.style.position = 'fixed';
      gaveta.id = 'gavetax';
      gaveta.style.top = '40px';
      gaveta.style.zIndex = '9999';
      gaveta.style.width = '320px';
      gaveta.style.height = '170px';
      gaveta.style.right = '50%';
      gaveta.style.left = '50%';
      gaveta.style.textAlign = 'center';
      gaveta.style.transform = 'translate(-50%, 12%)';
      gaveta.style.border = '1px solid #fff';
      gaveta.style.backgroundColor = 'rgba(14, 10, 28, 0.94)';
      gaveta.style.overflow = 'hidden';
      gaveta.style.display = 'none';


      var textarea = document.createElement('textarea');
      textarea.style.width = '200px';
      textarea.style.width = '97%';
      textarea.style.height = '130px';
      textarea.style.pla = '130px';
      textarea.style.backgroundColor = '#0d0d0f';
      textarea.style.color = '#fff';
      textarea.style.padding = '3px 4px';
      textarea.placeholder = 'Exemples: futebol, Big Brother, etc';
      textarea.value = palavrasSalvas;

      var salvarButton = document.createElement('button');
      salvarButton.style.marginTop = '2px';
      salvarButton.style.width = '85%';
      salvarButton.style.padding = '2px 10px';
      salvarButton.style.backgroundColor = '#000';
      salvarButton.style.color = '#fff';
      salvarButton.style.borderRadius = '3px';
      salvarButton.innerHTML = 'Save and hide all';

      var cancelarTag = document.createElement('button');
      cancelarTag.style.marginTop = '2px';
      cancelarTag.style.marginLeft = '5px';
      cancelarTag.style.width = '10%';
      cancelarTag.style.padding = '2px 10px';
      cancelarTag.style.backgroundColor = '#000';
      cancelarTag.style.color = '#fff';
      cancelarTag.style.borderRadius = '3px';
      cancelarTag.innerHTML = 'X';
      //cancelarTag.setAttribute("onclick", "document.getElementById('gavetax').style.display = 'none';")

      // Adiciona os elementos criados como filhos de xmyMenus
      xmyMenus.appendChild(editarPalavrasButton);
      gaveta.appendChild(textarea);
      gaveta.appendChild(salvarButton);
      gaveta.appendChild(cancelarTag);
      document.body.appendChild(xmyMenus);
      document.body.appendChild(gaveta);


      // Adicione um evento de clique ao botão de abrir a gaveta
      editarPalavrasButton.addEventListener('click', function() {
          gaveta.style.display = 'block';
      });

      // Adicione um evento de clique ao botão de salvar
      salvarButton.addEventListener('click', function() {
          var palavrasSalvas = textarea.value;
          GM_setValue('keyWords', palavrasSalvas);
          alert('Saved! The page will reload to activate hiding the new keywords.');
          gaveta.style.display = 'none';
          window.location.reload();
      });
      cancelarTag.addEventListener('click', function() {
          gaveta.style.display = "none";
      });

        const youtubeTag = document.querySelector('ytd-app');
        if (youtubeTag) {
          youtubeTag.setAttribute('id', 'ytdLite');
          youtubeTag.style.marginTop = '40px';
          //document.getElementById("guide").innerHTML += myMenus;
        }
    }

      // Estilização
        const estiloHover = document.createElement('style');

        // Defina o conteúdo CSS para o efeito de hover
        estiloHover.innerHTML = `
          ytd-rich-item-renderer{
            border: solid 1px transparent;
          }
          ytd-rich-item-renderer:hover {
            border: solid 1px #3f3c93;
            border-radius: 1rem;
            text-shadow: .5px 1px 6px #2e2451;
          }
        `;
        document.body.appendChild(estiloHover);
  }






    // Função para verificar a URL a cada 2 segundos
    let atualx = false;
    function checkURL() {
        const currentURL = window.location.href;
        removeTagsComPalavrasChave();
        if (currentURL !== localStorage.getItem('lastCheckedURL') && currentURL.includes("/watch?v=")) {
            localStorage.setItem('trocou', "false");
            localStorage.setItem('trocardeNovo', "true");
            localStorage.setItem('atualReload', "false");
          if(currentURL !== localStorage.getItem('lastCheckedURL')){
              localStorage.setItem('lastCheckedURL', currentURL);
              window.location.reload();
            }
        }
      if(currentURL.includes("/watch?v=") && atualx == false){
        atualx = true;
          setTimeout(function(){
            setTimeout(function(){
            const addPlayer1 = document.querySelector('#full-bleed-container');
            const addPlayer2 = document.querySelector('#player-container-id');
              if(addPlayer1){
                addPlayer1.style.textAlign = "center";
                addPlayer1.innerHTML = ``;
                addPlayer1.innerHTML += `<iframe style="width: 99%;max-width: 720px; border-radius: 1rem; height: 70%; height: 320px; margin-left: -1%;" id="xplayer" src="https://www.youtube-nocookie.com/embed/${videoId}?rel=0&controls=2&color=white&iv_load_policy=3&showinfo=0&modestbranding=1&hl=pt-BR&autoplay=1" allow="accelerometer; autoplay='autoplay'; gyroscope; picture-in-picture" frameborder="0" frameborder="autoplay" scrolling="no" referrerpolicy="no-referrer" allowfullscreen=""></iframe>`;
               /*setTimeout(function(){
                  let autoPlay = document.getElementById("xplayer");
                  autoPlay.src = `https://www.youtube-nocookie.com/embed/${videoId}?rel=0&controls=2&color=white&iv_load_policy=3&showinfo=0&modestbranding=1&hl=pt-BR&autoplay=1`;
                }, 2500);*/
              }else if(addPlayer2){
                let removeIt = document.querySelector('.player-size.player-placeholder');
                addPlayer2.style.position = "relative";
                removeIt.style.display = "none";
                addPlayer2.style.textAlign = "center";
                addPlayer2.innerHTML = ``;
                addPlayer2.innerHTML += `<iframe style="width: 99%;max-width: 720px; border-radius: 1rem; height: 70%; height: 320px; margin-left: -1%;" id="xplayer" src="https://www.youtube-nocookie.com/embed/${videoId}?rel=0&controls=2&color=white&iv_load_policy=3&showinfo=0&modestbranding=1&hl=pt-BR&autoplay=0" allow="accelerometer; autoplay='autoplay'; gyroscope; picture-in-picture" frameborder="0" frameborder="autoplay" scrolling="no" referrerpolicy="no-referrer" allowfullscreen=""></iframe>`;
              }else{
                window.location.reload();
              }
            }, 500);
          }, 1500);
      }
      if (currentURL.includes("youtube.com")) {
          removerTagsScript();
        }
      if (currentURL.includes("youtube-nocookie.com/embed")) {
          tagsNonePlay();
      }
    }







      // Objeto que mapeia classes ou IDs de elementos para estilos de substituição
      const estilosParaSubstituir = {
          // INTERFACE
          'ytp-cued-thumbnail-overlay-image': 'background-position: center;background-repeat: no-repeat;background-attachment: fixed;background-size: 99% auto;', //campo inicial
          'ytp-gradient-top': 'height: 20px;',
        // Adicione mais pares de classes ou IDs aqui
      };

        // Função para substituir estilos CSS em elementos
        function substituirEstilos() {
            for (const seletor in estilosParaSubstituir) {
                const elementos = document.querySelectorAll(`.${seletor}, #${seletor}`);
                //alert(elementos);
                elementos.forEach(elemento => {
                    elemento.style.cssText += estilosParaSubstituir[seletor];
                });
            }
          }





     function notificaAlert() {
      document.title = "Youtube (Lite)";
      let currentURL = window.location.href;
        if (currentURL.includes("youtube-nocookie.com/embed")) {
        setTimeout(function(){
          substituirEstilos();
          let videoId = "";
          var urlxx = currentURL;
          var videoCode = urlxx.match(/embed\/([A-Za-z0-9_-]+)/);
          if (videoCode && videoCode.length > 1) {
              var codigoDoVideo = videoCode[1];
              videoId = codigoDoVideo;
          }

            var pageProject = document.querySelector(".ytp-title-link.yt-uix-sessionlink");
            if (pageProject) {
                var novaTagp = document.createElement("a");
                novaTagp.style.fontSize = "1.2rem";
                novaTagp.style.display = "inline-block";
                novaTagp.style.height = "35px";
                novaTagp.style.width = "100%";
                novaTagp.style.padding = "0px 5%";
                novaTagp.style.textAlign = "center";
                novaTagp.style.textShadow = "1px 2px 4px #3b3bf4";
                novaTagp.setAttribute('target', '_blank')

                novaTagp.href = `https://greasyfork.org/pt-BR/scripts/476133-youtube-lite-melhor-experi%C3%AAncia`;
                //novaTagp.setAttribute('onclick', `event.preventDefault(); window.location.href='https://greasyfork.org/pt-BR/scripts/476133-youtube-lite-melhor-experi%C3%AAncia', '_blank';`);

                novaTagp.innerHTML = `<i class="bi bi-code-slash"></i> <span>open Youtube Lite project page</span>`;
                // Substitui o elemento original pelo novo elemento
                pageProject.parentNode.replaceChild(novaTagp, pageProject);
            }

            var invidiousPage = document.querySelector(".ytp-youtube-button.ytp-button.yt-uix-sessionlink");
            if (invidiousPage) {
                var novaTagV = document.createElement("a");
                novaTagV.style.fontSize = "1.3rem";
                novaTagV.style.display = "inline-block";
                novaTagV.style.float = "left";
                novaTagV.style.height = "40px";
                novaTagV.style.padding = "0px 10px";
                novaTagV.title = "Open video in Invidious";

                novaTagV.href = `https://invidious.slipfox.xyz/watch?v=${videoId}&dark_mode=true&hl=pt-BR&iv_load_policy=3&quality=medium&related_videos=false&region=3166&controls=1&player_style=youtube`;
                novaTagV.setAttribute('target', '_blank')

                novaTagV.innerHTML = `<img style="max-height: 23px; width: auto; margin: 8px 0px" src="https://invidious.snopyta.org/favicon-32x32.png">`;
                invidiousPage.parentNode.replaceChild(novaTagV, invidiousPage);
            }
          /*var homePage = document.querySelector(".ytp-right-controls");
            if (homePage) {
                var novaTagH = document.createElement("a");
                novaTagH.style.fontSize = "1.3rem";
                novaTagH.style.display = "inline-block";
                novaTagH.style.float = "left";
                novaTagH.style.height = "40px";
                novaTagH.style.padding = "0px 10px";
                novaTagH.title = "YouTube Home";

                novaTagH.href = `https://www.youtube.com/`;

                novaTagH.innerHTML = `<i class="bi bi-house-door-fill"></i>`;
                homePage.appendChild(novaTagH);
            }*/
          var filmSimple = document.querySelector(".ytp-right-controls");
            if (filmSimple) {
                var novaTagC = document.createElement("a");
                novaTagC.style.fontSize = "1.3rem";
                novaTagC.style.display = "inline-block";
                novaTagC.style.float = "left";
                novaTagC.style.height = "40px";
                novaTagC.style.padding = "0px 10px";
                novaTagC.title = "Simple video";

                novaTagC.href = `https://invidious.slipfox.xyz/latest_version?id=${videoId}`;

                novaTagC.innerHTML = `<i class="bi bi-film"></i>`;
                filmSimple.appendChild(novaTagC);
            }
          var downloadRun = document.querySelector(".ytp-right-controls");
            if (downloadRun) {
                var novaTagD = document.createElement("a");
                novaTagD.style.fontSize = "1.3rem";
                novaTagD.style.display = "inline-block";
                novaTagD.style.float = "left";
                novaTagD.style.height = "40px";
                novaTagD.style.padding = "0px 10px";
                novaTagD.title = "Download";
                novaTagD.setAttribute('target', '_blank')

                novaTagD.href = `https://www.y2mate.com/pt/youtube/${videoId}`;

                novaTagD.innerHTML = `<i class="bi bi-download"></i>`;
                downloadRun.appendChild(novaTagD);
            }
        }, 1000);


      }
      setInterval(checkURL, 550);
      addButtons()

      // Verifica a URL quando o script é carregado pela primeira vez
      let videoId = getVideoIdFromUrl();

      setTimeout(function(){
        if(verifyc1 == true){
          console.log("IPBLOCK: IP capture attempt blocked.");
        }
        if(verifyc2 == true){
          console.log("IPBLOCK: Fetch request attempt blocked.");
        }

      },1000);
    }

    window.addEventListener('load', notificaAlert);




})();