// ==UserScript== // @name volume_Twitter_video_player // @namespace http://tampermonkey.net/ // @version 1.02.25 // @description the script saves and applies your set volume level, when it is off or suddenly too loud! // @author 6iri6r6r // @license MIT // @match https://x.com/* // @icon https://avatars.mds.yandex.net/i?id=062579e45305ee7dff7c7b26c4dd7bdced335bbc-16398073-images-thumbs&n=13 // @grant GM_getValue // @grant GM_setValue // @downloadURL none // ==/UserScript== (function () { const STORAGE_KEY = "XcomTwitter_video_player_Volume"; let savedVolume = GM_getValue(STORAGE_KEY, 0.5); // По умолчанию 50% // Логируем загруженную громкость console.log("[TwitterVolumeFix] Загружена громкость:", savedVolume); // Сохраняем громкость при её изменении function saveVolume(volume) { savedVolume = volume; GM_setValue(STORAGE_KEY, volume); console.log("[TwitterVolumeFix] Сохранена громкость:", volume); } // Применяем сохранённую громкость к видео function applyVolume(video) { if (!video) return; video.volume = savedVolume; video.muted = false; console.log("[TwitterVolumeFix] Применена громкость:", savedVolume); } // Подключаем обработчики к конкретному видео function attachVideoHandlers(video) { if (!video.dataset.volumeHandlerAttached) { video.dataset.volumeHandlerAttached = "true"; // Применяем громкость при загрузке нового ролика video.addEventListener("loadedmetadata", () => applyVolume(video)); video.addEventListener("play", () => applyVolume(video)); // Сохраняем громкость при изменении video.addEventListener("volumechange", () => saveVolume(video.volume)); // Сразу применяем для уже загруженного видео applyVolume(video); } } // Ищем все видео на странице function processVideos() { document.querySelectorAll("video").forEach(attachVideoHandlers); } // Наблюдаем за изменениями DOM (SPA-переходы) const observer = new MutationObserver(() => processVideos()); observer.observe(document.body, { childList: true, subtree: true }); // На случай, если видео уже есть при загрузке processVideos(); })();