NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Panning Audio Slider // @namespace https://openuserjs.org/users/tim1986 // @version 0.1 // @description Panning audio slider for Twitch and Youtube, ads might interfere. // @author @tim1986 // @match http://*.twitch.tv/* // @match https://*.twitch.tv/* // @match http://*.youtube.com/* // @match https://*.youtube.com/* // @exclude http://*.twitch.tv/videos/* // @exclude https://*.twitch.tv/videos/* // @exclude http://player.twitch.tv/*video=* // @exclude https://player.twitch.tv/*video=* // @exclude http://clips.twitch.tv/* // @exclude https://clips.twitch.tv/* // @grant none // @noframes // @run-at document-end // @license MIT // ==/UserScript== // ==OpenUserJS== // @author tim1986 // ==/OpenUserJS== // Animation keyframes generated by Animista http://animista.net /* ---------------------------------------------- * Generated by Animista on 2018-1-11 3:27:2 * w: http://animista.net, t: @cssanimista * ---------------------------------------------- */ /** * ---------------------------------------- * animation fade-in * ---------------------------------------- */ // Slider CSS originally from https://www.w3schools.com/howto/howto_js_rangeslider.asp with necessary changes (function() { 'use strict'; const regex = /(?!\/videos\/.*)/g; setInterval(function(){ if (document.querySelectorAll('#PanValueDisplay').length < 1){ if (document.querySelector('.ytp-live-badge[disabled="true"]') === null || (document.location.host == 'www.twitch.tv' && regex.exec(document.location.pathname))) { var container = document.querySelector('.player, #movie_player.html5-video-player, .html5-video-player'); if (container != null){ console.log('[Panning Audio Slider] This is a live stream. Adding panning audio slider.'); var cssnode = document.createElement('style'); cssnode.innerHTML = '@-webkit-keyframes fade-in{0%{opacity:0;}100%{opacity:1;}}@keyframes fade-in{0%{opacity:0;}100%{opacity:1;}}.slidecontainer{width:40%;position:absolute;top:96%;left:30%;z-index:9999;opacity:0.01;-webkit-animation:fade-in 2s reverse;animation:fade-in 2s reverse;transition:opacity.2s;-webkit-transition:.2s;}.slider{-webkit-appearance:none;width:100%;height:25px;background:#d3d3d3;outline:none;}.slidecontainer:hover{opacity:1;}.slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:25px;height:25px;background:#4CAF50;cursor:pointer;}.slider::-moz-range-thumb{width:25px;height:25px;background:#4CAF50;cursor:pointer;}#PanValueDisplay{position:absolute;top:-58%;left:49%;color:#71c174;z-index:9999;}'; container.appendChild(cssnode); var divnode = document.createElement('div'); divnode.className = 'slidecontainer'; divnode.innerHTML = '<input type="range" min="-100" max="100" value="0" class="slider" id="PanSlider"><p id="PanValueDisplay">0.0</p>'; container.appendChild(divnode); var scriptnode = document.createElement('script'); scriptnode.innerHTML = 'var slider=document.getElementById("PanSlider");var output=document.getElementById("PanValueDisplay");var audioCtx=new(window.AudioContext||window.webkitAudioContext)();var myAudio=document.querySelector("video");var source=audioCtx.createMediaElementSource(myAudio);var panNode=audioCtx.createStereoPanner({pan: 0});slider.oninput=function(){output.innerHTML=this.value/100;panNode.pan.value=this.value/100;};source.connect(panNode);panNode.connect(audioCtx.destination);'; document.body.appendChild(scriptnode); } else { console.log('[Panning Audio Slider] Not a live stream.'); } } else { console.log('[Panning Audio Slider] Not a live stream.'); } } }, 3000); })();