4lrick / YouTube - Volume Adjuster by 5%

// ==UserScript==
// @name                       YouTube - Volume Adjuster by 5%
// @namespace                  https://gist.github.com/4lrick/0c225473e9609302c6dd6f0dfa4f22a3
// @version                    1.2
// @description                Increments the audio volume of YouTube videos by 5%.
// @description:fr             Augmente le volume des vidéos YouTube de 5%.
// @description:es             Aumenta el volumen de los videos de YouTube en un 5%.
// @description:de             Erhöht die Lautstärke von YouTube-Videos um 5%.
// @description:it             Aumenta il volume audio dei video di YouTube del 5%.
// @description:zh-CN          将YouTube视频的音量增加5%。
// @author                     4lrick
// @match                      https://www.youtube.com/*
// @icon                       https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant                      none
// @license                    GPL-3.0-only
// ==/UserScript==

(function() {
    'use strict';

    let lastVolume = 0;

    function adjustVolume() {
        const player = document.getElementById('movie_player');
        var localStorageData = localStorage.getItem('yt-player-volume');

        if (player) {
            const currentVolume = player.getVolume();
            const remainder = currentVolume % 10;

            if (remainder < 5) {
                player.setVolume(currentVolume - remainder);
            } else if (remainder >= 5) {
                player.setVolume(currentVolume + (5 - remainder));
            }

            lastVolume = player.getVolume();

            if (localStorageData) {
                var dataObject = JSON.parse(localStorageData);
                dataObject.data = JSON.stringify({
                    "volume": lastVolume,
                    "muted": JSON.parse(dataObject.data).muted
                });
                localStorage.setItem('yt-player-volume', JSON.stringify(dataObject));
            } else {
                console.error("'yt-player-volume' not found");
            }
        }
    }

    function checkVideoExists() {
        const videoElement = document.querySelector('video');
        if (videoElement) {
            videoElement.addEventListener('volumechange', adjustVolume);
        }
    }
    const observer = new MutationObserver(checkVideoExists);
    const body = document.body;
    const config = { childList: true, subtree: true };
    observer.observe(body, config);
})();