Maximum Audio output for Youtube

It will make some of your youtube videos louder, the reason why this is possible is because sometimes you can slide to 100% music output, but youtube validates it in it's javascript to a lower music output then 100%, in this skript I make a new slider which makes your youtube videos always the maximux output when you make your videos on 100%

Versão de: 27/11/2022. Veja: a última versão.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         Maximum Audio output for Youtube
// @namespace    https://greasyfork.org/de/users/777213-tripzz-ѕкιηѕ-lpwsand
// @version      0.6
// @description  It will make some of your youtube videos louder, the reason why this is possible is because sometimes you can slide to 100% music output, but youtube validates it in it's javascript to a lower music output then 100%, in this skript I make a new slider which makes your youtube videos always the maximux output when you make your videos on 100%
// @author       ReconSvG
// @match        https://www.youtube.com/watch*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';
    let volumeSlider = document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > span.ytp-volume-area > div");
    let speakerSymbol = document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > span");
    let currentVolume = document.getElementsByClassName("video-stream")[0].volume;
    let svgAnimationSpeaker = document.getElementsByClassName("ytp-svg-fill ytp-svg-volume-animation-speaker")[0];

    // to get a perfect x.xx pattern
    function pad(volumeSkriptSliderValue) {
        switch (volumeSkriptSliderValue.length) {
            case 1:
                volumeSkriptSliderValue += ".00"
                break;
            case 3:
                volumeSkriptSliderValue += "0";
                break;
        };
        return volumeSkriptSliderValue;
    };

    // place a element on the left side of the reference element
    function insertAfter(referenceNode, newNode) {
        referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
    };

    // get the speaker element of youtube
    let volumeSign = document.getElementsByClassName("ytp-next-button ytp-button")[0];


    // create a new element and append it near the volumeSign symbol, this symbol tells you numerically how loud the video is relative to how loud it can be
    // for example 0.5 tells you it's only 50% loud relative to its maximum output
    var representVolume = document.createElement("span");
    representVolume.setAttribute("id", "represent");
    representVolume.style.color = "#ddd";
    representVolume.textContent = " ?  ";
    representVolume.style.width = "23.354px";
    representVolume.style.textAlign = "center";
    representVolume.style.position = "relative";
    representVolume.style.top = "1px";
    representVolume.style.width = "23px";

    // put the representVolume value on the left side of the volumeSign on youtube
    insertAfter(volumeSign, representVolume);


    // youtube volume slider
    var volumeSkriptSlider = document.createElement("input");
    volumeSkriptSlider.setAttribute("id","volumeSkriptSlider");
    volumeSkriptSlider.setAttribute("type","range");
    volumeSkriptSlider.setAttribute("step","0.01");
    volumeSkriptSlider.setAttribute("min","0");
    volumeSkriptSlider.setAttribute("max","1");

    volumeSkriptSlider.style.position = "relative";
    volumeSkriptSlider.style.marginRight = "3px";

    let styleSlider = document.createElement("style");
    styleSlider.type = 'text/css';

    styleSlider.innerHTML = `
input[type="range"] {
  -webkit-appearance: none;
  appearance: none;
  width: 52px;
  background: transparent;
  cursor: pointer;
}

input[type="range"]::-webkit-slider-runnable-track {
  background: #fff;
  height: 0.3rem;
}

input[type="range"]::-moz-range-track {
  background: #fff;
  height: 0.3rem;
}

input[type="range"]::-webkit-slider-thumb {
   -webkit-appearance: none; /* Override default look */
   appearance: none;
   margin-top: -4px; /* Centers thumb on the track */
   background-color: #FFFF;
   height: 1.2rem;
   width: 1.2rem;
   border-radius: 8px;
}

input[type="range"]::-moz-range-thumb {
    border: none;
    border-radius: 0;
    background-color: #FFFF;
    height: 1.2rem;
    width: 1.2rem;
}

`;
    // Append the styles (the styles on top of this line
    document.getElementsByTagName('head')[0].appendChild(styleSlider);

    // delete original volume slider from youtube
    if (document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > span.ytp-volume-area > div")) {
        document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > span.ytp-volume-area > div").style.display = "none";
    };


    // append our own volume slider to youtube
    speakerSymbol.insertBefore(volumeSkriptSlider, null);


    // update Interval 1ms
    setInterval(() => {

        // if there was a change in volume, then update it
        if (representVolume.textContent !== document.getElementsByClassName("video-stream")[0].toString()) {
            representVolume.textContent = pad(document.querySelector("#volumeSkriptSlider").value);
        };
        /*if (currentVolume.toString().slice(0,4) !== document.getElementsByClassName("video-stream")[0].volume.textContent) {

            // update representVolume each milisecond to it's current volume output
            if (document.getElementsByClassName("video-stream")[0].volume < 1 && document.getElementsByClassName("video-stream")[0].volume > 0) {
                representVolume.textContent = document.getElementsByClassName("video-stream")[0].volume.toString().slice(0,4);
            } else {
                document.getElementsByClassName("video-stream")[0].volume == 1 ? representVolume.textContent = "1.00" : representVolume.textContent = "0.00";
            };
        };*/

        // get the value of the new made slider, and make it the volume value
        document.getElementsByClassName("video-stream")[0].volume = document.querySelector("#volumeSkriptSlider").value;

        // modify speaker symbol to it's normal behavior
        if (document.getElementsByClassName("video-stream")[0].volume < 0.5 && document.getElementsByClassName("video-stream")[0].volume !== 0) {
            document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > span > button").innerHTML = '<svg height="100%" version="1.1" viewBox="0 0 36 36" width="100%"><use class="ytp-svg-shadow" xlink:href="#ytp-id-15"></use><use class="ytp-svg-shadow" xlink:href="#ytp-id-16"></use><defs><clipPath id="ytp-svg-volume-animation-mask"><path d="m 14.35,-0.14 -5.86,5.86 20.73,20.78 5.86,-5.91 z"></path><path d="M 7.07,6.87 -1.11,15.33 19.61,36.11 27.80,27.60 z"></path><path class="ytp-svg-volume-animation-mover" d="M 9.09,5.20 6.47,7.88 26.82,28.77 29.66,25.99 z" transform="translate(0, 0)"></path></clipPath><clipPath id="ytp-svg-volume-animation-slash-mask"><path class="ytp-svg-volume-animation-mover" d="m -11.45,-15.55 -4.44,4.51 20.45,20.94 4.55,-4.66 z" transform="translate(0, 0)"></path></clipPath></defs><path class="ytp-svg-fill ytp-svg-volume-animation-speaker" clip-path="url(#ytp-svg-volume-animation-mask)" d="M8,21 L12,21 L17,26 L17,10 L12,15 L8,15 L8,21 Z M19,14 L19,22 C20.48,21.32 21.5,19.77 21.5,18 C21.5,16.26 20.48,14.74 19,14 Z" fill="#fff" id="ytp-id-15"></path><path class="ytp-svg-fill ytp-svg-volume-animation-hider" clip-path="url(#ytp-svg-volume-animation-slash-mask)" d="M 9.25,9 7.98,10.27 24.71,27 l 1.27,-1.27 Z" fill="#fff" id="ytp-id-16" style="display: none;"></path></svg>';
        } else if (document.getElementsByClassName("video-stream")[0].volume > 0.5) {
            document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > span > button").innerHTML = '<svg height="100%" version="1.1" viewBox="0 0 36 36" width="100%"><use class="ytp-svg-shadow" xlink:href="#ytp-id-15"></use><use class="ytp-svg-shadow" xlink:href="#ytp-id-16"></use><defs><clipPath id="ytp-svg-volume-animation-mask"><path d="m 14.35,-0.14 -5.86,5.86 20.73,20.78 5.86,-5.91 z"></path><path d="M 7.07,6.87 -1.11,15.33 19.61,36.11 27.80,27.60 z"></path><path class="ytp-svg-volume-animation-mover" d="M 9.09,5.20 6.47,7.88 26.82,28.77 29.66,25.99 z" transform="translate(0, 0)"></path></clipPath><clipPath id="ytp-svg-volume-animation-slash-mask"><path class="ytp-svg-volume-animation-mover" d="m -11.45,-15.55 -4.44,4.51 20.45,20.94 4.55,-4.66 z" transform="translate(0, 0)"></path></clipPath></defs><path class="ytp-svg-fill ytp-svg-volume-animation-speaker" clip-path="url(#ytp-svg-volume-animation-mask)" d="M8,21 L12,21 L17,26 L17,10 L12,15 L8,15 L8,21 Z M19,14 L19,22 C20.48,21.32 21.5,19.77 21.5,18 C21.5,16.26 20.48,14.74 19,14 ZM19,11.29 C21.89,12.15 24,14.83 24,18 C24,21.17 21.89,23.85 19,24.71 L19,26.77 C23.01,25.86 26,22.28 26,18 C26,13.72 23.01,10.14 19,9.23 L19,11.29 Z" fill="#fff" id="ytp-id-15"></path><path class="ytp-svg-fill ytp-svg-volume-animation-hider" clip-path="url(#ytp-svg-volume-animation-slash-mask)" d="M 9.25,9 7.98,10.27 24.71,27 l 1.27,-1.27 Z" fill="#fff" id="ytp-id-16" style="display: none;"></path></svg>';
        } else if (document.getElementsByClassName("video-stream")[0].volume == 0) {
            document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > span > button").innerHTML = '<svg height="100%" version="1.1" viewBox="0 0 36 36" width="100%"><use class="ytp-svg-shadow" xlink:href="#ytp-id-139"></use><path class="ytp-svg-fill" d="m 21.48,17.98 c 0,-1.77 -1.02,-3.29 -2.5,-4.03 v 2.21 l 2.45,2.45 c .03,-0.2 .05,-0.41 .05,-0.63 z m 2.5,0 c 0,.94 -0.2,1.82 -0.54,2.64 l 1.51,1.51 c .66,-1.24 1.03,-2.65 1.03,-4.15 0,-4.28 -2.99,-7.86 -7,-8.76 v 2.05 c 2.89,.86 5,3.54 5,6.71 z M 9.25,8.98 l -1.27,1.26 4.72,4.73 H 7.98 v 6 H 11.98 l 5,5 v -6.73 l 4.25,4.25 c -0.67,.52 -1.42,.93 -2.25,1.18 v 2.06 c 1.38,-0.31 2.63,-0.95 3.69,-1.81 l 2.04,2.05 1.27,-1.27 -9,-9 -7.72,-7.72 z m 7.72,.99 -2.09,2.08 2.09,2.09 V 9.98 z" id="ytp-id-139"></path></svg>';
        };
    },1);
})();