Greasy Fork is available in English.

burning series enhancer

Wechselt automatisch zum VOE- oder Vupload-Tab auf burning series und öffnet VOE oder Vupload. Das Tool startet das nächste Video und falls nötig die nächste Staffel, wenn eine Episode beendet wurde.

As of 15.08.2022. See ბოლო ვერსია.

// ==UserScript==
// @name           burning series enhancer
// @name:en        burning series enhancer

// @icon           https://bs.to/favicon.ico
// @author         xtrars
// @description    Wechselt automatisch zum VOE- oder Vupload-Tab auf burning series und öffnet VOE oder Vupload. Das Tool startet das nächste Video und falls nötig die nächste Staffel, wenn eine Episode beendet wurde.
// @description:en Automatically switches to the VOE or Vupload tab on burning series and opens VOE or Vupload. The tool starts the next video and if necessary the next season when an episode is finished.
// @version        8.11
// @run-at         document-body
// @license        GPL-3.0-or-later
// @namespace      https://greasyfork.org/users/140785

// @compatible     chrome Chrome
// @compatible     firefox Firefox
// @compatible     opera Opera
// @compatible     edge Edge
// @compatible     safari Safari

// @grant          GM_setValue
// @grant          GM_getValue
// @grant          GM_addValueChangeListener
// @grant          GM_removeValueChangeListener
// @grant          GM_download
// @grant          GM_info
// @grant          GM_addStyle
// @grant          GM_getResourceText
// @grant          window.close
// @grant          window.focus

// @match          https://bs.to/*
// @match          https://burningseries.co/*
// @match          https://burningseries.sx/*
// @match          https://burningseries.vc/*
// @match          https://burningseries.ac/*
// @match          https://burningseries.cx/*
// @match          https://burningseries.nz/*
// @match          https://burningseries.se/*

// @match          https://vivo.sx/*
// @match          https://vivo.st/*
// @match          https://vupload.com/*
// @match          https://*.vivo.sx/*
// @match          https://*.vivo.st/*
// @match          https://*.megaupload.to/*
// @match          https://*.housecardsummerbutton.com/*

// @include        /^https:\/\/(v-*o-*e|[-unblock\d]){3,15}\.[a-z]{2,3}\/.*/


// @require        https://unpkg.com/video.js@latest/dist/video.min.js
// @require        https://unpkg.com/hls.js@latest/dist/hls.min.js
// @require        https://unpkg.com/plyr@3.7.2/dist/plyr.min.js

// ==/UserScript==

class BaseHandler {
    waitForElement(sSelector, bWaitUnlimited = true) {
        return new Promise(async resolve => {
            if (document.querySelector(sSelector)) {
                return resolve(document.querySelector(sSelector));

            }

            const observer = new MutationObserver(() => {
                if (document.querySelector(sSelector)) {
                    resolve(document.querySelector(sSelector));
                    observer.disconnect();
                }
            });

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

            if (!bWaitUnlimited) {
                setTimeout(() => {
                    resolve(document.querySelector(sSelector));
                    observer.disconnect();
                }, 3000);
            }
        });
    }

    hasUrl(aSelector) {
        let isAvailable = true;
        for (let selector of aSelector) {
            isAvailable = document['location']['href'].search(selector) !== -1;
            if (!isAvailable) {
                return false;
            }
        }
        return true;
    }

    reload(iDelay = 300) {
        setTimeout(() => {
            window.location.reload();
        }, iDelay);
    }

    querySelectorAllRegex(sSelector = '*', sAttribute = 'name', rRegex = /.*/) {
        for (const eElement of document.querySelectorAll(sSelector)) {
            if (rRegex.test(eElement[sAttribute])) {
                return eElement;
            }
        }
        return false;
    }
}

class BurningSeriesHandler extends BaseHandler {
    initGMVariables() {
        if (typeof GM_getValue('bActivateEnhancer') === "undefined") {
            GM_setValue('bActivateEnhancer', false);
        }
        if (typeof GM_getValue('bAutoplayNextEpisode') === "undefined") {
            GM_setValue('bAutoplayNextEpisode', true);
        }
        if (typeof GM_getValue('bAutoplayVideo') === "undefined") {
            GM_setValue('bAutoplayVideo', true);
        }
        if (typeof GM_getValue('bAutoplayNextSeason') === "undefined") {
            GM_setValue('bAutoplayNextSeason', true);
        }
        if (typeof GM_getValue('bAutoplayRandomEpisode') === "undefined") {
            GM_setValue('bAutoplayRandomEpisode', false);
        }
        if (typeof GM_getValue('bDownloadVideo') === "undefined") {
            GM_setValue('bDownloadVideo', false);
        }
        if (typeof GM_getValue('bExtraSettings') === "undefined") {
            GM_setValue('bExtraSettings', false);
        }
        if (typeof GM_getValue('bDownloadType') === "undefined") {
            GM_setValue('bDownloadType', true);
        }
        if (typeof GM_getValue('bFirstStart') === "undefined") {
            GM_setValue('bDownloadType', true);
        }
        if (typeof GM_getValue('bSelectHoster') === "undefined") {
            GM_setValue('bSelectHoster', 'voe');
        }
        if (typeof GM_getValue('bSkipStart') === "undefined") {
            GM_setValue('bSkipStart', false);
        }
        if (typeof GM_getValue('bSkipEnd') === "undefined") {
            GM_setValue('bSkipEnd', false);
        }
        if (typeof GM_getValue('bSkipEndTime') === "undefined") {
            GM_setValue('bSkipEndTime', 0);
        }
        if (typeof GM_getValue('bSkipStartTime') === "undefined") {
            GM_setValue('bSkipStartTime', 0);
        }
    }

    hasAnotherHoster() {
        return this.hasUrl([/^https:\/\/(bs.to|burningseries.[a-z]{2,3})\/.*[0-9]{1,3}\/[0-9]{1,3}-.*\/[a-z]+\/(?!Vivo|Vupload|VOE).*/g]);
    }

    isEpisode() {
        return this.hasUrl([/^https:\/\/(bs.to|burningseries.[a-z]{2,3})/g, /[0-9]{1,3}\/[0-9]{1,3}-/g]);
    }

    async clickPlay() {
        return new Promise(async resolve => {
            let playerElem = await this.waitForElement('section.serie .hoster-player').catch(() => {
            });
            let iNumberOfClicks = 0;
            let clickInterval = setInterval(async () => {
                if (playerElem) {
                    if (document.querySelector('section.serie .hoster-player > a') ||
                        document.querySelector('section.serie .hoster-player > iframe') ||
                        iNumberOfClicks > 120 ||
                        this.querySelectorAllRegex('iframe', 'title', /recaptcha challenge/)) {
                        clearInterval(clickInterval);
                        resolve();
                    }
                    iNumberOfClicks++;
                    let clickEvent = new Event('click');
                    clickEvent.which = 1;
                    clickEvent.pageX = 6;
                    clickEvent.pageY = 1;
                    playerElem.dispatchEvent(clickEvent);
                }
            }, 500);
        });
    }

    playNextEpisodeIfVideoEnded(bSetEvent = true) {
        if (!bSetEvent) {
            GM_removeValueChangeListener('isLocalVideoEnded');
            return;
        }
        GM_addValueChangeListener('isLocalVideoEnded', () => {
            if (GM_getValue('isLocalVideoEnded')) {
                GM_setValue('isLocalVideoEnded', false);
                window.focus();
                if (GM_getValue('bAutoplayRandomEpisode')) {
                    let oRandomEpisode = document.querySelector('#sp_right > a');
                    document['location'].replace(oRandomEpisode.href);
                }
                else {
                    let oNextEpisode = document.querySelector('.serie .frame ul li[class^="e"].active ~ li:not(.disabled) a');
                    if (oNextEpisode) {
                        document['location'].replace(oNextEpisode.href);
                    }
                    else if (GM_getValue('bAutoplayNextSeason')) {
                        let oNextSeason = document.querySelector('.serie .frame ul li[class^="s"].active ~ li:not(.disabled) a');
                        if (oNextSeason) {
                            GM_setValue('clickFirstSeason', true);
                            document.location.replace(oNextSeason);
                        }
                    }
                }
            }
        });
    }

    appendOwnStyle() {
        const style = document.createElement('style');
        style.innerHTML = `<style>     
              :root {
              --inner-pl: 14px;
              --inner-bc-before: #2FB536;
              --inner-bc-after: #12A6F6;
              --color: white;
            }
                        
            .xtrars-donate {
                background-color:#12a6f6;
                border-radius:21px;
                border:1px solid #11a4e3;
                display:inline-block;
                cursor:pointer;
                font-weight:bold;
                padding:3px 12px;
                text-decoration:none;
                color: white;
            }
            .xtrars-donate:hover {
                text-decoration:none;
                background-color:#11a4e3;
            }
            
            button.tab {
                background-color: transparent;
                color: white;
                float: left;
                border: none;
                outline: none;
                cursor: pointer;
                padding: 10px;
                padding-top: 7px;
                user-select: none;
            }
            
            @keyframes shake {
                10%, 90% {transform: translate3d(-.5px, 0, 0);}
                20%, 80% {transform: translate3d(1px, 0, 0);}
                30%, 50%, 70% {transform: translate3d(-2px, 0, 0);}
                40%, 60% {transform: translate3d(2px, 0, 0);}
            }
            .onoffswitch {
                z-index: 161;
                position: relative; width: 100%;
            }
            .onoffswitch-label {
                width: calc(100% - 20px);
                display: block;
                overflow: hidden;
                float: left;
            }
            .onoffswitch-label.switcher {
                width: calc(100% - 7px);
            }
            .onoffswitch-inner {
                display: inline-block; width: 200%; margin-left: -100%;
                transition: margin 0.3s ease-in 0s;
            }
                        
            .onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
                margin-left: 0;
            }
            
            .onoffswitch-checkbox.disabled {
                pointer-events: none;
                -webkit-user-select: none; /* Safari */
                user-select: none; /* Standard syntax */
            }
                        
            .onoffswitch-inner:before, .onoffswitch-inner:after {
                display: block; 
                float: left; 
                width: 50%; 
                padding-left: 10px;
                font-size: 10px; 
                font-family: Trebuchet, Arial, sans-serif;
                box-sizing: border-box;
            }
            
            #xtrars-btn {
               float: right;
               background: #12a6f6;
               border-radius: 50%;
               width: 70px;
               height: 70px;
               line-height: 81px;
               text-align: center;
               cursor: pointer;
               animation: shake 1s ease 1s 1 normal;
            }
            
            #xtrars-menu {
               right: 4;
            }
            
            #xtrars-btn-icon {
               color: var(--color);
               width: 70px;
               height: 70px;
               display: inline-block;
               background: no-repeat center url('data:image/png;base64,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');
               background-size: contain;
               clip-path: circle(34px at center);
            }
            
            .onoffswitch-checkbox {
                float: left;
                margin-top: 3px;
                cursor: pointer;
            }
            
            .onoffswitch.disabled { 
                color: grey;            
            }
            
            .xtrars-switch {
                position: relative;
                display: inline-block;
                width: 30px;
                height: 17px;
                margin-top: 6px;
                margin-left: 10px;
            }
            
            .xtrars-switch input { 
                opacity: 0;
                width: 0;
                height: 0;
            }
            
            .xtrars-slider {
                position: absolute;
                cursor: pointer;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                background-color: #ccc;
                -webkit-transition: .4s;
                transition: .4s;
            }
            
            .xtrars-slider:before {
                position: absolute;
                content: "";
                height: 13px;
                width: 15px;
                left: 2px;
                bottom: 2px;
                background-color: white;
                -webkit-transition: .4s;
                transition: .4s;
            }
            
            input:checked + .xtrars-slider {
                background-color: #669900;
            }
            
            input:focus + .xtrars-slider {
                box-shadow: 0 0 1px #669900;
            }
            
            input:checked + .xtrars-slider:before {
                transform: translateX(11px);
            }
            
            .onoffswitch-inner.autoplay:before {
                content: "Video-Autoplay aktiviert";
            }
            .onoffswitch-inner.autoplay:after {
                content: "Video-Autoplay deaktiviert";
            }
            .onoffswitch-inner.auto-next-episode:before {
                content: "Nächste Episode wird automatisch abgespielt";
            }
            .onoffswitch-inner.auto-next-episode:after {
                content: "Nächste Episode wird manuell abgespielt";
            }
            .onoffswitch-inner.enable-enhancer:before {
                content: "burning series enhancer aktiviert";
            }
            .onoffswitch-inner.enable-enhancer:after {
                content: "burning series enhancer deaktiviert";
            }
            .onoffswitch-inner.auto-next-season:before {
                content: "Nächste Staffel wird automatisch abgespielt";
            }
            .onoffswitch-inner.auto-next-season:after {
                content: "Nächste Staffel wird manuell abgespielt";
            }
            .onoffswitch-inner.auto-random-episode:before {
                content: "Nächste folgende Episode wird abgespielt";
            }
            .onoffswitch-inner.auto-random-episode:after {
                content: "Nächste Episode wird zufällig abgespielt";
            }
            .onoffswitch-inner.download:before {
                content: "Downloadfunktion aktiviert";
            }
            .onoffswitch-inner.download:after {
                content: "Downloadfunktion deaktiviert";
            }
            .onoffswitch-inner.download-type:before {
                content: "Video wird heruntergeladen & Stream angeschaut";
            }
            .onoffswitch-inner.download-type:after {
                content: "Video wird heruntergeladen & Stream geschlossen";
            }                    
            .onoffswitch-inner.skip-start:before {
                content: "Anfang des Videos wird x Sekunden übersprungen";
            }
            .onoffswitch-inner.skip-start:after {
                content: "Video spielt von Anfang an";
            }
            .onoffswitch-inner.skip-end:before {
                content: "Video wird x Sekunden vor Ende beendet";
            }
            .onoffswitch-inner.skip-end:after {
                content: "Video spielt bis zum Ende";
            }
            .disabled:after {
                background-color: darkgrey !important;
            }
            .disabled:before {
                background-color: darkgrey !important;
            }
            .hidden {
                visibility: hidden !important;
            }
            
            .xtrars-tabcontent::-webkit-scrollbar {
                width: 10px;
            }
            
            .xtrars-tabcontent::-webkit-scrollbar-track {
                background: #fdfdfd; 
            }
             
            .xtrars-tabcontent::-webkit-scrollbar-thumb {
                background: #12a6f6; 
            }
            
            .xtrars-tabcontent::-webkit-scrollbar-thumb:hover {
                background: #0296d6; 
            }
            
            .xtrars-tabcontent {
                display: none;
                padding: 10px;
                width: 100%;
                height: calc(100% - 60px);
                overflow: auto;
            }
            
            .xtrars-active {
                text-shadow: -0.3px 0 #12a6f6, 0.3px 0 #12a6f6 !important; 
                color: #12a6f6 !important; 
                background-color: rgb(253, 253, 253) !important;
            }
            
            #xtrars-settings-toolbar {
                height: 30px; 
                width: 100%; 
                background-color: #12a6f6; 
                color: white; 
                line-height: 30px;
            }
            
            .xtrars-toolbar-text {
                display: inline-block; 
                margin-left: 10px; 
                user-select: none; 
                width: calc(100% - 125px); 
                text-overflow: ellipsis; 
                overflow: hidden; 
                white-space: nowrap;
            }
            .xtrars-select {
                display: inline; 
                font-size: 10px; 
                padding: 0 8px; 
                border-radius: 0;
                outline: none;
            }
            
            /*Thanks to Aaron Iker https://codepen.io/aaroniker/pen/XyXzYp*/
            .xtrars-search {
                display: inline-table;
                float: right;
                margin-right: 10px;
            }
            .xtrars-search input {
                box-shadow: none;
                border-radius: 0;
                -moz-border-radius: 0;
                -webkit-border-radius: 0;
                background: none;
                border: none;
                outline: none;
                width: 14px;
                min-width: 0;
                padding: 0;
                z-index: 1;
                position: relative;
                line-height: 10px;
                margin: 8px 0;
                font-size: 12px;
                -webkit-appearance: none;
                transition: all 0.6s ease;
                cursor: pointer;
                color: #fff;
            }
            .xtrars-search input + div {
                position: relative;
                height: 14px;
                width: 100%;
                margin: -21px 0 0 0;
            }
            .xtrars-search input + div svg {
                display: block;
                position: absolute;
                height: 14px;
                width: 79px;
                right: 0;
                top: 0;
                fill: none;
                stroke: #fff;
                stroke-width: 1.5px;
                stroke-dashoffset: 271.908;
                stroke-dasharray: 59 212.908;
                transition: all 0.6s ease;
            }
            .xtrars-search input:not(:-moz-placeholder-shown) {
                width: 80px;
                padding: 0 4px;
                cursor: text;
            }
            .xtrars-search input:not(:-ms-input-placeholder) {
                width: 80px;
                padding: 0 4px;
                cursor: text;
            }
            .xtrars-search input:not(:placeholder-shown), .xtrars-search input:focus {
                width: 80px;
                padding: 0 4px;
                cursor: text;
            }
            .xtrars-search input:not(:-moz-placeholder-shown) + div svg {
                stroke-dasharray: 150 212.908;
                stroke-dashoffset: 300;
            }
            .xtrars-search input:not(:-ms-input-placeholder) + div svg {
                stroke-dasharray: 150 212.908;
                stroke-dashoffset: 300;
            }
            .xtrars-search input:not(:placeholder-shown) + div svg, .xtrars-search input:focus + div svg {
                stroke-dasharray: 150 212.908;
                stroke-dashoffset: 300;
            }`.replace('<style>', '');
        document.head.appendChild(style);
    }

    async buildButton() {
        const button = document.createElement("div");
        button.id = 'xtrars-btn';
        button.innerHTML = '<i id="xtrars-btn-icon"></i>';
        await this.waitForElement('.infos').catch(() => {
        });
        document.getElementsByClassName('infos')[0]
            .insertBefore(button, document.getElementsByClassName('infos')[0].firstChild);
    }

    buildSettingsWindow() {
        const settingsWindow = document.createElement("div");
        settingsWindow.innerHTML = `
            <div id="xtrars-settings-toolbar">
                <div class="xtrars-toolbar-text">burning series enhancer - Settings</div>
                <button id="xtrars-settings-close-btn" style="user-select: none; float: right; margin-top: 6px; background-color: transparent; border: none; 
                margin-right: 10px; cursor: pointer; font-weight: bolder; color: white;" onclick="closeSettingsWindow">✕</button>
                
                <div class="xtrars-search">
                    <input class="xtrars-search-input" type="text" placeholder=" ">
                <div>
                        <svg>
                            <use xlink:href="#path">
                        </svg>
                    </div>
                </div>
                    
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 28" id="path">
                        <path d="M32.9418651,-20.6880772 C37.9418651,-20.6880772 40.9418651,-16.6880772 40.9418651,-12.6880772 C40.9418651,-8.68807717 37.9418651,-4.68807717 32.9418651,-4.68807717 C27.9418651,-4.68807717 24.9418651,-8.68807717 24.9418651,-12.6880772 C24.9418651,-16.6880772 27.9418651,-20.6880772 32.9418651,-20.6880772 L32.9418651,-29.870624 C32.9418651,-30.3676803 33.3448089,-30.770624 33.8418651,-30.770624 C34.08056,-30.770624 34.3094785,-30.6758029 34.4782612,-30.5070201 L141.371843,76.386562" transform="translate(83.156854, 22.171573) rotate(-225.000000) translate(-83.156854, -22.171573)"></path>
                    </symbol>
                </svg>            
            </div>
            <div id="xtrars-settings-tabs" 
            style="height: 30px; width: 100%; background-color: #12a6f6; color: white; line-height: 30px">
                <button class="tab xtrars-settings-tabs xtrars-active" data-tab="BS">BS</button>
                <button class="tab xtrars-settings-tabs" data-tab="Streaming">Streaming</button>
<!--                <button class="tab xtrars-settings-tabs" data-tab="Download">Download</button>-->
                <button class="tab xtrars-settings-tabs" data-tab="Info">Info</button>
                
                <label class="xtrars-switch">
                    <input type="checkbox" class="xtrars-onoffswitch">
                    <span class="xtrars-slider"></span>
                </label>
            </div>
            <!-- Tab content -->
            <div id="BS" class="xtrars-tabcontent" style="display: block; overflow: auto;">
                <div class="onoffswitch">
                    <input type="checkbox" name="xtrars-onoffswitch" class="onoffswitch-checkbox xtrars-onoffswitch">
                    <label class="onoffswitch-label" for="xtrars-onoffswitch" 
                        data-search="nächste,episode,wird,automatisch,manuell,abgespielt">
                        <span class="onoffswitch-inner auto-next-episode switch"></span>
                    </label>
                </div>
                <div class="onoffswitch">
                    <input type="checkbox" name="xtrars-onoffswitch" class="onoffswitch-checkbox xtrars-onoffswitch">
                    <label class="onoffswitch-label" for="xtrars-onoffswitch" 
                        data-search="nächste,folgende,episode,wird,zufällig,abgespielt">
                        <span class="onoffswitch-inner auto-random-episode switch"></span>
                    </label>
                </div>
                <div class="onoffswitch">
                    <input type="checkbox" name="xtrars-onoffswitch" class="onoffswitch-checkbox xtrars-onoffswitch">
                    <label class="onoffswitch-label" for="xtrars-onoffswitch" 
                        data-search="nächste,staffel,wird,automatisch,manuell,abgespielt">
                        <span class="onoffswitch-inner auto-next-season switch"></span>
                    </label>
                </div>
                <div class="onoffswitch">
                    <label for="xtrars-onoffswitch" class="onoffswitch-label switcher"
                        data-search="wechselt,zum,vivo,vupload,voe,tab" style="font-size: 10px; float: left;">
                        Wechselt zum
                        <select name="" class="activate-vivo xtrars-select xtrars-onoffswitch" style="width: 100px; max-width: 40%">
                            <option value="voe">VOE</option>
                            <option value="vupload">Vupload</option>
                            <option value="vivo">Vivo</option>
                        </select>
                        -Tab
                    </label>
                </div>
            </div>
            
            <div id="Streaming" class="xtrars-tabcontent">
                <div class="onoffswitch">
                    <input type="checkbox" name="xtrars-onoffswitch" class="onoffswitch-checkbox xtrars-onoffswitch">
                    <label class="onoffswitch-label" for="xtrars-onoffswitch" 
                        data-search="Video,Autoplay,deaktiviert">
                        <span class="onoffswitch-inner autoplay switch"></span>
                    </label>
                </div>      
                <div class="onoffswitch">
                    <input type="checkbox" name="xtrars-onoffswitch" class="onoffswitch-checkbox xtrars-onoffswitch">
                    <label class="onoffswitch-label" for="xtrars-onoffswitch" style="position: relative"
                        data-search="video,überspringt,ueberspringt,uberspringt,x,sekunden,anfang,spielt,von,überspringen,ueberspringen,uberspringen">
                        <span class="onoffswitch-inner skip-start switch"></span>
                        <input class="skip-start" type="text" style="position: absolute; right: 0; top: 1px; height: 16px; min-width: 0; width: 50px; display: none;" 
                            size="3" maxlength="3" 
                            value="${isNaN(GM_getValue('bSkipStartTime')) ? '' : GM_getValue('bSkipStartTime')}">
                    </label>
                </div>                          
                <div class="onoffswitch">
                    <input type="checkbox" name="xtrars-onoffswitch" class="onoffswitch-checkbox xtrars-onoffswitch">
                    <label class="onoffswitch-label" for="xtrars-onoffswitch" style="position: relative"
                        data-search="video,wird,x,sekunden,vor,ende,beendet,spielt,bis,zum,überspringen,ueberspringen,uberspringen,überspringt,ueberspringt,uberspringt">
                        <span class="onoffswitch-inner skip-end switch"></span>
                        <input class="skip-end" type="text" style="position: absolute; right: 0; top: 1px; height: 16px; min-width: 0; width: 50px; display: none;" 
                            size="3" maxlength="3" 
                            value="${isNaN(GM_getValue('bSkipEndTime')) ? '' : GM_getValue('bSkipEndTime')}">
                    </label>
                </div>
            </div>
            
<!--            <div id="Download" class="xtrars-tabcontent">-->
<!--                <div class="onoffswitch">-->
<!--                    <input type="checkbox" name="xtrars-onoffswitch" class="onoffswitch-checkbox xtrars-onoffswitch">-->
<!--                    <label class="onoffswitch-label" for="xtrars-onoffswitch" -->
<!--                        data-search="downloadfunktion,deaktiviert">-->
<!--                        <span class="onoffswitch-inner download switch"></span>-->
<!--                    </label>-->
<!--                </div>-->
<!--                <div class="onoffswitch">-->
<!--                    <input type="checkbox" name="xtrars-onoffswitch" class="onoffswitch-checkbox xtrars-onoffswitch">-->
<!--                    <label class="onoffswitch-label" for="xtrars-onoffswitch" -->
<!--                        data-search="video,wird,heruntergeladen,und,stream,angeschaut,geschlossen">-->
<!--                        <span class="onoffswitch-inner download-type switch"></span>-->
<!--                    </label>-->
<!--                </div>-->
<!--            </div>        -->
            
            <div id="Info" class="xtrars-tabcontent" style="font-size: 10px;">
                <span style="font-weight: bold;">burning series enhancer by xtrars</span> <br><br>       
                Du magst meine Arbeit und das Projekt erleichtert dir dein Streaming-Leben? 
                Dann spende mir doch einen Kaffee! Nur so kann das Projekt noch lange am Leben bleiben:
                <a class="xtrars-donate" href="https://www.paypal.com/donate/?hosted_button_id=H76K9EAMTW7X8" 
                    target="_blank">Spenden</a>
            </div>
        `;
        settingsWindow.style.cssText = 'display: none;';
        settingsWindow.id = 'xtrars-settings-window';
        document.body.appendChild(settingsWindow);
    }

    dragStart(e) {
        let eSettingsWindow = document.getElementById('xtrars-settings-window');
        let iSettingsWindowLeft = parseInt(window.getComputedStyle(eSettingsWindow).left);
        let iSettingsWindowTop = parseInt(window.getComputedStyle(eSettingsWindow).top);

        if (e.type === "touchstart") {
            document['settingsWindowInitialX'] = e.touches[0].clientX - iSettingsWindowLeft;
            document['settingsWindowInitialY'] = e.touches[0].clientY - iSettingsWindowTop;
        }
        else {
            document['settingsWindowInitialX'] = e.clientX - iSettingsWindowLeft;
            document['settingsWindowInitialY'] = e.clientY - iSettingsWindowTop;
        }
        document['settingsWindowActive'] = true;
    }

    dragEnd() {
        document['settingsWindowActive'] = false;
        let eSettingsWindow = document.getElementById('xtrars-settings-window');
        let iPixels = 2;
        let positionInterval = setInterval(() => {
            if (parseInt(window.getComputedStyle(eSettingsWindow).left) <= 0) {
                eSettingsWindow.style.left = parseInt(eSettingsWindow.style.left) + iPixels + 'px';
            }
            else if (parseInt(window.getComputedStyle(eSettingsWindow).top) <= 0) {
                eSettingsWindow.style.top = parseInt(eSettingsWindow.style.top) + iPixels + 'px';
            }
            else if (parseInt(window.getComputedStyle(eSettingsWindow).right) <= 0) {
                eSettingsWindow.style.left = parseInt(eSettingsWindow.style.left) - iPixels + 'px';
            }
            else if (parseInt(window.getComputedStyle(eSettingsWindow).bottom) <= 0) {
                eSettingsWindow.style.top = parseInt(eSettingsWindow.style.top) - iPixels + 'px';
            }
            else {
                clearInterval(positionInterval);
            }
        }, 1);
    }

    drag(e) {
        e.preventDefault();
        if (!document['settingsWindowActive']) {
            return;
        }
        let eSettingsWindow = document.getElementById('xtrars-settings-window');
        let currentX;
        let currentY;
        if (e.type === "touchmove") {
            currentX = (e.touches[0].clientX - document['settingsWindowInitialX']);
            currentY = (e.touches[0].clientY - document['settingsWindowInitialY']);
        }
        else {
            currentX = (e.clientX - document['settingsWindowInitialX']);
            currentY = (e.clientY - document['settingsWindowInitialY']);
        }

        eSettingsWindow.style.top = currentY + 'px';
        eSettingsWindow.style.left = currentX + 'px';
    }

    showSettingsWindow() {
        let eSettingsWindow = document.getElementById('xtrars-settings-window');
        // Vorher schonmal setzen, damit korrekte Breite und Höhe berechnet werden kann
        eSettingsWindow.style.cssText = `height: 160px; width: 500px; max-width: calc(100% - 5px); 
            max-height: calc(100% - 5px); display: block; position: fixed;`;
        eSettingsWindow.style.cssText = `height: 160px; width: 500px; max-width: calc(100% - 5px); 
            max-height: calc(100% - 5px); display: block; position: fixed; 
            top: calc(50% - ${(parseInt(window.getComputedStyle(eSettingsWindow).height) / 2) + 'px'}); 
            left: calc(50% - ${(parseInt(window.getComputedStyle(eSettingsWindow).width) / 2) + 'px'}); 
            background-color: #fdfdfd; box-shadow: rgba(0, 0, 0, .4) 1px 1px 10px 5px; z-index: 2147483640;`
    }

    showTabContent(sTab) {
        let eTabContent = document.querySelectorAll('.xtrars-tabcontent');
        eTabContent.forEach(item => {
            item.style.display = 'none';
        });

        document.getElementById(sTab).style.display = 'block';
    }

    initEvents() {
        let eButton = document.getElementById('xtrars-btn');
        let eToolbar = document.getElementById('xtrars-settings-toolbar');
        let eSettingsWindow = document.getElementById('xtrars-settings-window');
        let eTabs = document.querySelectorAll('.xtrars-settings-tabs');

        let activateEnhancer = document.querySelector('#xtrars-settings-tabs .xtrars-onoffswitch');

        let bsCheckboxes = document.querySelectorAll('#BS .xtrars-onoffswitch');
        let streamingCheckboxes = document.querySelectorAll('#Streaming .xtrars-onoffswitch');
        let downloadCheckboxes = document.querySelectorAll('#Download .xtrars-onoffswitch');


        let autoplayNextEpisode = bsCheckboxes[0]; //auto-next-episode
        let autoplayRandomEpisode = bsCheckboxes[1]; //auto-random-episode
        let autoplayNextSeason = bsCheckboxes[2]; //auto-next-season
        let selectHoster = bsCheckboxes[3]; //

        let autoplayVideo = streamingCheckboxes[0]; //autoplay
        let skipStart = streamingCheckboxes[1]; //skip-start
        let skipEnd = streamingCheckboxes[2]; //skip-end

        let downloadVideo = downloadCheckboxes[0]; //download
        let downloadType = downloadCheckboxes[1]; //download-type

        let skipStartInput = document.querySelector('input.skip-start');
        let skipEndInput = document.querySelector('input.skip-end');

        let searchInput = document.querySelector('.xtrars-search-input');

        eTabs.forEach(item => {
            item.addEventListener('click', e => {
                eTabs.forEach(tab => {
                    tab.classList.remove('xtrars-active');
                });
                e.target.classList.add('xtrars-active');
                this.showTabContent(e.target.dataset.tab);
            });
        });

        !eButton || eButton.addEventListener('click', () => {
            this.showSettingsWindow();
            if (GM_getValue('bFirstStart')) {
                GM_setValue('bFirstStart', false);
                document.getElementsByClassName('xtrars-switch')[0].style.animation =
                    'shake 1s ease 1s 1 normal;'
            }
            document.addEventListener("touchmove", this.drag, {passive: false});
            document.addEventListener("mousemove", this.drag, {passive: false});
        });

        !eToolbar || eToolbar.addEventListener("touchstart", this.dragStart, {passive: false});
        !eToolbar || eToolbar.addEventListener("mousedown", this.dragStart, {passive: false});
        document.addEventListener("touchend", this.dragEnd, {passive: false});
        document.addEventListener("mouseup", this.dragEnd, {passive: false});
        document.addEventListener("contextmenu", this.dragEnd, {passive: false});

        !document.getElementById('xtrars-settings-close-btn') ||
        document.getElementById('xtrars-settings-close-btn').addEventListener('click', () => {
            document.removeEventListener("touchmove", this.drag);
            document.removeEventListener("mousemove", this.drag);
            eSettingsWindow.style.cssText = 'display: none;';
        });

        let oManagedButtons = {
            'activateEnhancer': activateEnhancer,
            'autoplayNextEpisode': autoplayNextEpisode,
            'autoplayRandomEpisode': autoplayRandomEpisode,
            'autoplayNextSeason': autoplayNextSeason,
            'autoplayVideo': autoplayVideo,
            'downloadVideo': downloadVideo,
            'downloadType': downloadType,
            'selectHoster': selectHoster,
            'skipStart': skipStart,
            'skipEnd': skipEnd,
        };

        this.manageButtonState(oManagedButtons);

        !activateEnhancer || activateEnhancer.addEventListener('change', () => {
            GM_setValue('bActivateEnhancer', activateEnhancer ? activateEnhancer.checked : false);
            this.manageButtonState(oManagedButtons);
            this.reload();
        });


        !autoplayNextEpisode || autoplayNextEpisode.addEventListener('change', () => {
            GM_setValue('bAutoplayNextEpisode', autoplayNextEpisode ? autoplayNextEpisode.checked : false);
            this.manageButtonState(oManagedButtons);
        });

        !autoplayRandomEpisode || autoplayRandomEpisode.addEventListener('change', () => {
            GM_setValue('bAutoplayRandomEpisode', autoplayRandomEpisode ? !autoplayRandomEpisode.checked : false);
            this.manageButtonState(oManagedButtons);
        });

        !autoplayNextSeason || autoplayNextSeason.addEventListener('change', () => {
            GM_setValue('bAutoplayNextSeason', autoplayNextSeason ? autoplayNextSeason.checked : false);
        });

        !autoplayVideo || autoplayVideo.addEventListener('change', () => {
            GM_setValue('bAutoplayVideo', autoplayVideo ? autoplayVideo.checked : false);
            this.manageButtonState(oManagedButtons);
        });

        !selectHoster || selectHoster.addEventListener('change', () => {
            GM_setValue('bSelectHoster', selectHoster.value);
        });

        !skipStart || skipStart.addEventListener('change', () => {
            GM_setValue('bSkipStart', skipStart ? skipStart.checked : false);
            let skipStartInput = document.querySelector('input.skip-start');
            (skipStart ? skipStart.checked : false) ?
                skipStartInput.style.display = "block" : skipStartInput.style.display = "none";
        });

        !skipEnd || skipEnd.addEventListener('change', () => {
            GM_setValue('bSkipEnd', skipEnd ? skipEnd.checked : false);
            let skipEndInput = document.querySelector('input.skip-end');
            (skipEnd ? skipEnd.checked : false) ?
                skipEndInput.style.display = "block" : skipEndInput.style.display = "none";
        });

        !skipEndInput || skipEndInput.addEventListener('keyup', (e) => {
            e.target.value = isNaN(parseInt(e.target.value)) ? '' : parseInt(e.target.value);
            GM_setValue('bSkipEndTime', parseInt(e.target.value));
        });

        !skipStartInput || skipStartInput.addEventListener('keyup', (e) => {
            e.target.value = isNaN(parseInt(e.target.value)) ? '' : parseInt(e.target.value);
            GM_setValue('bSkipStartTime', parseInt(e.target.value));
        });


        !downloadVideo || downloadVideo.addEventListener('change', () => {
            GM_setValue('bDownloadVideo', downloadVideo ? downloadVideo.checked : false);
            this.manageButtonState(oManagedButtons);

            if (GM_info['downloadMode'] !== 'browser' && downloadVideo ? downloadVideo.checked : false) {
                alert('Downloadfunktion nicht im Userscript-Manager aktiviert!');
            }
        });
        !downloadType || downloadType.addEventListener('change', () => {
            GM_setValue('bDownloadType', downloadType ? downloadType.checked : false);
            this.manageButtonState(oManagedButtons);
        });


        let iPixels = 2;
        window.addEventListener('resize', () => {
            let positionInterval = setInterval(() => {
                if (parseInt(window.getComputedStyle(eSettingsWindow).left) <= 0) {
                    eSettingsWindow.style.left = parseInt(eSettingsWindow.style.left) + iPixels + 'px';
                }
                else if (parseInt(window.getComputedStyle(eSettingsWindow).top) <= 0) {
                    eSettingsWindow.style.top = parseInt(eSettingsWindow.style.top) + iPixels + 'px';
                }
                else if (parseInt(window.getComputedStyle(eSettingsWindow).right) <= 0) {
                    eSettingsWindow.style.left = parseInt(eSettingsWindow.style.left) - iPixels + 'px';
                }
                else if (parseInt(window.getComputedStyle(eSettingsWindow).bottom) <= 0) {
                    eSettingsWindow.style.top = parseInt(eSettingsWindow.style.top) - iPixels + 'px';
                }
                else {
                    clearInterval(positionInterval);
                }
            }, 1);
        });

        !searchInput || searchInput.addEventListener('keyup', this.search);
    }

    search(e) {
        let bHasSearchWord;
        let iIndex = -1;
        let iTabIndex = 0;
        let eTabs = document.querySelectorAll('.xtrars-settings-tabs');

        for (const eTab of eTabs) {
            eTab.style.removeProperty('color');
        }

        for (const eElement of document.querySelectorAll('.onoffswitch-label')) {
            eElement.style.removeProperty('outline');
            bHasSearchWord = true;
            for (const sSearchWord of e.target.value.toLowerCase().split(' ').filter((e) => e !== '')) {
                let aSearchKeywords = eElement.dataset.search.toLowerCase().split(',')
                iIndex = 0;
                for (const sSearchKeyword of aSearchKeywords) {
                    iIndex++;
                    if (bHasSearchWord && sSearchKeyword.includes(sSearchWord)) {
                        break;
                    }
                    if (iIndex >= aSearchKeywords.length) {
                        eElement.style.removeProperty('outline');
                        bHasSearchWord = false;
                    }
                }
            }
            if (bHasSearchWord && iIndex !== -1) {
                eElement.style.setProperty('outline', '1px dashed red', 'important');
                let sTab = eElement.parentElement.parentElement.getAttribute('id');
                for (const eTab of eTabs) {
                    if (sTab === eTab.dataset.tab) {
                        eTab.style.color = 'red';
                        if (iTabIndex === 0) {
                            eTab.click();
                        }
                        iTabIndex++;
                    }
                }
            }
        }
    }

    manageButtonState(oManagedButtons) {
        let activateEnhancer = oManagedButtons['activateEnhancer'];
        let autoplayNextEpisode = oManagedButtons['autoplayNextEpisode'];
        let autoplayRandomEpisode = oManagedButtons['autoplayRandomEpisode'];
        let autoplayNextSeason = oManagedButtons['autoplayNextSeason'];
        let autoplayVideo = oManagedButtons['autoplayVideo'];
        let downloadVideo = oManagedButtons['downloadVideo'];
        let downloadType = oManagedButtons['downloadType'];
        let selectHoster = oManagedButtons['selectHoster'];
        let skipStart = oManagedButtons['skipStart'];
        let skipEnd = oManagedButtons['skipEnd'];

        !activateEnhancer || (activateEnhancer.checked = GM_getValue('bActivateEnhancer'));
        !autoplayNextEpisode || (autoplayNextEpisode.checked = GM_getValue('bAutoplayNextEpisode'));
        !autoplayRandomEpisode || (autoplayRandomEpisode.checked = !GM_getValue('bAutoplayRandomEpisode'));
        !autoplayNextSeason || (autoplayNextSeason.checked = GM_getValue('bAutoplayNextSeason'));
        !autoplayVideo || (autoplayVideo.checked = GM_getValue('bAutoplayVideo'));
        !downloadVideo || (downloadVideo.checked = GM_getValue('bDownloadVideo'));
        !downloadType || (downloadType.checked = GM_getValue('bDownloadType'));
        !selectHoster || (selectHoster.value = GM_getValue('bSelectHoster'));
        !skipStart || (skipStart.checked = GM_getValue('bSkipStart'));
        !skipEnd || (skipEnd.checked = GM_getValue('bSkipEnd'));

        let skipStartInput = document.querySelector('input.skip-start');
        !skipStart || (skipStart.checked ?
            skipStartInput.style.display = "block" : skipStartInput.style.display = "none");
        let skipEndInput = document.querySelector('input.skip-end');
        !skipEnd || (skipEnd.checked ? skipEndInput.style.display = "block" : skipEndInput.style.display = "none");

        if (activateEnhancer ? !activateEnhancer.checked : false) {
            this.disableButton(autoplayVideo);
            this.disableButton(autoplayNextEpisode);
            this.disableButton(autoplayNextSeason);
            this.disableButton(autoplayRandomEpisode);
            this.disableButton(downloadVideo);
            this.disableButton(downloadType);
            this.disableButton(selectHoster);
            this.disableButton(skipStart);
            this.disableButton(skipEnd);
        }
        else {
            this.enableButton(autoplayNextEpisode);
            this.enableButton(downloadVideo);
            this.enableButton(selectHoster);

            if (autoplayNextEpisode ? autoplayNextEpisode.checked : false) {
                this.enableButton(autoplayRandomEpisode);
                this.enableButton(selectHoster);
                this.enableButton(skipStart);
                this.enableButton(skipEnd);
                !skipStart || (skipStart.checked ?
                    skipStartInput.style.display = "block" : skipStartInput.style.display = "none");
                !skipEnd || (skipEnd.checked ?
                    skipEndInput.style.display = "block" : skipEndInput.style.display = "none");
                this.disableButton(autoplayVideo);

                if (autoplayRandomEpisode ? !autoplayRandomEpisode.checked : false) {
                    this.disableButton(autoplayNextSeason);
                }
                else {
                    this.enableButton(autoplayNextSeason);
                }
            }
            else {
                this.disableButton(autoplayRandomEpisode);
                this.disableButton(autoplayNextSeason);
                this.disableButton(selectHoster);
                this.enableButton(autoplayVideo);

                if (autoplayVideo ? autoplayVideo.checked : false) {
                    this.enableButton(skipStart);
                    !skipStart || (skipStart.checked ?
                        skipStartInput.style.display = "block" : skipStartInput.style.display = "none");
                    this.enableButton(skipEnd);
                    !skipEnd || (skipEnd.checked ?
                        skipEndInput.style.display = "block" : skipEndInput.style.display = "none");
                }
                else {
                    this.disableButton(skipStart);
                    skipStartInput.style.display = "none";
                    this.disableButton(skipEnd);
                    skipEndInput.style.display = "none";
                }
            }

            if (downloadVideo ? downloadVideo.checked : false) {
                this.enableButton(downloadType);
            }
            else {
                this.disableButton(downloadType);
            }
        }
    }

    disableButton(oElement) {
        if (!oElement) return;

        if (oElement &&
            oElement.parentElement.childNodes[3] &&
            oElement.parentElement.childNodes[3].childNodes[1] &&
            oElement.parentElement.childNodes[3].childNodes[1].classList.contains('auto-next-episode')) {
            this.playNextEpisodeIfVideoEnded(false);
        }

        oElement.classList.add('disabled');
        oElement.parentElement.classList.add('disabled');
        oElement.disabled = true;
    }

    enableButton(oElement) {
        if (!oElement) return;

        oElement.classList.remove('disabled');
        oElement.parentElement.classList.remove('disabled');
        oElement.disabled = false;
    }

    async skipUnavailable(aHosterOrder) {
        let hoster = await this.waitForElement(`.hoster-tabs .hoster.${aHosterOrder[0]}`, false);
        if (hoster !== null) {
            document['location'].replace(document['location']['href'] + '/' + aHosterOrder[0]);
        }
        else {
            hoster = await this.waitForElement(`.hoster-tabs .hoster.${aHosterOrder[1]}`, false);
            if (hoster !== null) {
                document['location'].replace(document['location']['href'] + '/' + aHosterOrder[1]);
            }
            else {
                document['location'].replace(document['location']['href'] + '/' + aHosterOrder[2]);
            }
        }
    }
}

class StreamingHandler extends BaseHandler {
    appendOwnStyle() {
        let style = document.createElement('style');
        style.innerHTML = `<style>
            @media screen and (max-width: 800px) {
              #xtrars-warning-window {
                width: calc(100% - 10px)  !important;
              }
            }
            
            #xtrars-warning-window {
                position: absolute; 
                top: 20%; 
                left: 50%;
                transform: translateX(-50%); 
                width: 50%; 
                background-color: white;
            }`.replace('<style>', '');
        document.head.appendChild(style)
    }

    async handleBsVideo(sActiveTab, aToBeChecked) {
        for (const regexHoster of aToBeChecked) {
            if (regexHoster.test(sActiveTab)) {
                let eIframe = await this.waitForElement('section.serie .hoster-player > iframe');
                let sSrc = eIframe.src;
                window.open(sSrc, '_blank').focus();
                eIframe.remove();
                let eHosterplayer = await this.waitForElement('.hoster-player');
                eHosterplayer.innerHTML = `
                    <h2 class="">Dein Stream ist jetzt bereit</h2>
                    <div class="play" style="display: none;"></div>
                    <div class="loading" style="display: none;">
                        <div class="wrapper">
                            <div class="line"></div>
                        </div>
                        <div class="wrapper">
                            <div class="line"></div>
                        </div>
                        <div class="wrapper">
                            <div class="line"></div>
                        </div>
                        <div class="wrapper">
                            <div class="line"></div>
                        </div>
                        <div class="wrapper">
                            <div class="line"></div>
                        </div>
                    </div>
                    <a href="${sSrc}" target="_blank" rel="noreferrer">${sSrc}</a>
                `;
                break;
            }
        }
    }

    applyShortcuts() {
        document.addEventListener('keydown', this.shortcuts);
    }

    shortcuts(e) {
        if (!e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {
            switch (e.keyCode) {
                case 37: // Left
                    e.preventDefault();
                    document['localVideo'].currentTime -= 1;
                    break;
                case 38: // Up
                    e.preventDefault();
                    if (document['localVideo'].volume < 0.9) {
                        document['localVideo'].volume += 0.1;
                    }
                    else {
                        document['localVideo'].volume = 1;
                    }
                    break;
                case 39: // Right
                    e.preventDefault();
                    document['localVideo'].currentTime += 1;
                    break;
                case 40: // Down
                    e.preventDefault();
                    if (document['localVideo'].volume > 0.1) {
                        document['localVideo'].volume -= 0.1;
                    }
                    else {
                        document['localVideo'].volume = 0;
                    }
                    break;
                case 70: // F
                    if (!document.fullscreenElement) {
                        document['localVideo'].requestFullscreen().catch(() => {
                            document['localVideo'].style.width = "100%";
                            document['localVideo'].style.height = "100%";
                            document.body.style.margin = "0px";
                        });
                    }
                    else {
                        document.exitFullscreen().catch(() => {
                        });
                    }
                    break;
                case 75: // K
                    if (document['localVideo'].paused) {
                        document['localVideo'].play();
                    }
                    else {
                        document['localVideo'].pause();
                    }
                    break;
                case 77: // M
                    document['localVideo'].muted = !document['localVideo'].muted;
                    break;
            }
        }
    }

    bIsPlaying = false;

    async isStreamingHoster(regex, selector) {
        return this.hasUrl([regex]) && await this.waitForElement(selector).catch(() => {
        });
    }

    async findOutStreamingHoster(aHoster) {
        for (let oHoster of aHoster) {
            if (await this.isStreamingHoster(oHoster['regex'], oHoster['selector'])) {
                let video = await this.waitForElement(oHoster['selector'] + oHoster['detailSelector'])
                    .catch(() => {
                    });
                await this.setStreamBehavior(oHoster, video);
            }
        }
    }

    async handleLocalVideo() {
        if (!GM_getValue('bAutoplayNextEpisode') && !GM_getValue('bAutoplayVideo')) {
            return;
        }

        let video = await this.waitForElement('html head ~ body video').catch(() => {
        });

        // Fängt Event ab und verhindert, dass untergeordnete Elemente auf das Event reagieren können (somit werden Popups verhindert)
        window.addEventListener('click', (event) => {
            event.stopImmediatePropagation();
        }, true);


        document.addEventListener('AutoplayWarningShowed', () => {
            if (this.bIsPlaying === true) {
                let warningWindow = document.getElementById('xtrars-warning-window');
                if (warningWindow) {
                    warningWindow.style.display = "none";
                }
            }
        });

        document['localVideo'] = video;
        video.addEventListener('loadeddata', () => {
            this.applyShortcuts();
            video.addEventListener('play', () => {
                this.bIsPlaying = true;
                let warningWindow = document.getElementById('xtrars-warning-window');
                if (warningWindow) {
                    warningWindow.style.display = "none";
                }
            });

            if (GM_getValue('bSkipStart') && GM_getValue('bSkipStartTime')) {
                video.currentTime = GM_getValue('bSkipStartTime');
            }

            if (!GM_getValue('bSkipEnd') || GM_getValue('bSkipEndTime') >= video.duration) {
                video.addEventListener('waiting', () => {
                    if (video.currentTime + 2 >= video.duration) {
                        setTimeout(() => {
                            GM_setValue('isLocalVideoEnded', true);
                            window.close();
                        }, 2e3);
                    }
                });
                // Wird vom aktuellen Player in Verbindung mit Autoplay nicht unterstützt
                // video.addEventListener('ended', () => {
                //     GM_setValue('isLocalVideoEnded', true);
                //     window.close();
                // });
            }
            else {
                video.addEventListener('timeupdate', () => {
                    if (video.currentTime + GM_getValue('bSkipEndTime') >= video.duration) {
                        GM_setValue('isLocalVideoEnded', true);
                        window.close();
                    }
                });
            }
        });


        video.style.width = "100%";
        video.style.height = "100%";
        document.body.style.margin = "0px";
        video.requestFullscreen().catch(() => {
        });
    }

    detectBrowser() {
        // BIG thanks to Rob W https://stackoverflow.com/a/9851769/8887112
        let bIsChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
        let isEdge = bIsChrome && (navigator.userAgent.indexOf("Edg") !== -1);
        let bIsFirefox = typeof InstallTrigger !== 'undefined';
        let bIsOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
        let bIsSafari = /constructor/i.test(window.HTMLElement) || (function (p) {
            return p.toString() === "[object SafariRemoteNotification]";
        })(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification));

        if (isEdge) return 'edge';
        if (bIsChrome) return 'chrome';
        if (bIsFirefox) return 'firefox';
        if (bIsOpera) return 'opera';
        if (bIsSafari) return 'safari';
        return 'none';
    }

    async setStreamBehavior(oHoster, video) {
        let aMatch = video['src'].match(/^blob:https:\/\//g)
        let bHasHls = false;
        if (aMatch !== null) {
            this.appendOwnStyle();

            // Extract m3u8 video url and then
            video['src'] = Array.from(document.querySelectorAll('script')).filter(item => {
                let match = item.text.match(oHoster['m3u8Regex']);
                return match && match.length;
            }).map(item => item.text.match(oHoster['m3u8Regex'])[0]);


            if (oHoster['hoster'] === 'voe') {
                if (Hls.isSupported()) {
                    let eVideo = document.createElement('video');
                    eVideo.id = 'xtrars-video';
                    let videoSrc = video['src'];
                    document.body.innerHTML = '';
                    document.body.appendChild(eVideo);

                    const config = {
                        enableWorker: false,
                    };
                    let hls = new Hls(config);
                    hls.loadSource(videoSrc);
                    hls.attachMedia(eVideo);

                    eVideo.play().catch(() => {
                        // Autoplay wurde blockiert
                        this.showAutoplayWarning();
                    });
                    hls.startLoad();

                    document.body.style.cssText = 'margin: 0; height: 100%; overflow: hidden';
                    eVideo.style.cssText = 'width: 100%; height: 100%; background-color: black;';
                    eVideo.autoplay = true;
                    eVideo.controls = true;
                }
            }
            else if (oHoster['hoster'] === 'vupload') {
                document.body.innerHTML = `
                        <video id="xtrars-video" preload="true" autoplay>
                            <source src="${video['src']}" type="application/x-mpegURL">
                        </video>
                    `;
                let player = videojs('xtrars-video', {
                    preload: 'auto', controls: 'true', Hls: {
                        GOAL_BUFFER_LENGTH: 120,
                        MAX_GOAL_BUFFER_LENGTH: 240,
                        MAX_BUFFER_LOW_WATER_LINE: 120,
                        BUFFER_LOW_WATER_LINE_RATE: 10,
                        GOAL_BUFFER_LENGTH_RATE: 2,
                        INITIAL_BANDWIDTH: 8194304,
                    },
                });
                document.body.style.backgroundColor = 'black';
                document.querySelector('#xtrars-video_html5_api').controls = 'controls';
                document.querySelector('#xtrars-video').style.cssText = 'width: 100%; height: 100%';
                document.querySelector('#xtrars-video').childNodes
                    .forEach((item, key) => {
                        if (key) {
                            item.style.display = 'none';
                        }
                    });
            }
            return;
        }

        // Wenn es eine nativ abspielbare Videodatei ist
        if (GM_getValue('bDownloadVideo') && GM_info['downloadMode'] === 'browser') {
            GM_download(video['src'], GM_getValue('sEpisodeName') + '.mp4');
            if (!GM_getValue('bDownloadType')) {
                setTimeout(() => {
                    GM_setValue('isLocalVideoEnded', true);
                    window.close();
                }, 3000);
                return;
            }
        }
        if ((GM_getValue('bAutoplayVideo') || GM_getValue('bAutoplayNextEpisode')) &&
            (!GM_getValue('bDownloadVideo') || GM_getValue('bDownloadType'))) {
            window['location'].replace(video['src']);
        }
    }

    showAutoplayWarning() {
        const warningWindow = document.createElement("div");
        warningWindow.id = 'xtrars-warning-window';

        let oContent = {
            chrome: `
                <div style="width: 100%; text-align: center; padding: 5px;">
                    <span style="font-weight: bold; font-size: larger;">Autoplay wurde vom Browser blockiert!</span> <br><br>
                    Zum Aktivieren kopiere den Link in die Adressleiste und aktiviere "Ton"
                    (Es muss Zulassen drin stehen. Automatisch reicht nicht.)
                    <br><br>
                    <input type="text" style="width: calc(100% - 20px); margin: 5px;"
                    value="chrome://settings/content/siteDetails?site=${window.location.protocol}//${window.location.hostname}">
                </div>`,
            firefox: `
                <div style="width: 100%; text-align: center; padding: 5px;">
                    <span style="font-weight: bold; font-size: larger;">Autoplay wurde vom Browser blockiert!</span> <br><br>
                    Zum Aktivieren halte dich an die Bildanleitung:
                    <br><br>
                    <img src="data:image/webp;base64,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" 
                    alt="Klicke oben im Firefox auf das Blockieren-Symbol und aktiviere Autoplay">
                    <br><br>
                </div>`,
            safari: ``,
            aliases: {
                chrome: 'chrome',
                edge: 'chrome',
                firefox: 'firefox',
                none: 'chrome',
                opera: 'chrome',
                safari: 'safari',
            }
        };

        warningWindow.innerHTML = oContent[oContent['aliases'][this.detectBrowser()]];
        document.body.appendChild(warningWindow);
        document.dispatchEvent(new Event('AutoplayWarningShowed'));
    }
}


(async function () {
    'use strict';

    let bsHandler = new BurningSeriesHandler();
    let streamingHandler = new StreamingHandler();

    if (GM_getValue('clickFirstSeason')) {
        GM_setValue('clickFirstSeason', false);
        let sSelector = '.serie > .episodes > tbody > tr:first-child > td:first-child > a:first-child';
        await bsHandler.waitForElement(sSelector);
        document['location'].replace(document.querySelector(sSelector));
    }

    bsHandler.initGMVariables();

    if (bsHandler.isEpisode()) {
        bsHandler.appendOwnStyle();
        await bsHandler.buildButton();
        bsHandler.buildSettingsWindow();
        bsHandler.initEvents();

        if (GM_getValue('bActivateEnhancer') &&
            !bsHandler.hasAnotherHoster() &&
            !bsHandler.hasUrl(['/Vivo']) &&
            !bsHandler.hasUrl(['/Vupload']) &&
            !bsHandler.hasUrl(['/VOE'])) {

            if (GM_getValue('bSelectHoster') === 'voe') {
                await bsHandler.skipUnavailable(['VOE', 'Vupload', 'Vivo']);
            }
            else if (GM_getValue('bSelectHoster') === 'vivo') {
                await bsHandler.skipUnavailable(['Vivo', 'VOE', 'Vupload']);
            }
            else if (GM_getValue('bSelectHoster') === 'vupload') {
                await bsHandler.skipUnavailable(['Vupload', 'VOE', 'Vivo']);
            }
        }

        if (GM_getValue('bActivateEnhancer') &&
            !bsHandler.hasAnotherHoster() &&
            (bsHandler.hasUrl(['/Vivo']) ||
                bsHandler.hasUrl(['/Vupload']) ||
                bsHandler.hasUrl(['/VOE']))) {
            if (GM_getValue('bAutoplayNextEpisode')) {
                GM_setValue('isLocalVideoEnded', false);
                bsHandler.playNextEpisodeIfVideoEnded();
            }
            let oName = await bsHandler.waitForElement('.episode > h2');
            GM_setValue('sEpisodeName', oName['outerText']);
            let eActiveTab = await bsHandler.waitForElement('section.serie .hoster-tabs .active a');
            await bsHandler.clickPlay();
            await streamingHandler.handleBsVideo(eActiveTab['innerText'], [/Vupload/, /VOE/]);
        }
    }

    if (GM_getValue('bActivateEnhancer')) {
        let aHoster = [{
            regex: /^(https:\/\/housecardsummerbutton.com\/)|https:\/\/(v-*o-*e|[-unblock\d]){3,15}\.[a-z]{2,3}\//g,
            selector: '#voe-player',
            detailSelector: '[src]',
            hoster: 'voe',
            m3u8Regex: /(?<="hls": ")https:\/\/.*\.m3u8(?=",)/g,
        }, {
            regex: /^https:\/\/vupload\.[a-z]{2,3}\//g,
            selector: '#vjsplayer_html5_api',
            detailSelector: '[src]',
            hoster: 'vupload',
            m3u8Regex: /(?<=sources.*)https:\/\/.*\.m3u8(?=",[ ]+type)/g,
        }, {
            regex: /^https:\/\/vivo\.[a-z]{2,3}\//g,
            selector: 'video:not(#player)',
            detailSelector: ' > source',
            hoster: 'vivo',
        },];
        await streamingHandler.findOutStreamingHoster(aHoster);
        await streamingHandler.handleLocalVideo();
    }
})();