YouTube to Piped Links and Embeds Replacer on all websites

Replaces YouTube links and embeds with Piped.video links in the HTML on all websites.

// ==UserScript==
// @name            YouTube to Piped Links and Embeds Replacer on all websites
// @description     Replaces YouTube links and embeds with Piped.video links in the HTML on all websites.
// @name:af         YouTube na Piped skakels en ingebedde vervanger op alle webwerwe
// @description:af  Vervang YouTube-skakels en ingebedde met Piped.video-skakels in die HTML op alle webwerwe.
// @name:ar         استبدال روابط وتضمينات YouTube بـ Piped على جميع المواقع الإلكترونية
// @description:ar  يستبدل روابط YouTube والتضمينات بروابط Piped.video في HTML على جميع المواقع الإلكترونية.
// @name:az         Bütün veb saytlarda YouTube bağlantılarını və yerləşdirmələri Piped bağlantıları ilə əvəz edir
// @description:az  Bütün veb saytlarda HTML-də YouTube bağlantılarını və yerləşdirmələri Piped.video bağlantıları ilə əvəz edir.
// @name:bg         Замяна на YouTube връзки и вградени с Piped връзки на всички уебсайтове
// @description:bg  Замества YouTube връзки и вградени с Piped.video връзки в HTML на всички уебсайтове.
// @name:bn         সমস্ত ওয়েবসাইটে YouTube লিঙ্ক এবং এমবেড প্রতিস্থাপন Piped লিঙ্ক দিয়ে
// @description:bn  সমস্ত ওয়েবসাইটের HTML-এ YouTube লিঙ্ক এবং এমবেডগুলি Piped.video লিঙ্ক দিয়ে প্রতিস্থাপন করে।
// @name:ca         Substitució d'enllaços i incrustacions de YouTube per enllaços de Piped a tots els llocs web
// @description:ca  Substitueix els enllaços i incrustacions de YouTube per enllaços de Piped.video en el HTML de tots els llocs web.
// @name:cs         Nahrazení odkazů a vložení YouTube za odkazy Piped na všech webových stránkách
// @description:cs  Nahrazuje odkazy a vložení YouTube za odkazy Piped.video v HTML na všech webových stránkách.
// @name:da         Udskiftning af YouTube-links og indlejringer med Piped-links på alle websteder
// @description:da  Erstatter YouTube-links og indlejringer med Piped.video-links i HTML på alle websteder.
// @name:de         Ersetzen von YouTube-Links und Einbettungen durch Piped-Links auf allen Websites
// @description:de  Ersetzt YouTube-Links und Einbettungen durch Piped.video-Links im HTML auf allen Websites.
// @name:el         Αντικατάσταση συνδέσμων και ενσωματώσεων YouTube με συνδέσμους Piped σε όλους τους ιστότοπους
// @description:el  Αντικαθιστά τους συνδέσμους και τις ενσωματώσεις YouTube με συνδέσμους Piped.video στο HTML σε όλους τους ιστότοπους.
// @name:eo         Anstataŭigo de YouTube-ligoj kaj enkorpigoj per Piped-ligoj sur ĉiuj retejoj
// @description:eo  Anstataŭigas YouTube-ligojn kaj enkorpigojn per Piped.video-ligoj en la HTML sur ĉiuj retejoj.
// @name:es         Reemplazo de enlaces y incrustaciones de YouTube por enlaces de Piped en todos los sitios web
// @description:es  Reemplaza los enlaces y las incrustaciones de YouTube por enlaces de Piped.video en el HTML de todos los sitios web.
// @name:fi         YouTube-linkkien ja upotusten korvaaminen Piped-linkeillä kaikilla verkkosivustoilla
// @description:fi  Korvaa YouTube-linkit ja upotukset Piped.video-linkeillä HTML:ssä kaikilla verkkosivustoilla.
// @name:fr         Remplacement des liens et des intégrations YouTube par des liens Piped sur tous les sites web
// @description:fr  Remplace les liens et les intégrations YouTube par des liens Piped.video dans le HTML sur tous les sites web.
// @name:gl         Substitución de ligazóns e insercións de YouTube por ligazóns de Piped en todos os sitios web
// @description:gl  Substitúe as ligazóns e insercións de YouTube por ligazóns de Piped.video no HTML de todos os sitios web.
// @name:he         החלפת קישורים והטמעות של YouTube בקישורי Piped בכל האתרים
// @description:he  מחליף את קישורי YouTube וההטמעות בקישורי Piped.video ב-HTML בכל האתרים.
// @name:hi         सभी वेबसाइटों पर YouTube लिंक और एंबेड को Piped लिंक से बदलें
// @description:hi  सभी वेबसाइटों पर HTML में YouTube लिंक और एंबेड को Piped.video लिंक से बदलता है।
// @name:hu         YouTube-hivatkozások és beágyazások cseréje Piped-hivatkozásokra minden webhelyen
// @description:hu  YouTube-hivatkozások és beágyazások cseréje Piped.video-hivatkozásokra a HTML-ben minden webhelyen.
// @name:id         Pengganti tautan dan sematan YouTube dengan tautan Piped di semua situs web
// @description:id  Mengganti tautan dan sematan YouTube dengan tautan Piped.video di HTML di semua situs web.
// @name:is         Skipta út YouTube tenglum og ívafi með Piped tenglum á öllum vefsíðum
// @description:is  Skipta út YouTube tenglum og ívafi með Piped.video tenglum í HTML á öllum vefsíðum.
// @name:it         Sostituzione dei collegamenti e incorporamenti di YouTube con collegamenti Piped su tutti i siti web
// @description:it  Sostituisce i collegamenti e gli incorporamenti di YouTube con collegamenti Piped.video nell'HTML su tutti i siti web.
// @name:ja         すべてのウェブサイトでYouTubeリンクと埋め込みをPipedリンクに置き換えます
// @description:ja  すべてのウェブサイトでHTML内のYouTubeリンクと埋め込みをPiped.videoリンクに置き換えます。
// @name:km         ប្តូរតំណ និងបង្កប់ YouTube ជា Piped លើគេហទំព័រទាំងអស់
// @description:km  ប្តូរតំណ និងបង្កប់ YouTube ជាតំណ Piped.video ក្នុង HTML នៅលើគេហទំព័រទាំងអស់។
// @name:ko         모든 웹사이트에서 YouTube 링크와 임베드를 Piped 링크로 대체
// @description:ko  모든 웹사이트의 HTML에서 YouTube 링크와 임베드를 Piped.video 링크로 대체합니다.
// @name:ms         Gantikan pautan dan sematan YouTube dengan pautan Piped di semua laman web
// @description:ms  Menggantikan pautan dan sematan YouTube dengan pautan Piped.video dalam HTML di semua laman web.
// @name:mt         Sostituzzjoni ta' links u embeds ta' YouTube b'links ta' Piped fuq il-websajts kollha
// @description:mt  Jissostitwixxi links u embeds ta' YouTube b'links ta' Piped.video fil-HTML fuq il-websajts kollha.
// @name:nb         Erstatte YouTube-lenker og innebygginger med Piped-lenker på alle nettsteder
// @description:nb  Erstatter YouTube-lenker og innebygginger med Piped.video-lenker i HTML på alle nettsteder.
// @name:nl         Vervang YouTube-links en ingesloten inhoud door Piped-links op alle websites
// @description:nl  Vervangt YouTube-links en ingesloten inhoud door Piped.video-links in de HTML op alle websites.
// @name:pl         Zamiana linków i osadzonych treści YouTube na linki Piped na wszystkich stronach internetowych
// @description:pl  Zamienia linki i osadzone treści YouTube na linki Piped.video w HTML na wszystkich stronach internetowych.
// @name:pt         Substituição de links e incorporações do YouTube por links do Piped em todos os sites
// @description:pt  Substitui links e incorporações do YouTube por links do Piped.video no HTML em todos os sites.
// @name:ro         Înlocuirea linkurilor și încorporărilor YouTube cu linkuri Piped pe toate site-urile web
// @description:ro  Înlocuiește linkurile și încorporările YouTube cu linkuri Piped.video în HTML pe toate site-urile web.
// @name:ru         Замена ссылок и встраиваний YouTube на ссылки Piped на всех веб-сайтах
// @description:ru  Заменяет ссылки и встраивания YouTube на ссылки Piped.video в HTML на всех веб-сайтах.
// @name:sr         Замена линкова и уградње YouTube са Piped линковима на свим веб сајтовима
// @description:sr  Замењује линкове и уградње YouTube са Piped.video линковима у HTML на свим веб сајтовима.
// @name:sv         Ersätt YouTube-länkar och inbäddningar med Piped-länkar på alla webbplatser
// @description:sv  Ersätter YouTube-länkar och inbäddningar med Piped.video-länkar i HTML på alla webbplatser.
// @name:th         แทนที่ลิงก์และการฝัง YouTube ด้วยลิงก์ Piped บนเว็บไซต์ทั้งหมด
// @description:th  แทนที่ลิงก์และการฝัง YouTube ด้วยลิงก์ Piped.video ใน HTML บนเว็บไซต์ทั้งหมด
// @name:tl         Palitan ang mga link at embed ng YouTube ng mga link ng Piped sa lahat ng mga website
// @description:tl  Pinapalitan ang mga link at embed ng YouTube ng mga link ng Piped.video sa HTML sa lahat ng mga website.
// @name:tr         Tüm web sitelerinde YouTube bağlantılarını ve gömme kodlarını Piped bağlantılarıyla değiştirir
// @description:tr  Tüm web sitelerinde YouTube bağlantılarını ve gömme kodlarını HTML'de Piped.video bağlantılarıyla değiştirir.
// @name:uk         Заміна посилань і вбудовувань YouTube на посилання Piped на всіх веб-сайтах
// @description:uk  Заміщує посилання та вбудовування YouTube на посилання Piped.video в HTML на всіх веб-сайтах.
// @name:vi         Thay thế các liên kết và nhúng YouTube bằng liên kết Piped trên tất cả các trang web
// @description:vi  Thay thế các liên kết và nhúng YouTube bằng liên kết Piped.video trong HTML trên tất cả các trang web.
// @name:zh         将所有网站上的YouTube链接和嵌入替换为Piped链接
// @description:zh  将所有网站上的HTML中的YouTube链接和嵌入替换为Piped.video链接。
// @match           *://*/*
// @exclude         *://*.youtube.com/*
// @icon            https://gitlab.com/uploads/-/system/project/avatar/59164083/youtube-to-piped.jpg
// @version         1.1.2
// @author          BreatFR
// @copyright       2024, BreatFR (https://breat.fr)
// @grant           none
// @namespace       https://gitlab.com/breatfr
// @homepageURL     https://gitlab.com/breatfr/youtube-to-piped-links-and-embeds-replacer-on-all-websites
// @supportURL      https://discord.gg/Q8KSHzdBxs
// @license         AGPL-3.0-or-later; https://www.gnu.org/licenses/agpl-3.0.txt
// ==/UserScript==

(function() {
    'use strict';

    // Fonction pour remplacer les liens YouTube par des liens Piped.video dans le HTML
    function replaceYouTubeLinks() {
        var links = document.getElementsByTagName('a');
        for (var i = 0; i < links.length; i++) {
            var link = links[i];
            if (link.href.includes('youtube.com/watch?v=')) {
                var videoId = link.href.split('v=')[1];
                var ampersandPosition = videoId.indexOf('&');
                if (ampersandPosition !== -1) {
                    videoId = videoId.substring(0, ampersandPosition);
                }
                link.href = 'https://piped.video/watch?v=' + videoId;
                fetchMetadata(link, videoId);
            }
        }
    }

    // Fonction pour remplacer les embeds YouTube par des embeds Piped dans le HTML
    function replaceYouTubeEmbeds() {
        var iframes = document.getElementsByTagName('iframe');
        for (var i = 0; i < iframes.length; i++) {
            var iframe = iframes[i];
            if (iframe.src.includes('youtube.com/embed/')) {
                var videoId = iframe.src.split('embed/')[1];
                var ampersandPosition = videoId.indexOf('?');
                if (ampersandPosition !== -1) {
                    videoId = videoId.substring(0, ampersandPosition);
                }
                iframe.src = 'https://piped.video/embed/' + videoId;
                fetchMetadata(iframe, videoId);
            }
        }
    }

    // Fonction pour récupérer les métadonnées de Piped.video
    function fetchMetadata(element, videoId) {
        var apiUrl = 'https://pipedapi.kavin.rocks/streams/' + videoId;

        fetch(apiUrl)
            .then(response => response.json())
            .then(data => {
                if (data.title) {
                    element.title = data.title;
                }
                if (data.thumbnailUrl) {
                    var img = document.createElement('img');
                    img.src = data.thumbnailUrl;
                    img.alt = data.title;
                    img.style.maxWidth = '100px'; // Ajustez la taille selon vos besoins
                    element.parentNode.insertBefore(img, element);
                }
            })
            .catch(error => {
                console.error('Erreur lors de la récupération des métadonnées :', error);
            });
    }

    // Exécuter les fonctions lors du chargement de la page et lors des changements dans le DOM
    document.addEventListener('DOMContentLoaded', function() {
        replaceYouTubeLinks();
        replaceYouTubeEmbeds();
    });

    var observer = new MutationObserver(function(mutations) {
        replaceYouTubeLinks();
        replaceYouTubeEmbeds();
    });

    observer.observe(document.body, {
        childList: true,
        subtree: true
    });
})();