YouTube Age Bypass

shitty but works in 2018 (requires to manually reload page)

  1. // ==UserScript==
  2. // @name YouTube Age Bypass
  3. // @description shitty but works in 2018 (requires to manually reload page)
  4. // @version 1.0.1
  5. // @grant none
  6. // @include https://www.youtube.com/*
  7. // @run-at document-end
  8. // @namespace https://greasyfork.org/users/149768
  9. // ==/UserScript==
  10. (function() {
  11. "use strict";
  12.  
  13. const inject = function() {
  14. "use strict";
  15.  
  16. var overriddenVideo = null
  17.  
  18. function haveVideoData() {
  19. return typeof window.ytInitialPlayerResponse != 'undefined' && window.ytInitialPlayerResponse != null;
  20. }
  21.  
  22. function isCurrentVideoAgeRestricted() {
  23. return typeof window.ytInitialPlayerResponse.playabilityStatus.desktopLegacyAgeGateReason != 'undefined' && window.ytInitialPlayerResponse.playabilityStatus.desktopLegacyAgeGateReason;
  24. }
  25.  
  26. function getVideoId() {
  27. return window.ytInitialPlayerResponse.videoDetails.videoId;
  28. }
  29.  
  30. function removeNode(n) {
  31. if (n != null) n.parentNode.removeChild(n);
  32. }
  33.  
  34. function waitForNodeId(node, cb) {
  35. var ival = setInterval(function(node, cb) {
  36. if (document.getElementById(node) != null) {
  37. clearInterval(ival);
  38. cb();
  39. }
  40. }, 100, node, cb);
  41. }
  42.  
  43. function checkAndUnrestrict() {
  44.  
  45. if (overriddenVideo != null) { // if we have injected a video and navigate away, we need to clean up
  46. console.log("Navigating away from page, removing iframe");
  47. removeNode(overriddenVideo);
  48. }
  49.  
  50. if (!haveVideoData() || !isCurrentVideoAgeRestricted()) {
  51. return;
  52. }
  53.  
  54. console.log("Is video age restricted: " + isCurrentVideoAgeRestricted())
  55.  
  56. waitForNodeId('player-container', function() {
  57. console.log("Found player container");
  58. removeNode(document.getElementById('error-screen'));
  59.  
  60. waitForNodeId('container', function() {
  61. console.log("Found movie player");
  62.  
  63. var oldplayer = document.getElementById('container');
  64. var container = document.querySelector('div.ytd-player');
  65.  
  66. var videoplayer = document.createElement('div');
  67. videoplayer.className = "html5-video-player ytp-transparent ytp-hide-info-bar ytp-large-width-mode iv-module-loaded paused-mode";
  68.  
  69. //
  70.  
  71. var playercontent = document.createElement('div');
  72. playercontent.className = "ytp-player-content ytp-iv-player-content";
  73.  
  74.  
  75. var playerframe = window.document.createElement("iframe");
  76. playerframe.setAttribute("src", "//www.youtube.com/embed/" + getVideoId() + "?autoplay=1&showinfo=0&rel=0");
  77. playerframe.setAttribute("id", "movie_player");
  78. playerframe.setAttribute("frameBorder", "0");
  79. playerframe.setAttribute("width", "100%");
  80. playerframe.setAttribute("height", "100%");
  81.  
  82. container.appendChild(videoplayer);
  83. videoplayer.appendChild(playercontent);
  84. playercontent.appendChild(playerframe);
  85.  
  86. waitForNodeId('player', function() {
  87. removeNode(document.getElementById('player'));
  88. });
  89.  
  90. overriddenVideo = playerframe;
  91. console.log("injected new video");
  92.  
  93. });
  94.  
  95.  
  96. });
  97. }
  98.  
  99. checkAndUnrestrict();
  100. }
  101.  
  102.  
  103. const script = document.createElement("script");
  104. const target = document.head || document.documentElement;
  105. script.text = "(" + inject.toString() + ")();";
  106.  
  107. target.appendChild(script);
  108. target.removeChild(script);
  109. })();