Autopause all

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

// ==UserScript==
// @name         Autopause all
// @namespace    http://tampermonkey.net/
// @version      0.2
// @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';

    const channel = new BroadcastChannel('AutoPauseInBackgroundTabWhenVideoPlayed');
    channel.addEventListener('message', () => pauseAllVideos());
    const postMsg = () => channel.postMessage(null);

    const rebuild = () => {
        getAllVideos().forEach(video => {
            video.removeEventListener('play', postMsg);
            const isHasAudio = hasAudio(video);
            if (isHasAudio) {
                video.addEventListener('play', postMsg);
            }
        });
    };

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

    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);
    }

})();