Skip to content
Snippets Groups Projects
bbb-volume-slider.user.js 1.75 KiB
Newer Older
  • Learn to ignore specific revisions
  • Daniel Müller's avatar
    Daniel Müller committed
    // ==UserScript==
    // @name         BBB Volume Slider
    // @website      https://code.fbi.h-da.de/istddmue2/bbb-volume-slider-userscript
    
    // @version      0.2
    
    Daniel Müller's avatar
    Daniel Müller committed
    // @description  Adds a volume slider
    // @author       Daniel Müller
    // @match        https://*.h-da.de/html5client/join*
    // @grant        none
    // ==/UserScript==
    
    
    async function sleep(ms) {
        await new Promise(r => setTimeout(r, ms));
    }
    
    Daniel Müller's avatar
    Daniel Müller committed
    
    
    function getTopRightContainer() {
        return document.querySelector("div[class^=top] div[class^=right]");
    }
    
    function remoteMedia() {
        return document.getElementById("remote-media");
    }
    
    function createVSContainer() {
        let vsc = document.createElement("div");
        vsc.id = "vs-container";
        vsc.style.verticalAlign = "middle";
        vsc.style.marginRight = "20px";
    
    Daniel Müller's avatar
    Daniel Müller committed
    
    
        return vsc;
    }
    
    function createVolumeSlider() {
        let vs = document.createElement("input");
        vs.style.verticalAlign = "middle";
        vs.type = "range";
        vs.min = 1;
        vs.max = 100;
        vs.value = 30;
    
    Daniel Müller's avatar
    Daniel Müller committed
    
        vs.oninput = function() {
    
            remoteMedia().volume = Math.pow(this.value / 100.0, 2);
        }
    
        return vs;
    }
    
    (async function() {
        'use strict';
    
        // Check if the volume already slider exists
        if (document.getElementById("vs-container") != null) return;
    
        // Wait until dynamic DOM content is ready
        while (getTopRightContainer() == null) {
            await sleep(500);
    
    Daniel Müller's avatar
    Daniel Müller committed
        }
    
    
        // Create container & slider
        let container = createVSContainer();
        let slider = createVolumeSlider();
        container.append(slider);
    
        // Update audio volume to default slider value
        slider.oninput();
    
        // Insert the volume slider into the right side of the top bar
        let targetContainer = getTopRightContainer();
        targetContainer.insertBefore(container, targetContainer.firstChild);
    
    Daniel Müller's avatar
    Daniel Müller committed
    
    })();