Stop all videos

Stops all videos on the page

// ==UserScript==
// @name         Stop all videos
// @namespace    Stop all videos
// @version      1.2
// @description  Stops all videos on the page
// @author       Nameniok
// @match        *://*/*
// @license      MIT
// @grant        none
// ==/UserScript==

(function() {
const config = {
        blockVideoPreload: true,      // Stop video loading
        blockAutoplay: true,          // Stop automatic playback
        addControls: true,            // Add controls to videos
        initialHidden: false,          // Initially hide videos
        showOnPause: false,            // Show videos on pause
        muteAllVideos: true,          // Mute all videos
        blockedExtensions: ['.mp4', '.webm'],  // Blocked extensions
        useIntersectionObserver: false // Use Intersection Observer for video visibility (autoplaing videos on scroll, false to disable, false is better but may cause problems)
    };

    function stopAndDisablePreload(video) {
        video.pause();
        video.removeAttribute('preload');
      console.log('runned stopAndDisablePreload');
    }

    function stopAndDisablePreloadForAllVideos() {
        Array.from(document.querySelectorAll('video')).forEach(video => {
            stopAndDisablePreload(video);
            removeAutoplayAttribute(video);
            addControlsAttribute(video);
            addCanPlayListener(video);
          console.log('runned stopAndDisablePreloadForAllVideos');

            if (config.initialHidden) {
                video.style.visibility = 'hidden';
            }

            video.addEventListener('loadedmetadata', () => {
                stopAndDisablePreload(video);
                removeAutoplayAttribute(video);
                addControlsAttribute(video);
                addCanPlayListener(video);
              console.log('runned stopAndDisablePreloadForAllVideos loadedmetadata');
            });
        });
    }

    function addCanPlayListener(video) {
        video.addEventListener('canplay', () => {
            stopAndDisablePreload(video);
            removeAutoplayAttribute(video);
            addControlsAttribute(video);
          console.log('runned addCanPlayListener canplay');
            if (config.initialHidden) {
                video.style.visibility = 'visible';
            }
        }, { once: true });

        video.addEventListener('loadedmetadata', () => {
            stopAndDisablePreload(video);
            removeAutoplayAttribute(video);
            addControlsAttribute(video);
          console.log('runned addCanPlayListener loadedmetadata');
            if (config.initialHidden) {
                video.style.visibility = 'visible';
            }
        }, { once: true });

        video.addEventListener('pause', () => {
            if (config.showOnPause) {
                video.style.visibility = 'visible';
            }
        });
    }

    function removeAutoplayAttribute(video) {
        if (config.blockAutoplay) {
            video.removeAttribute('autoplay');
            video.removeEventListener('play', preventAutoplay);
            video.addEventListener('play', preventAutoplay, { once: true });
            console.log('runned removeAutoplayAttribute');
        }
    }

    function addControlsAttribute(video) {
    if (config.addControls) {
        video.setAttribute('controls', 'true');
        console.log('runned addControlsAttribute');

        if (config.muteAllVideos) {
            video.setAttribute('muted', 'true');
        }
    }
}

    function preventAutoplay(event) {
        event.preventDefault();
        event.stopPropagation();
      console.log('runned preventAutoplay event');
    }

    function hasBlockedExtension(source) {
    return source && config.blockedExtensions.some(extension => source.endsWith(extension));
}

    function observeVideos(mutationsList) {
        mutationsList.forEach(mutation => {
            if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                mutation.addedNodes.forEach(node => {
                    if (node.tagName && node.tagName.toLowerCase() === 'video') {
                        if (config.blockVideoPreload) {
                            stopAndDisablePreload(node);
                          console.log('runned blockVideoPreload mutationobserver');
                        }
                        if (config.blockAutoplay) {
                            removeAutoplayAttribute(node);
                            addControlsAttribute(node);
                            addCanPlayListener(node);
                          console.log('runned blockAutoplay mutationobserver');

                            const videoSource = node.getAttribute('src');
                            if (hasBlockedExtension(videoSource)) {
                                node.pause();
                                stopAndDisablePreload(node);
                                removeAutoplayAttribute(node);
                                console.log('Blocked video with source:', videoSource);
                                return;
                              console.log('runned hasBlockedExtension mutationobserver');
                            }
                        }
                        if (config.initialHidden) {
                            node.style.visibility = 'hidden';
                        }
                        observeVideoVisibility(node);
                    } else if (node.querySelectorAll) {
                        Array.from(node.querySelectorAll('video')).forEach(video => {
                            if (config.blockVideoPreload) {
                                stopAndDisablePreload(video);
                              console.log('runned blockVideoPreload2 mutationobserver');
                            }
                            if (config.blockAutoplay) {
                                removeAutoplayAttribute(video);
                                addControlsAttribute(video);
                                addCanPlayListener(video);
                              console.log('runned blockAutoplay2 mutationobserver');

                                const videoSource = video.getAttribute('src');
                                if (hasBlockedExtension(videoSource)) {
                                    video.pause();
                                    stopAndDisablePreload(video);
                                    removeAutoplayAttribute(video);
                                    configureVideoPreloadAndAutoplay();
                                    console.log('Blocked video with source:', videoSource);
                                    return;
                                  console.log('runned hasBlockedExtension2 mutationobserver');
                                }
                            }
                            if (config.initialHidden) {
                                video.style.visibility = 'hidden';
                            }
                            observeVideoVisibility(video);
                        });
                    }
                });
            }
        });
    }


    function observeVideoVisibility(video) {
    if (!config.useIntersectionObserver) {
        return; // Skip observation if not configured to use Intersection Observer
    }

    const observer = new IntersectionObserver(entries => {
        entries.forEach(entry => {
            if (entry.isIntersecting) {
                video.play().catch(error => { // change "video.play()" to "video.pause()" if you want
                });
            } else {
                // Video is out of view, pause
                video.pause();
            }
        });
    });

    observer.observe(video);
}

    function initObserver() {
    const observer = new MutationObserver(observeVideos);
    const targetNode = document.documentElement;

    const observerConfig = {
        childList: true,
        subtree: true
    };
    observer.observe(targetNode, observerConfig);
}
document.addEventListener("DOMContentLoaded", function() {
        stopAndDisablePreloadForAllVideos();
        initObserver();
    });
        stopAndDisablePreloadForAllVideos();
        initObserver();
}


)();