// ==UserScript== // @name Crunchyroll Auto Skip Intro & Fullscreen Video // @namespace https://greasyfork.org/en/users/807108-jeremy-r // @version 3.2 // @description Automatically clicks the Skip Intro button on Crunchyroll.com when available and makes the video fullscreen // @author JRem // @require https://cdn.jsdelivr.net/gh/mlcheng/js-toast@ebd3c889a1abaad615712485ce864d92aab4c7c0/toast.min.js // @match https://beta.crunchyroll.com/watch/* // @match https://static.crunchyroll.com/vilos-v2/web/vilos/player.html // @grant GM_addStyle // @license MIT // @downloadURL none // ==/UserScript== // Toast Vars const options = { settings: { duration: 3000, }, style: { main: { background: "black", color: "white", width: "auto", 'max-width': '10%', } } }; // Volume Control via mouse scroll // 1 Scroll = 5% function triggerKeypress(e){ e.preventDefault() const keyName = e.deltaY < 0 ? "ArrowUp" : "ArrowDown" const event = new KeyboardEvent("keydown", { key: keyName, bubbles: true, cancelable: true }); document.dispatchEvent(event) iqwerty.toast.toast(keyName, options); } document.addEventListener('keydown', function(e) { console.log(e.key + " pressed"); }); document.getElementById("vilos").addEventListener("wheel", triggerKeypress); // Fullscreen Video Code window.onload = function(){ setTimeout(function () { var css = '.video-player-wrapper { max-height: calc(100vh - 5.625rem) !important; height: calc(100vh) !important; }'; css += '.erc-header { flex: 0 0 1.55rem !important; }'; css += '.erc-header .header-content { height: 0 !important; }'; GM_addStyle(css); }, 5000); iqwerty.toast.toast('Fullscreen added', options); }; // Backup Fullscreen CSS Edit (Depending on page load will execute before the above) setTimeout(function () { var css = '.video-player-wrapper { max-height: calc(100vh - 5.625rem) !important; height: calc(100vh) !important; }'; css += '.erc-header { flex: 0 0 1.55rem !important; }'; css += '.erc-header .header-content { height: 0 !important; }'; GM_addStyle(css);}, 5000); // Functions for Mouse click emulation function simulate(element, eventName){ var options = extend(defaultOptions, arguments[2] || {}); var oEvent, eventType = null; for (var name in eventMatchers) { if (eventMatchers[name].test(eventName)) { eventType = name; break; } } if (!eventType) throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported'); if (document.createEvent) { oEvent = document.createEvent(eventType); if (eventType == 'HTMLEvents') { oEvent.initEvent(eventName, options.bubbles, options.cancelable); } else { oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView, options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element); } element.dispatchEvent(oEvent); } else { options.clientX = options.pointerX; options.clientY = options.pointerY; var evt = document.createEventObject(); oEvent = extend(evt, options); element.fireEvent('on' + eventName, oEvent); } return element; }; function extend(destination, source) { for (var property in source) destination[property] = source[property]; return destination; }; var eventMatchers = { 'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/, 'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/ }; var defaultOptions = { pointerX: 0, pointerY: 0, button: 0, ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, bubbles: true, cancelable: true }; // Check for and click Skip Intro setInterval(function () { if(document.querySelector('div[data-testid="skipIntroText"]') !== null) { simulate(document.querySelector('div[data-testid="skipIntroText"]'), "click"); console.log('Skip Btn Found'); iqwerty.toast.toast('Intro Skipped', options); } }, 1000)