Erweiterung (download button) für das gesehende videos ausblenden oder makieren

Diese erweiterung erstellt einen Download Button um direkt Videos von youtube zu laden,

Questo script non dovrebbe essere installato direttamente. È una libreria per altri script da includere con la chiave // @require https://update.greasyfork.org/scripts/493285/1385276/Erweiterung%20%28download%20button%29%20f%C3%BCr%20das%20gesehende%20videos%20ausblenden%20oder%20makieren.js

// ==UserScript==
// @name         Erweiterung (download button)für das gesehende videos ausblenden oder makieren
// @namespace    http://tampermonkey.net/
// @version      2.1
// @description  Diese erweiterung erstellt einen Download  Button um direkt Videos von youtube zu laden,
// oder sie werden auf eine dritt seite weitergeleitet wo nsie das Yputube Video runterladen können.
// ACHTUNG: Dieses Script läuft nur mit meinen Userscript "Bastis Youtube Multi Script,gesehende videos ausblenden oder makieren",
// was in den nächsten Tagen Online kommt.
// Zu den Hauptscript kann dieses Script einfach eingebunden werden und das Hauptscript hat eine Funktion mehr.
// Alle Neue einstellmöglichkeiten der erweiterungen können in das Hauptmenü des Hauptscriptes eingestellt werden.
// @author       basti1012
// @allFrames    true
// @run-at document-end
// @license MIT License
// @noframes
// @exclude           *://myactivity.google.com/*
// @exclude      *://music.youtube.com/*
// @exclude      *://*.music.youtube.com/*
// @include      *youtube.com/watch?v=*
// @grant        none
// ==/UserScript==

if(!console_log_value){
    var console_log_value = [];
}
var start4 = performance.now();
if(!array_localsdtorage){
    var array_localsdtorage=[];
}
if(!erweiterungs_einstellungs_array){
    var erweiterungs_einstellungs_array=[];
}
array_localsdtorage.push(["download_einblenden", false],["download_from_fremdserver",true]);

function download_einblenden_anzeigen(){
    if(localStorage.getItem('download_einblenden')=='true'){
        if(location.href.indexOf('youtube.com/watch?')!=-1 || location.href.indexOf('youtu.be/')!=-1){
            function download2(){
                var id = window.location.search.split('v=')[1];
                let hrefDownload ='https://en.loader.to/4/?link=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D'+ id + '3&f=6&s=1&e=1&r=ddownr';
                window.open(hrefDownload, '_blank');
            }
            function download(){
                var id = window.location.search.split('v=')[1];
                let hrefDownload ='https://en.loader.to/4/?link=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D'+ id + '3&f=6&s=1&e=1&r=ddownr';
                window.open(hrefDownload, '_blank');
            }
            const styleTag = document.createElement('style');
            styleTag.id='BASTI1012_ERWEITERUNG_DOWNLOADBUTTON';
            styleTag.innerHTML = `
            div#download_tooltip {
                margin: -100px 0 0 -220px;
                position: absolute;
                line-height: 12px;
                border-radius: 5px;
                display:none;
                padding: 5px;
                width: 150px;
                z-index: 11111;
                background: rgba(2,2,2,0.8);
                color: white;
            }
            #download_tooltip:hover{
                background:green;
            }
            #download_tooltip:active{
                background:red;
            }
            button#www:hover #download_tooltip {
                display:block;
            }`;
            document.body.appendChild(styleTag);
            function download1(elm,swb,videoTitle){
              //  console.log('download 1 videotitle = '+videoTitle);
                var p=0;
                const apiUrl = 'https://co.wuk.sh/api/json';
                const requestData = {
                     url: window.location.href
                };
                const xhr = new XMLHttpRequest();
                xhr.open('POST', apiUrl, true);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.setRequestHeader('Accept', 'application/json');
           //     console.log("sending request");
                xhr.onreadystatechange = function(){
                    if(xhr.readyState === 4){
                        if(xhr.status >= 200 && xhr.status < 300) {
                            const responseData = JSON.parse(xhr.responseText);
                            createButton(elm,'green','Download success <br> Status : '+xhr.status,1);
                            setTimeout(function() {
                                var a_elem= document.createElement('a');
                                a_elem.id="eee";
                                a_elem.href = responseData.url;
                                a_elem.download = videoTitle+'.mp4';
                                document.getElementsByTagName('body')[0].appendChild(a_elem);
                                a_elem.click();
                              //  document.getElementById("eee").remove();
                              // download_einblenden_anzeigen();
                            },1000);
                        }else{
                           // console.error('Download error');
                           var console_download_debugging='Download error';
                           var console_download_debugging_per=''+(performance.now() - start4) + ' ms.';
                           console_log_value.push({
                               name: console_download_debugging,
                               wert: console_download_debugging_per
                           });
                           if(localStorage.getItem('console_log_debugging_aktivieren')=='true'){
                               console.table(console_log_value);
                           }
                            var fehlertext="<b style='color:red'>"+JSON.parse(xhr.responseText).text+"</b>";
                            createButton(elm,'red',`Download error ${xhr.status} <br> Text : ${fehlertext} <br> 2Alternative :
                            Versuche den Download über den Fremdserver <button id="eeee">Download Fremdserver</button>
                            <br><small>Auf den klick des Buttons wird eine neue Seite geöffnet</small><script>document.getElementById('eeee').addEventListener('click',function(){download2();})</script>`,1);
                        }
                    }
                };
                xhr.onerror = function() {
                    //  console.error('Network error');
                    var console_download_debugging='Network error';
                    var console_download_debugging_per=''+(performance.now() - start4) + ' ms.';
                    console_log_value.push({
                        name: console_download_debugging,
                        wert: console_download_debugging_per
                    });
                    if(localStorage.getItem('console_log_debugging_aktivieren')=='true'){
                        console.table(console_log_value);
                    }
                    var fehlertext="<b style='color:red'>"+JSON.parse(xhr.responseText).text+"</b>";
                    createButton(elm,'red',`Network error ${xhr.status} <br> Text : ${fehlertext} <br> 1Alternative :
                    Versuche den Download über den Fremdserver <button id="eeee">Download Fremdserver</button>
                    <br><small>Auf den klick des Buttons wird eine neue Seite geöffnet</small><script>document.getElementById('eeee').addEventListener('click',function(){download2();})</script>`,1);
                };
                xhr.success = function(){
                    //console.log('Download erfolgreich');
                    var console_download_debugging='Download erfolgreich';
                    var console_download_debugging_per=''+(performance.now() - start4) + ' ms.';
                    console_log_value.push({
                        name: console_download_debugging,
                        wert: console_download_debugging_per
                    });
                    if(localStorage.getItem('console_log_debugging_aktivieren')=='true'){
                        console.table(console_log_value);
                    }
                };
                if (p==0) {
                    p++;
                    xhr.send(JSON.stringify(requestData));
                    return;
                }
            }

            function createButton(elm,farbe,videoTitle,j){
                if(videoTitle==''){
                    setTimeout(function(){
                        try{
                            videoTitle=titel_holen();
                            if(videoTitle==''){
                                videoTitle=document.getElementsByTagName('title')[0].innerHTML;
                            }

                        }catch(e){
                            videoTitle=document.getElementsByTagName('title')[0].innerHTML;
                        }
                     //   console.log('titel auslesen '+videoTitle);//document.querySelector('title').innerHTML)
                    },2000);
                }else{
                    try{
                        videoTitle=titel_holen();
                        if(videoTitle==''){
                            videoTitle= document.getElementsByTagName('title')[0].innerHTML;
                        }
                    }catch(e){
                        videoTitle=document.getElementsByTagName('title')[0].innerHTML;
                    }
                  //  console.log('titel auslesen '+videoTitle);//document.querySelector('title').innerHTML)
                }
                setTimeout(function(){
                    if(document.getElementById('www')){
                        document.getElementById('www').remove();
               //         console.log('neuen Button erstellt mit der Farbe '+farbe+' und mit den Videotitle '+videoTitle);
                    }
                    const swb = document.createElement('button');
                    swb.classList.add('ytp-button');
                    swb.classList.add('downloadBTN');
                    swb.id="www";
                    if (j!=1) {
                        if(localStorage.getItem('download_from_fremdserver')=='true'){
                          //  swb.onclick = download;
                             swb.addEventListener('click',function(){
                             download();
                            });
                        }else{
                          //  swb.onclick = download1;
                             swb.addEventListener('click',function(){
                             download1(elm,swb,videoTitle);
                            });
                        }
                    }
                    swb.innerHTML=svg(farbe);
                    elm.appendChild(swb);
                    create_div(swb,videoTitle);
                },3222);
            }

            function create_div(swb,Text){
                const div_element = document.createElement('div');
                div_element.id='download_tooltip';
                if(Text!=''){
                    div_element.innerHTML=Text;
                }else{
                    div_element.innerHTML=titel_holen();
                }
                swb.appendChild(div_element);
            }
            function svg(farbe){
                var svg_ele= `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 320">
                              <rect width="100%" height="100%" fill="none"/>
                              <polyline points="86 110 128 152 170 110" fill="#fff" stroke="${farbe}" stroke-linecap="round" stroke-linejoin="round" stroke-width="24"/>
                              <line x1="128" y1="40" x2="128" y2="152" fill="#fff" stroke="${farbe}" stroke-linecap="round" stroke-linejoin="round" stroke-width="24"/>
                              <path d="M216,152v56a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V152" fill="none" stroke="${farbe}" stroke-linecap="round" stroke-linejoin="round" stroke-width="24"/>
                              </svg>`;
                return svg_ele;
            }
            function titel_holen(){
                try{
                return document.getElementById("above-the-fold").querySelector("#title").innerText == null ? window.location.toString() : document.getElementById("above-the-fold").querySelector("#title").innerText;
                }catch(e){
                    return document.getElementsByTagName('title')[0].innerHTML;
                }
            }
            function url_mutation(elm){
                let previousUrl = '';
                const observer = new MutationObserver(function(mutations) {
                    if (location.href !== previousUrl) {
                        previousUrl = location.href;
                    //    document.getElementById("www").remove();
                 //       console.log('neue url erkannt');
            //            console.log(titel_holen());
                        const vidh='';
                        setTimeout(function(){
                           const vidh=titel_holen();
                           var console_download_debugging=vidh;
                           var console_download_debugging_per=''+(performance.now() - start4) + ' ms.';

                           console_log_value.push({
                               name: console_download_debugging,
                               wert: console_download_debugging_per
                           });
                           if(localStorage.getItem('console_log_debugging_aktivieren')=='true'){
                               console.table(console_log_value);
                           }
                          // console.log(vidh);
                        },2000);

                        setTimeout(function() {
                            if(localStorage.getItem('download_from_fremdserver')=='true'){
                                 createButton(elm,'#ddffe9fc',vidh,2);
                           }else{
                                createButton(elm,'#6fad85',vidh,2);
                           }
                        },3000);
                    }
                });
                const config = {subtree: true, childList: true};
                observer.observe(document, config);
            }
            function waitForElm(selector) {
                return new Promise(resolve => {
                    if (document.querySelector(selector)) {
                        return resolve(document.querySelector(selector));
                    }
                    const observer = new MutationObserver(mutations => {
                        if (document.querySelector(selector)) {
                            observer.disconnect();
                            resolve(document.querySelector(selector));
                        }
                    });
                    observer.observe(document.body, {
                        childList: true,
                        subtree: true
                    });
                });
            }

            waitForElm('.ytp-right-controls').then((elm) => {
                if(localStorage.getItem('download_from_fremdserver')=='true'){
                    url_mutation(elm);
                    createButton(elm,'white',titel_holen(),2);
                }else{
                    function createButton1(elm,videoTitle){
                        url_mutation(elm);
                       // createButton(elm,'yellow',titel_holen(),1);
                        if (videoTitle =='') {
                            setTimeout(function() {
                                createButton(elm,'blue','Kein Downloadlink gefunden',2);
                            }, 10000);
                            console.log("Kein Downloadlink gefunden");
                           var console_download_debugging='Kein Download Link gefunden';
                           var console_download_debugging_per=''+(performance.now() - start4) + ' ms.';

                           console_log_value.push({
                               name: console_download_debugging,
                               wert: console_download_debugging_per
                           });
                           if(localStorage.getItem('console_log_debugging_aktivieren')=='true'){
                               console.table(console_log_value);
                           }
                        }else{
                            createButton(elm,'orange','Klicken um zu downloaden von<br>'+titel_holen(),2);
                        }
                    }
                    createButton1(elm,titel_holen());
                }
            });
            return 4;
        }else{
            return 5;
        }
        return 1;
    }else{
        return 2;
    }
  return 3;
}


var checkboxerweiterungdownloadbuttonaktivieren;
if(localStorage.getItem('download_einblenden')=='true'){
     checkboxerweiterungdownloadbuttonaktivieren ='checked="true"';
}else{
    checkboxerweiterungdownloadbuttonaktivieren ='';
}

var checkboxerweiterungdownloadbuttonfremdserver;
if(localStorage.getItem('download_from_fremdserver')=='true'){
    checkboxerweiterungdownloadbuttonfremdserver ='checked="true"';
}else{
    checkboxerweiterungdownloadbuttonfremdserver ='';
}

if(!erweiterungs_einstellungs_array){
     erweiterungs_einstellungs_array = [];
}
erweiterungs_einstellungs_array.push(['downloadnutton_anzeigen',`<hr>
<label>
    <label style="display:flex;flex-direction:column">
        <p>
            <strong>Downloadbutton Aktivieren</strong>
            <input type="checkbox" id="download_button_aktivieren" ${checkboxerweiterungdownloadbuttonaktivieren}>
            <span>?
                <small>
                    Mit dieser Funktion wird im Player ein Downloadbutton angezeigt ,um das aktuell laufene Video runterladen zu können.
                </small>
            </span>
        </p>
    </label>
        <label style="display:flex;flex-direction:column">
        <p>
            <strong>Direkt-downloaf,oder Fremdserver</strong>
            <input type="checkbox" id="download_button_fremdserver" ${checkboxerweiterungdownloadbuttonfremdserver}>
            <span>?
                <small>
                    Mit dieser Funktion kann beim klick auf den Icon das Video firekt runtergeladen werden
                    ,oder sie werden auf einer dritt Seite weitergeladen,
                    wo sie das Video dann auch runterladen können
                </small>
            </span>
        </p>
    </label>
</label><hr style="height:3px;background:black">`]);
if(!array_script){
	var array_script=[];
}
array_script.push([`
    var downloadbutton_var=document.getElementById('download_button_aktivieren')
    downloadbutton_var.addEventListener('click',function(u){
        if(downloadbutton_var.checked==true){
            localStorage.setItem('download_einblenden',true);
        }else{
            localStorage.setItem('download_einblenden',false);
        }
    })
    var downloadbutton_fremdserver_var=document.getElementById('download_button_fremdserver')
    downloadbutton_fremdserver_var.addEventListener('click',function(u){
        if(downloadbutton_fremdserver_var.checked==true){
            localStorage.setItem('download_from_fremdserver',true);
        }else{
            localStorage.setItem('download_from_fremdserver',false);
        }
    })
`]);

var download_einblenden_an=download_einblenden_anzeigen();
var console_download='________';
var console_download_per='________';
    if(download_einblenden_an==1){
        //  console.log('%c download button aktiviert'+ (performance.now() - start4) + ' ms.','color:green');
        console_download=' download button aktiviert';
        console_download_per=''+(performance.now() - start4) + ' ms.';
    }else if(download_einblenden_an==2){
        //  console.log('%c download button deaktiviert'+ (performance.now() - start4) + ' ms.','color:orange');
        console_download=' download button deaktiviert';
        console_download_per=''+(performance.now() - start4) + ' ms.';
    }else if(download_einblenden_an==3){
        //  console.log('%c cFunctin download button gerufen error '+ (performance.now() - start4) + ' ms.','color:red');
        console_download='Functin download button gerufen error';
        console_download_per=''+(performance.now() - start4) + ' ms.';
    }else if(download_einblenden_an==4){
	    //	console.log('%c download button Watch Seite'+ (performance.now() - start4) + ' ms.','color:green');
        console_download='download button Watch Seite';
        console_download_per=''+(performance.now() - start4) + ' ms.';
	}else if(download_einblenden_an==5){
	    //  console.log('%c download button Keine watch seite'+ (performance.now() - start4) + ' ms.','color:orange');
        console_download='download button Keine watch seite';
        console_download_per=''+(performance.now() - start4) + ' ms.';
	}
    console_log_value.push({
        name: console_download,
        wert: console_download_per
    });