Warning: fopen(/www/sites/update.greasyfork.icu/index/store/temp/868bf64e00d2eba15da7d5f09dbfcb45.js): failed to open stream: No space left on device in /www/sites/update.greasyfork.icu/index/scriptControl.php on line 65
// ==UserScript== // @name Kick & YouTube Audio Maximizer // @name:tr Kick & YouTube Ses Dengeleyici // @description:tr Sessiz sesleri yükseltir, yüksek sesleri bastırır. // @description Boosts quiet sounds, compresses loud peaks. // @namespace http://tampermonkey.net/ // @version 1.7 // @author baris // @match *://*.kick.com/* // @match *://kick.com/* // @match *://*.youtube.com/* // @match *://youtube.com/* // @match *://youtu.be/* // @grant none // @license GNU GPLv3 // @downloadURL https://update.greasyfork.icu/scripts/536893/Kick%20%20YouTube%20Audio%20Maximizer.user.js // @updateURL https://update.greasyfork.icu/scripts/536893/Kick%20%20YouTube%20Audio%20Maximizer.meta.js // ==/UserScript== (() => { let ui = null; let audioCtx = null; let currentGain = null; let isDrawing = false; // Gain presets const gainPresets = [1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0]; let currentGainIndex = 3; // Default 2.5 async function initVideo() { const video = document.querySelector('video'); if (!video || video.dataset.maxApplied) return; // YouTube için ekstra kontrol if (window.location.hostname.includes('youtube.com')) { // YouTube video container'ının tam yüklendiğinden emin ol const ytdPlayer = document.querySelector('ytd-player, #movie_player, .html5-video-player'); if (!ytdPlayer) { setTimeout(initVideo, 1000); return; } } video.dataset.maxApplied = '1'; if (!audioCtx) { audioCtx = new AudioContext(); } if (audioCtx.state === 'suspended') { const resume = () => { audioCtx.resume(); window.removeEventListener('click', resume); window.removeEventListener('keydown', resume); }; window.addEventListener('click', resume); window.addEventListener('keydown', resume); } try { const src = audioCtx.createMediaElementSource(video); const comp = audioCtx.createDynamicsCompressor(); comp.threshold.value = -50; comp.knee.value = 30; comp.ratio.value = 20; comp.attack.value = 0.002; comp.release.value = 0.10; const gain = audioCtx.createGain(); gain.gain.value = gainPresets[currentGainIndex]; currentGain = gain; const ana = audioCtx.createAnalyser(); ana.fftSize = 512; const buf = new Uint8Array(ana.fftSize); src.connect(comp); comp.connect(gain); gain.connect(ana); ana.connect(audioCtx.destination); const g = await createUI(); const W = g.canvas.width, H = g.canvas.height; let smooth = 0, peak = 0, peakT = 0; const lerp = (a, b, f) => a + (b - a) * f; isDrawing = true; (function draw() { if (!video.isConnected || !isDrawing) { isDrawing = false; return; } requestAnimationFrame(draw); ana.getByteTimeDomainData(buf); const rms = Math.sqrt(buf.reduce((s, v) => s + ((v - 128) / 128) ** 2, 0) / buf.length); const level = Math.min(rms * gain.gain.value, 1); smooth = lerp(smooth, level, 0.18); const now = performance.now(); if (smooth > peak || now - peakT > 2000) { peak = smooth; peakT = now; } if (now - peakT > 2000) peak = lerp(peak, smooth, 0.05); const hue = lerp(220, 0, smooth); g.clearRect(0, 0, W, H); g.fillStyle = `hsl(${hue} 80% 50%)`; g.fillRect(0, 0, smooth * W, H); g.fillStyle = '#fff'; g.fillRect(peak * W - 1, 0, 2, H); // Gain değerini göster g.fillStyle = '#fff'; g.font = '10px monospace'; g.fillText(`${gain.gain.value.toFixed(1)}x`, W - 25, 12); })(); } catch (error) { console.log('Audio Maximizer: Audio context already in use, retrying...'); video.dataset.maxApplied = ''; setTimeout(() => initVideo(), 2000); } } function createUI() { return new Promise(res => { if (ui) { return res(ui.g); } const waitDOM = () => document.body ? Promise.resolve() : new Promise(inner => { const id = setInterval(() => { if (document.body) { clearInterval(id); inner(); } }, 200); }); waitDOM().then(() => { const wrap = Object.assign(document.createElement('div'), { style: ` position: fixed; bottom: 80px; left: 20px; z-index: 2147483647; background: rgba(0,0,0,0.8); padding: 6px 8px; border-radius: 8px; pointer-events: auto; opacity: 0.1; transition: opacity 0.3s ease; cursor: pointer; user-select: none; `.replace(/\s+/g, ' ') }); wrap.innerHTML = `
🔊 Maximizer by Barış
`; const canvas = Object.assign(document.createElement('canvas'), { width: 300, height: 20, style: 'background:#222;border-radius:6px;display:block;' }); wrap.appendChild(canvas); // Hover efekti wrap.addEventListener('mouseenter', () => { wrap.style.opacity = '1'; }); wrap.addEventListener('mouseleave', () => { wrap.style.opacity = '0.1'; }); // Click ile gain değiştirme wrap.addEventListener('click', (e) => { e.preventDefault(); e.stopPropagation(); currentGainIndex = (currentGainIndex + 1) % gainPresets.length; if (currentGain) { currentGain.gain.value = gainPresets[currentGainIndex]; } // Click efekti wrap.style.transform = 'scale(0.95)'; setTimeout(() => { wrap.style.transform = 'scale(1)'; }, 100); }); // Touch support for mobile wrap.addEventListener('touchstart', (e) => { e.preventDefault(); wrap.style.opacity = '1'; }); wrap.addEventListener('touchend', (e) => { e.preventDefault(); currentGainIndex = (currentGainIndex + 1) % gainPresets.length; if (currentGain) { currentGain.gain.value = gainPresets[currentGainIndex]; } setTimeout(() => { wrap.style.opacity = '0.1'; }, 1000); }); document.body.appendChild(wrap); ui = { wrap: wrap, canvas: canvas, g: canvas.getContext('2d') }; res(ui.g); }); }); } // Video cleanup function function cleanupVideo() { const videos = document.querySelectorAll('video[data-max-applied]'); videos.forEach(video => { if (!video.isConnected) { video.dataset.maxApplied = ''; } }); } // Başlangıç ve dinleyiciler (async () => { // İlk yükleme setTimeout(initVideo, 1000); let lastUrl = location.href; const observerCallback = () => { if (location.href !== lastUrl) { lastUrl = location.href; isDrawing = false; cleanupVideo(); setTimeout(initVideo, 1500); // YouTube için daha uzun bekleme } }; // URL değişimlerini takip et setInterval(observerCallback, 1000); // DOM değişimlerini takip et let timeoutId; new MutationObserver(() => { clearTimeout(timeoutId); timeoutId = setTimeout(initVideo, 500); }).observe(document.body, { childList: true, subtree: true }); // YouTube specific improvements if (window.location.hostname.includes('youtube.com')) { // YouTube navigation events window.addEventListener('yt-navigate-finish', () => { setTimeout(initVideo, 1000); }); // Polymer app navigation window.addEventListener('popstate', () => { setTimeout(initVideo, 1000); }); } })(); })();