Youtube Loudness Correction

Amplifies any youtube video with loudness lower than 0dB

  1. // ==UserScript==
  2. // @name Youtube Loudness Correction
  3. // @description Amplifies any youtube video with loudness lower than 0dB
  4. // @namespace Septolum
  5. // @include https://www.youtube.com/*
  6. // @include https://m.youtube.com/*
  7. // @icon https://www.youtube.com/favicon.ico
  8. // @version 1.2
  9. // @grant none
  10. // @run-at idle
  11. // ==/UserScript==
  12.  
  13. // I created this script because Youtube does not amplify quiet videos, it only quietens loud ones
  14.  
  15. // from: https://stackoverflow.com/a/18997637
  16. setInterval(function () {
  17. if (this.lastHrefStr !== location.href || this.lastHrefStr === null) {
  18. this.lastHrefStr = location.href;
  19. console.log("page change");
  20. gmMain();
  21. }
  22. }, 111);
  23.  
  24. function gmMain() {
  25. "use strict";
  26.  
  27. var req = new XMLHttpRequest();
  28. req.open(
  29. "GET",
  30. "https://" +
  31. window.location.host +
  32. "/watch?v=" +
  33. /v=(.+?)(?:(?:&.*?)|$)/.exec(window.location.href)[1],
  34. false
  35. );
  36. req.send(null);
  37. if (req.status == 200) {
  38. var loudness = parseFloat(
  39. /"loudnessDb":([-0-9.]+),/.exec(req.responseText)[1]
  40. );
  41. }
  42.  
  43. if (loudness < 0) {
  44. console.log("Loudness Corrected");
  45. loudness = 10 ** ((loudness * -1) / 20);
  46. // from https://stackoverflow.com/questions/43794356/html5-volume-increase-past-100#comment99251398_43794379
  47. if (window["_gainNode"]) {
  48. window["_gainNode"].gain.value = loudness;
  49. return;
  50. }
  51. var v = document.querySelector("video");
  52. var audioCtx = new AudioContext();
  53. var source = audioCtx.createMediaElementSource(v);
  54. var gainNode = audioCtx.createGain();
  55. gainNode.gain.value = loudness;
  56. source.connect(gainNode);
  57. gainNode.connect(audioCtx.destination);
  58. window["_gainNode"] = gainNode;
  59. } else {
  60. if (window["_gainNode"]) {
  61. console.log("Loudness Reset");
  62. window["_gainNode"].gain.value = 1;
  63. return;
  64. }
  65. }
  66. }