Youtube Loudness Correction

Amplifies any youtube video with loudness lower than 0dB

目前为 2020-04-12 提交的版本,查看 最新版本

  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.0
  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. //from: https://github.com/ytdl-org/youtube-dl/blob/c9595ee78027ecf6bedbdc33c690228fa7d3a5bb/youtube_dl/extractor/youtube.py#L1437
  28.  
  29. var req = new XMLHttpRequest();
  30. req.open(
  31. "GET",
  32. "https://www.youtube.com/watch?v=" +
  33. /v=(.+?)(?:(?:&.*?)|$)/.exec(window.location.href)[1],
  34. false
  35. );
  36. req.send(null);
  37. if (req.status == 200) {
  38. var loudness = JSON.parse(
  39. JSON.parse(
  40. /;ytplayer\.config\s*=\s*({.+?});ytplayer/.exec(req.responseText)[1]
  41. ).args.player_response
  42. ).playerConfig.audioConfig.loudnessDb;
  43. }
  44.  
  45. if (loudness < 0) {
  46. console.log("Loudness Corrected");
  47. loudness = 10 ** ((loudness * -1) / 20);
  48. // from https://stackoverflow.com/questions/43794356/html5-volume-increase-past-100#comment99251398_43794379
  49. if (window["_gainNode"]) {
  50. window["_gainNode"].gain.value = loudness;
  51. return;
  52. }
  53. var v = document.querySelector("video");
  54. var audioCtx = new AudioContext();
  55. var source = audioCtx.createMediaElementSource(v);
  56. var gainNode = audioCtx.createGain();
  57. gainNode.gain.value = loudness;
  58. source.connect(gainNode);
  59. gainNode.connect(audioCtx.destination);
  60. window["_gainNode"] = gainNode;
  61. } else {
  62. if (window["_gainNode"]) {
  63. console.log("Loudness Reset");
  64. window["_gainNode"].gain.value = 1;
  65. return;
  66. }
  67. }
  68. }