YouTube Volume Booster

Custom volume slider for YouTube videos with increased length and precise control

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name            YouTube Volume Booster
// @namespace       https://github.com/ToLIManl
// @version         0.6
// @description:en  Custom volume slider for YouTube videos with increased length and precise control
// @description:ru  Пользовательский ползунок громкости для видео YouTube с увеличенной длиной и точным контролем.
// @description  Custom volume slider for YouTube videos with increased length and precise control
// @author          ToLIMan
// @match           https://www.youtube.com/*
// @grant           none
// @license         MIT
// @name:ru         Увелечитель громкости Ютуб
// @name:en         Youtube Volume Booster
// ==/UserScript==

(function() {
    'use strict';

    // Function to calculate the volume based on slider position
    function calculateVolume(position, sliderWidth) {
        // Calculate volume percentage based on slider position
        const volume = (position / sliderWidth) * 1400; // Increased maximum volume
        // Return the volume percentage with 3 decimal places
        return volume.toFixed(3);
    }

    // Function to update the volume display at the center of the screen
    function updateVolumeDisplay(volume) {
        // Create a div for the volume display
        const volumeDisplay = document.createElement('div');
        volumeDisplay.id = 'customVolumeDisplay';
        volumeDisplay.style.position = 'fixed';
        volumeDisplay.style.top = '50%';
        volumeDisplay.style.left = '50%';
        volumeDisplay.style.transform = 'translate(-50%, -50%)';
        volumeDisplay.style.background = 'rgba(0, 0, 0, 0.7)';
        volumeDisplay.style.color = '#fff';
        volumeDisplay.style.padding = '10px';
        volumeDisplay.style.borderRadius = '5px';
        volumeDisplay.style.zIndex = '9999';
        volumeDisplay.innerText = `Volume: ${volume}%`;

        // Append the volume display to the body
        document.body.appendChild(volumeDisplay);

        // Remove the volume display after 1 second
        setTimeout(() => {
            volumeDisplay.remove();
        }, 1000);
    }

    // Wait for the page to fully load
    window.addEventListener('load', function() {
        // Find the YouTube video player
        const videoPlayer = document.querySelector('.video-stream');

        // Create a custom volume slider
        const customVolumeSlider = document.createElement('input');
        customVolumeSlider.type = 'range';
        customVolumeSlider.min = '0';
        customVolumeSlider.max = '1400'; // Increased maximum volume
        customVolumeSlider.step = '1';
        customVolumeSlider.style.width = '700px'; // Set the width
        customVolumeSlider.style.transform = 'scaleX(-1)'; // Flip the slider horizontally
        customVolumeSlider.style.display = 'none'; // Hide initially

        // Create an AudioContext once on page load
        const audioContext = new (window.AudioContext || window.webkitAudioContext)();
        const gainNode = audioContext.createGain();
        gainNode.connect(audioContext.destination);

        // Connect the video player to the gain node
        const videoSource = audioContext.createMediaElementSource(videoPlayer);
        videoSource.connect(gainNode);

        // Add an event listener for the slider input
        customVolumeSlider.addEventListener('input', function() {
            // Calculate the volume based on the slider position
            const volume = calculateVolume(this.value, this.max);

            // Update the gain node's gain value
            gainNode.gain.value = volume / 100;

            // Update the volume display at the center of the screen
            updateVolumeDisplay(volume);
        });

        // Add an event listener to reset the slider when a new video is opened
        videoPlayer.addEventListener('timeupdate', function() {
            if (videoPlayer.currentTime === 0) {
                resetCustomVolumeSlider();
            }
        });

        // Function to reset the custom volume slider
        function resetCustomVolumeSlider() {
            customVolumeSlider.value = '100'; // Set default value to 100%
            const initialVolume = calculateVolume(100, customVolumeSlider.max);
            gainNode.gain.value = initialVolume / 100;
            updateVolumeDisplay(initialVolume);
        }

        // Function to toggle the visibility of the custom volume slider
        function toggleCustomVolumeSlider() {
            const isSliderHidden = customVolumeSlider.style.display === 'none';
            customVolumeSlider.style.display = isSliderHidden ? 'block' : 'none';
        }

        // Create a custom button for volume boost
        const volumeBoostButton = document.createElement('button');
        volumeBoostButton.id = 'volumeBoostButton';
        volumeBoostButton.style.background = 'none';
        volumeBoostButton.style.border = 'none';
        volumeBoostButton.style.cursor = 'pointer';
        volumeBoostButton.style.marginRight = '10px';
        volumeBoostButton.innerText = 'Volume Boost';
        volumeBoostButton.style.color = '#fff';
        volumeBoostButton.style.fontWeight = 'bold';

        // Add an event listener to toggle the slider when the volume boost button is clicked
        volumeBoostButton.addEventListener('click', function() {
            toggleCustomVolumeSlider();
            resetCustomVolumeSlider();
        });

        // Insert the custom volume slider and button into the YouTube video player controls
        const controls = document.querySelector('.ytp-chrome-controls');
        if (controls) {
            controls.insertBefore(volumeBoostButton, controls.firstChild);
            controls.appendChild(customVolumeSlider);
        }

        // Reset the custom volume slider on page load
        resetCustomVolumeSlider();
    });
})();