// ==UserScript== // @icon https://bs.to/favicon.ico // @name burning series enhancer // @author xtrars // @description Wechselt automatisch zum Vivo-Tab auf burning series enhancer und öffnet Vivo. Wahlweise wird die Video-URL kopiert und der Tab geschlossen oder das Video startet automatisch. Wenn aktiviert, startet das nächste Video, sobald ein Vivo-Video beendet wurde. // @description:en Automatically switches to the Vivo tab on burning series enhancer and opens Vivo. Optionally copies the video url and closes the tab or starts the video automatically. If enabled, the next video starts as soon as a vivo video is finished. // @version 3.7 // @run-at document-start // @license GPL-3.0-or-later // @namespace https://greasyfork.org/users/140785 // @grant GM_setValue // @grant GM_getValue // @grant GM_setClipboard // @grant GM_addValueChangeListener // @grant GM_removeValueChangeListener // @include https://bs.to/* // @include https://burningseries.co/* // @include https://burningseries.sx/* // @include https://burningseries.vc/* // @include https://burningseries.ac/* // @include https://burningseries.cx/* // @include https://vivo.sx/* // @include https://vivo.st/* // @include https://vupload.com/* // @include https://*.vivo.sx/* // @include https://*.vivo.st/* // @include https://*.megaupload.to/* // @downloadURL none // ==/UserScript== class BaseHandler { // thanks to xZaheer (https://greasyfork.org/de/scripts/400669-burningseries-autoplay/code) waitForElement(selector) { return new Promise(async resolve => { if (document.querySelector(selector)) { return resolve(document.querySelector(selector)); } const observer = new MutationObserver(mutations => { if (document.querySelector(selector)) { resolve(document.querySelector(selector)); observer.disconnect(); } }); let waitForElementInterval = setInterval(() => { if(document.body) { observer.observe(document.body, { childList: true, subtree: true, }); clearInterval(waitForElementInterval); } }, 20); }); } 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); } } 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('bAutoplayVivoVideo') === "undefined") { GM_setValue('bAutoplayVivoVideo', true); } } isVivoTab() { return this.hasUrl(['/Vivo']); } hasAnotherHoster() { return this.hasUrl([/^https:\/\/(bs.to|burningseries.[a-z]{2,3})\/.*[0-9]{1,2}\/[0-9]{1,2}\-.*\/[a-z]*\/(?!Vivo).*/g]); } isEpisode() { return this.hasUrl([/^https:\/\/(bs.to|burningseries.[a-z]{2,3})/g, /[0-9]{1,2}\/[0-9]{1,2}\-/g]); } async clickPlay() { let playerElem = await this.waitForElement('section.serie .hoster-player').catch(() => {}); let iNumberOfClicks = 0; let clickInterval = setInterval(() => { if(playerElem) { if (document.querySelector('section.serie .hoster-player > a') || document.querySelector('iframe[title="recaptcha challenge"]') || iNumberOfClicks > 120) { clearInterval(clickInterval); } 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'); GM_setValue('isLocalVideoEnded', false); return; } GM_addValueChangeListener('isLocalVideoEnded', () => { if (GM_getValue('isLocalVideoEnded')) { GM_setValue('isLocalVideoEnded', false); document['location'].replace(document.querySelector('.serie .frame ul li[class^="e"].active + li a').href); } }); } async buildButton() { const style = document.createElement('style'); style.innerHTML = ` :root { --inner-pl: 14px; --inner-bc-before: #2FB536; --inner-bc-after: #12A6F6; --color: white; } @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 { position: relative; width: 350px; -webkit-user-select:none; -moz-user-select:none; -ms-user-select: none; } .onoffswitch-checkbox { position: absolute; opacity: 0; pointer-events: none; } .onoffswitch-label { width: 350px; display: block; overflow: hidden; cursor: pointer; border: 2px solid transparent; border-radius: 20px; } .onoffswitch-inner { display: block; width: 200%; margin-left: -100%; transition: margin 0.3s ease-in 0s; } .onoffswitch-inner:before, .onoffswitch-inner:after { display: block; float: left; width: 50%; height: 30px; padding: 0; line-height: 30px; font-size: 10px; color: white; font-family: Trebuchet, Arial, sans-serif; font-weight: bold; box-sizing: border-box; } .onoffswitch-switch { display: block; width: 23px; margin: 3.5px; background: #FFFFFF; position: absolute; top: 0; bottom: 0; right: 314px; border: 2px solid #999999; border-radius: 20px; transition: all 0.3s ease-in 0s; } .onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner { margin-left: 0; } .onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch { right: 0px; } #xtrars-btn { position: absolute; bottom: 70px; right: 18px; 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-btn:hover { cursor: auto; } #xtrars-menu { right: 0; } #xtrars-btn-icon { color: var(--color); } .onoffswitch-inner.autoplay:before { padding-left: var(--inner-pl); background-color: var(--inner-bc-before); color: var(--color); text-align: start; content: "Vivo Autoplay aktiviert"; } .onoffswitch-inner.autoplay:after { padding-right: var(--inner-pl); background-color: var(--inner-bc-after); color: var(--color); text-align: end; content: "Video-URL wird in die Zwischenablage kopiert"; } .onoffswitch-inner.auto-next-episode:before { padding-left: var(--inner-pl); background-color: var(--inner-bc-before); color: var(--color); text-align: start; content: "Nächste Folge wird automatisch abgespielt"; } .onoffswitch-inner.auto-next-episode:after { padding-right: var(--inner-pl); background-color: var(--inner-bc-after); color: var(--color); text-align: end; content: "Nächste Folge wird manuell abgespielt"; } .onoffswitch-inner.enable-enhancer:before { padding-left: var(--inner-pl); background-color: var(--inner-bc-before); color: var(--color); text-align: start; content: "burning series enhancer aktiviert"; } .onoffswitch-inner.enable-enhancer:after { padding-right: var(--inner-pl); background-color: var(--inner-bc-after); color: var(--color); text-align: end; content: "burning series enhancer deaktiviert"; } `; document.head.appendChild(style); const button = document.createElement("div"); button['innerHTML'] = '