Autopause

Pause videos playing in background tabs when a video starts playing in the foreground tab

// ==UserScript==
// @name         Autopause
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  Pause videos playing in background tabs when a video starts playing in the foreground tab
// @author       Kirill Skliarov
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    start();

    function start() {
        const channel = new BroadcastChannel('AutoPauseInBackgroundTabWhenVideoPlayed');
        const onMessage = () => pauseAllVideos();
        channel.addEventListener('message', onMessage);

        const onPlay = (event) => {
            const isHasAudio = hasAudio(event.target);
            if (isHasAudio) {
                channel.postMessage(null);
            }
        };

        const onMutate = () => reAttachEventListeners();

        const observer = new MutationObserver(onMutate);
        const config = { attributes: false, childList: true, subtree: true };
        observer.observe(document.body, config);

        function reAttachEventListeners() {
            getAllVideos().forEach(video => {
                video.removeEventListener('play', onPlay);
                video.addEventListener('play', onPlay);
            });
        }

        function getAllVideos() {
            return document.querySelectorAll('video');
        }

        function pauseAllVideos() {
            getAllVideos().forEach(video => video.pause());
        }

        function hasAudio(video) {
            return video.mozHasAudio ||
                !!video.webkitAudioDecodedByteCount ||
                (!!video.audioTracks && !!video.audioTracks.length);
        }
    }
})();