-
-
Save abec2304/2782f4fc47f9d010dfaab00f25e69c8a to your computer and use it in GitHub Desktop.
// ==UserScript== | |
// @name No YouTube Volume Normalization | |
// @namespace https://gist.github.com/abec2304 | |
// @match https://www.youtube.com/* | |
// @grant none | |
// @version 2.1 | |
// @author abec2304 | |
// @description Enjoy YouTube videos at their true volume | |
// @inject-into content | |
// @run-at document-start | |
// @allFrames true | |
// ==/UserScript== | |
(function(recurse) { | |
// try in case script ran later than document-start | |
if(!recurse()) | |
return; | |
// fallback to waiting for video element to be added | |
const videoObserver = new MutationObserver(function(records) { | |
records.forEach(function(mutation) { | |
Array.prototype.forEach.call(mutation.addedNodes, function(node) { | |
if("VIDEO" === node.tagName) { | |
videoObserver.disconnect(); | |
recurse(); | |
} | |
}); | |
}); | |
}) | |
// begin waiting | |
videoObserver.observe(document.documentElement, { | |
subtree: true, | |
childList: true | |
}); | |
})(function() { | |
// get volume bar element | |
const volumeElement = document.querySelector(".ytp-volume-panel"); | |
// get video element | |
const videoElement = document.querySelector(".html5-main-video"); | |
// if elements weren't found, don't continue | |
if(!volumeElement || !videoElement) | |
return 1; | |
// get volume set function and bind to video element | |
const setVolume = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, "volume").set.bind(videoElement); | |
// define convenience function | |
function ytSetVolume(widget) { | |
const newVolume = widget.getAttribute("aria-valuenow") / 100; | |
setVolume(newVolume); | |
} | |
// determine index of video element for non-sandboxed world | |
const globalIndex = [].slice.call(document.getElementsByTagName("video")).indexOf(videoElement); | |
// define function for shadowing the volume field | |
const volumeShadow = function(targetIndex) { | |
const targetVideo = document.getElementsByTagName("video")[targetIndex]; | |
Object.defineProperty(targetVideo, "volume", { | |
value: 42 | |
}); | |
} | |
// inject shadowing script (this breaks the volume bar; fixed below) | |
const contextScript = document.createElement("script"); | |
contextScript.id = "ytvolfix2"; | |
contextScript.textContent = "(" + volumeShadow+ ")(" + globalIndex + ")"; | |
contextScript.onload = function() { | |
// remove script after execution | |
this.parentElement.removeChild(this); | |
}; | |
(document.head || document.documentElement).appendChild(contextScript); | |
// define observer for volume bar change | |
const volumeObserver = new MutationObserver(function(records) { | |
ytSetVolume(records[0].target); | |
}); | |
// register observer to make volume bar function | |
volumeObserver.observe(volumeElement, { | |
attributes: true, | |
attributeFilter: ["aria-valuenow"] | |
}); | |
// set volume to current value of bar | |
ytSetVolume(volumeElement); | |
}); |
https://gist.github.com/fa7ad/fa995474f5cb9fe91fb209686881373d
I used the script from this link and yours at the same time, and everything sounds at the right volume.
Automatically, even without pressing a button!
This script alone is enough to make everything work automatically 😉
FINALLY AFTER YEARS OF SEARCHING AFTER IRIDIUM NUKED ITSELF, MY MUSIC SOUNDS GOOD AGAIN
@AshleighTheCutie Check out Nova Youtube. https://github.com/raingart/Nova-YouTube-extension
It includes the function of this script and many many more things, similar to Iridium.
Ahoy, guys!
DRC is back! It is present on YouTube for Android as "Stable volume" and it is optional.
I am curious whether or not this is present on PC browsers and whether it is optional there as well.
EDIT 2: It seems like DRC is not present at all on music, as far as I can tell (for now):
EDIT 3: I don't see any option on PC to enable it. YouTube links also does not identify more than 2 audio streams (AAC and Opus).
this script isn't working for me, any advice on how to fix this?
thanks
Is there a script out there that removes DRC? This script is no longer effective for removing normalization, at least for me since everything is DRC normalized.
Thanks for the script! I was running Firefox with PulseAudio and noticed how the Volume Tab in PulseAudio always lowered to 66% when skipping through the video. Because my volume is always set to 100% and controlled by external DAC, it was quite annoying. Neither PulseAudio nor Firefox provided adequate solutions to this (e.g. blocking the control), in fac this bug is open for 5 years: https://bugzilla.mozilla.org/show_bug.cgi?id=1422637
So this script really saves the day!