Greasy Fork

Crunchyroll True Fullscreen Fix for Opera GX

Forces video element fullscreen instead of browser fullscreen in Crunchyroll on Opera GX

// ==UserScript==
// @name         Crunchyroll True Fullscreen Fix for Opera GX
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Forces video element fullscreen instead of browser fullscreen in Crunchyroll on Opera GX
// @license      MIT
// @author       theoxl
// @match        https://www.crunchyroll.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Funksjon for å finne den virkelige fullskjermknappen
    function findRealFullscreenButton() {
        // Prøv flere måter å finne knappen på
        const buttons = Array.from(document.querySelectorAll('button'));

        // 1. Søk etter aria-label som inneholder "full screen" eller liknende
        let btn = buttons.find(b => {
            const label = b.getAttribute('aria-label') || '';
            return label.toLowerCase().includes('fullscreen') ||
                   label.toLowerCase().includes('full screen');
        });

        if (btn) return btn;

        // 2. Søk etter SVG som brukes i fullskjermknappen
        btn = buttons.find(b => {
            return b.querySelector('svg path[d*="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"]');
        });

        return btn || null;
    }

    function fixFullscreenButton() {
        const video = document.querySelector('video');
        if (!video) {
            setTimeout(fixFullscreenButton, 1000);
            return;
        }

        const fullscreenBtn = findRealFullscreenButton();
        if (!fullscreenBtn) {
            console.log('Fullskjermknapp ikke funnet, prøver igjen...');
            setTimeout(fixFullscreenButton, 1000);
            return;
        }

        // Sjekk om vi allerede har fikset denne knappen
        if (fullscreenBtn.dataset.fixedByScript) return;
        fullscreenBtn.dataset.fixedByScript = 'true';

        // Lag en kopi for å fjerne eksisterende event listeners
        const newBtn = fullscreenBtn.cloneNode(true);
        fullscreenBtn.parentNode.replaceChild(newBtn, fullscreenBtn);

        newBtn.addEventListener('click', async (e) => {
            e.stopPropagation();
            e.preventDefault();

            try {
                if (video.classList.contains('fullscreen')) {
                    await document.exitFullscreen();
                } else {
                    await video.requestFullscreen();
                }
            } catch (err) {
                console.warn('Fullskjerm feil:', err);
                // Fallback til vanlig fullskjerm hvis video fullskjerm feiler
                if (!document.fullscreenElement) {
                    document.documentElement.requestFullscreen();
                } else {
                    document.exitFullscreen();
                }
            }
        });

        console.log('Fullskjermknappen er nå fikset!');
    }

    // Start observatør for endringer i DOM
    const observer = new MutationObserver((mutations) => {
        if (document.querySelector('video')) {
            fixFullscreenButton();
        }
    });

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

    // Kjør umiddelbart hvis video allerede er lastet
    if (document.querySelector('video')) {
        fixFullscreenButton();
    }
})();