Updated Adblock Blocker Youtube Premium Popup Extension Warning Remover

Block Premium Popup, Remove Adblock-Blocker, Remove the ExtensionWarning

  1. // ==UserScript==
  2. // @name Updated Adblock Blocker Youtube Premium Popup Extension Warning Remover
  3. // @namespace http://tampermonkey.net/
  4. // @version 4.212
  5. // @description Block Premium Popup, Remove Adblock-Blocker, Remove the ExtensionWarning
  6. // @author PB
  7. // @match https://www.youtube.com/*
  8. // @grant none
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. (function () {
  13. //
  14. // Config
  15. //
  16.  
  17. //
  18. const adblocker = true;
  19.  
  20. //
  21. const removePopup = true;
  22.  
  23. //
  24. const debug = true;
  25.  
  26. //
  27. // CODE
  28. //
  29.  
  30. //
  31. const domainsToRemove = [
  32. '*.youtube-nocookie.com/*'
  33. ];
  34. const jsonPathsToRemove = [
  35. 'playerResponse.adPlacements',
  36. 'playerResponse.playerAds',
  37. 'adPlacements',
  38. 'playerAds',
  39. 'playerConfig',
  40. 'auxiliaryUi.messageRenderers.enforcementMessageViewModel'
  41. ];
  42.  
  43. //
  44. const observerConfig = {
  45. childList: true,
  46. subtree: true
  47. };
  48.  
  49. const keyEvent = new KeyboardEvent("keydown", {
  50. key: "k",
  51. code: "KeyK",
  52. keyCode: 75,
  53. which: 75,
  54. bubbles: true,
  55. cancelable: true,
  56. view: window
  57. });
  58.  
  59. let mouseEvent = new MouseEvent("click", {
  60. bubbles: true,
  61. cancelable: true,
  62. view: window,
  63. });
  64.  
  65. //
  66. let unpausedAfterSkip = 0;
  67.  
  68. if (debug) console.log("Remove Adblock Thing: Remove Adblock Thing: Script started");
  69. // Old variable but could work in some cases
  70. window.__ytplayer_adblockDetected = false;
  71.  
  72. if (adblocker) addblocker();
  73. if (removePopup) popupRemover();
  74. //if (removePopup) observer.observe(document.body, observerConfig);
  75.  
  76. //
  77. function popupRemover() {
  78. removeJsonPaths(domainsToRemove, jsonPathsToRemove);
  79. setInterval(() => {
  80.  
  81. const fullScreenButton = document.querySelector(".ytp-fullscreen-button");
  82. const modalOverlay = document.querySelector("tp-yt-iron-overlay-backdrop");
  83. const popup = document.querySelector(".style-scope ytd-enforcement-message-view-model");
  84. const popupButton = document.getElementById("dismiss-button");
  85. // const popupButton2 = document.getElementById("ytp-play-button ytp-button");
  86.  
  87. const video1 = document.querySelector("#movie_player > video.html5-main-video");
  88. const video2 = document.querySelector("#movie_player > .html5-video-container > video");
  89.  
  90. const bodyStyle = document.body.style;
  91.  
  92. bodyStyle.setProperty('overflow-y', 'auto', 'important');
  93.  
  94. if (modalOverlay) {
  95. modalOverlay.removeAttribute("opened");
  96. modalOverlay.remove();
  97. }
  98.  
  99. if (popup) {
  100. if (debug) console.log("Remove Adblock Thing: Popup detected, removing...");
  101.  
  102. if (popupButton) popupButton.click();
  103. // if(popupButton2) popupButton2.click();
  104. popup.remove();
  105. unpausedAfterSkip = 2;
  106.  
  107. fullScreenButton.dispatchEvent(mouseEvent);
  108.  
  109. setTimeout(() => {
  110. fullScreenButton.dispatchEvent(mouseEvent);
  111. }, 500);
  112.  
  113. if (debug) console.log("Remove Adblock Thing: Popup removed");
  114. }
  115.  
  116. // Check if the video is paused after removing the popup
  117. if (!unpausedAfterSkip > 0) return;
  118.  
  119. // UnPause The Video
  120. unPauseVideo(video1);
  121. unPauseVideo(video2);
  122.  
  123. }, 1000);
  124. }
  125. //
  126. function addblocker() {
  127.  
  128. // Do not display as they will be deleted
  129. const css =
  130. `
  131. .ad-showing, .videoAdUiSkipButton, .ytp-ad-skip-button, .ytp-ad-skip-button-modern { display: none; }
  132. ytd-action-companion-ad-renderer { display: none; }
  133. div#root.style-scope.ytd-display-ad-renderer.yt-simple-endpoint { display: none; }
  134. div#sparkles-container.style-scope.ytd-promoted-sparkles-web-renderer { display: none; }
  135. div#main-container.style-scope.ytd-promoted-video-renderer { display: none; }
  136. ytd-in-feed-ad-layout-renderer { display: none; }
  137. .ytd-video-masthead-ad-v3-renderer { display: none; }
  138. ytd-engagement-panel-section-list-renderer[target-id="engagement-panel-ads"] { display: none; }
  139. ytd-merch-shelf-renderer { display: none; }
  140. .ytd-banner-promo-renderer { display: none; }
  141. ytd-statement-banner-renderer { display: none; }
  142. `;
  143. const head = document.head || document.getElementsByTagName('head')[0];
  144. const styleElement = document.createElement('style');
  145. styleElement.type = 'text/css';
  146. styleElement.id = 'adSkip'; // for debug: document.querySelector('#adSkip').remove()
  147. styleElement.innerHTML = css;
  148. head.appendChild(styleElement);
  149.  
  150. handleAds();
  151.  
  152. //
  153. if (!getGotItState()) {
  154. document.body.insertAdjacentHTML("beforeend", addCss() + addHtml());
  155.  
  156. const modal = document.getElementById("myModal");
  157. const span = document.getElementsByClassName("close")[0];
  158.  
  159. modal.style.display = "block";
  160.  
  161. span.onclick = function () {
  162. modal.style.display = "none";
  163. }
  164.  
  165. document.querySelector('.gotIt').onclick = function () {
  166. setGotItState(true);
  167. modal.style.display = "none";
  168. }
  169. }
  170.  
  171. }
  172.  
  173. function handleAds() {
  174. const skipBtnSelector = '.videoAdUiSkipButton, .ytp-ad-skip-button';
  175. const adSelector = '.ad-showing';
  176. const adRemovalSelectors = [
  177. 'ytd-action-companion-ad-renderer',
  178. 'div#root.style-scope.ytd-display-ad-renderer.yt-simple-endpoint',
  179. 'div#sparkles-container.style-scope.ytd-promoted-sparkles-web-renderer',
  180. 'div#main-container.style-scope.ytd-promoted-video-renderer',
  181. 'ytd-in-feed-ad-layout-renderer',
  182. '.ytd-video-masthead-ad-v3-renderer',
  183. 'ytd-engagement-panel-section-list-renderer[target-id="engagement-panel-ads"]',
  184. 'ytd-merch-shelf-renderer', // Remove store stuff below videos : https://www.zupimages.net/up/23/45/1npf.png
  185. '.ytd-banner-promo-renderer', // Removes the large banner that occasionally appears at the top of the home page offering to subscribe to Premium
  186. 'ytd-statement-banner-renderer', // removes large banners that occasionally appear in content on the home page offering to subscribe to Premium
  187. ];
  188. const sponsorSelectors = ['div#player-ads.style-scope.ytd-watch-flexy', 'div#panels.style-scope.ytd-watch-flexy'];
  189. const nonVidSelector = '.ytp-ad-skip-button-modern';
  190.  
  191. const observerCallback = (mutationsList, observer) => {
  192. removeJsonPaths(domainsToRemove, jsonPathsToRemove);
  193. for (const mutation of mutationsList) {
  194. if (mutation.addedNodes.length > 0) {
  195. const video = document.querySelector('video');
  196. const skipBtn = document.querySelector(skipBtnSelector);
  197. const ad = document.querySelector(adSelector);
  198.  
  199. if (ad) {
  200. video.playbackRate = 10;
  201. video.volume = 0;
  202. //video.currentTime = video.duration;
  203. skipBtn?.click();
  204. }
  205.  
  206. for (const removalSelector of adRemovalSelectors) {
  207. const element = document.querySelector(removalSelector);
  208. element?.remove();
  209. }
  210.  
  211. const sponsorElements = document.querySelectorAll(sponsorSelectors.join(', '));
  212. sponsorElements.forEach((element) => {
  213. if (element.getAttribute("id") === "panels") {
  214. element.childNodes?.forEach((childElement) => {
  215. if (childElement.data?.targetId && childElement.data.targetId !== "engagement-panel-macro-markers-description-chapters") {
  216. //Skipping the Chapters section
  217. childElement.remove();
  218. }
  219. });
  220. } else {
  221. element.remove();
  222. }
  223. });
  224.  
  225. const nonVid = document.querySelector(nonVidSelector);
  226. nonVid?.click();
  227.  
  228. // On the home page (desktop) at the top left
  229. // It works, but sometimes it causes the current page to lag.
  230. /*
  231. const parentElement = document.querySelector('ytd-ad-slot-renderer');
  232. if (parentElement) {
  233. const richItemRenderers = parentElement.closest('ytd-app').querySelector('ytd-rich-item-renderer');
  234. richItemRenderers?.remove();
  235. }*/
  236. }
  237. }
  238. };
  239.  
  240. const observer = new MutationObserver(observerCallback);
  241. observer.observe(document.body, observerConfig);
  242. }
  243.  
  244. //
  245. function unPauseVideo(video) {
  246. if (!video) return;
  247. if (video.paused) {
  248. // Simulate pressing the "k" key to unpause the video
  249. document.dispatchEvent(keyEvent);
  250. unpausedAfterSkip = 0;
  251. if (debug) console.log("Remove Adblock Thing: Unpaused video using 'k' key");
  252. } else if (unpausedAfterSkip > 0) unpausedAfterSkip--;
  253. }
  254. function removeJsonPaths(domains, jsonPaths) {
  255. const currentDomain = window.location.hostname;
  256. if (!domains.includes(currentDomain)) return;
  257.  
  258. jsonPaths.forEach(jsonPath => {
  259. const pathParts = jsonPath.split('.');
  260. let obj = window;
  261. let previousObj = null;
  262. let partToSetUndefined = null;
  263.  
  264. for (const part of pathParts) {
  265. if (obj.hasOwnProperty(part)) {
  266. previousObj = obj; // Keep track of the parent object.
  267. partToSetUndefined = part; // Update the part that we may set to undefined.
  268. obj = obj[part];
  269. } else {
  270. break; // Stop when we reach a non-existing part.
  271. }
  272. }
  273.  
  274. //
  275. if (previousObj && partToSetUndefined !== null) {
  276. previousObj[partToSetUndefined] = undefined;
  277. }
  278. });
  279. }
  280.  
  281. //
  282. /*const observer = new MutationObserver(() => {
  283. removeJsonPaths(domainsToRemove, jsonPathsToRemove);
  284. });*/
  285.  
  286. function getGotItState() {
  287. return localStorage.getItem('yAdbgotIt') === 'true';
  288. }
  289.  
  290. function setGotItState(state) {
  291. localStorage.setItem('yAdbgotIt', state.toString());
  292. }
  293.  
  294. function addCss() {
  295. return `
  296. <style>
  297. .modal {
  298. display: none;
  299. position: fixed;
  300. z-index: 99999;
  301. padding-top: 100px;
  302. left: 0;
  303. top: 0;
  304. width: 100%;
  305. height: 100%;
  306. overflow: auto;
  307. background-color: rgb(0,0,0);
  308. background-color: rgba(0,0,0,0.4);
  309. font-size: 16px;
  310. max-width: 500px;
  311. }
  312.  
  313. .modal .content {
  314. margin-top: 30px;
  315. }
  316.  
  317. .modal-content {
  318. background-color: #fefefe;
  319. margin: auto;
  320. padding: 20px;
  321. border: 1px solid #888;
  322. width: 80%;
  323. border: 5px #f90000 solid;
  324. border-radius: 10px;
  325. }
  326.  
  327. .close {
  328. color: #aaaaaa;
  329. float: right;
  330. font-size: 28px;
  331. font-weight: bold;
  332. }
  333.  
  334. .close:hover,
  335. .close:focus {
  336. color: #000;
  337. text-decoration: none;
  338. cursor: pointer;
  339. }
  340. </style>
  341. `;
  342. }
  343.  
  344.  
  345. function addHtml() {
  346. if (/fr/.test(navigator.language)) {
  347. return `
  348. <div id="myModal" class="modal">
  349. <div class="modal-content">
  350. <span class="close">&times;</span>
  351. <div class="content">
  352. <b> AdSkip YouTube </b>:<br>
  353. <b>Pour que ce plugin fonctionne, désactivez votre bloqueur de publicités :</b> ajoutez YouTube à la liste blanche de toutes les extensions Firefox qui bloquent les publicités ou de tout élément tiers qui désactive les publicités. Ne vous inquiétez pas, ce script supprime les publicités intrusives sur les vidéos.
  354. <br><br>
  355. <button class="gotIt">J'ai compris !</button>
  356. </div>
  357. </div>
  358. </div>
  359. `;
  360. } else {
  361. return `
  362. <div id="myModal" class="modal">
  363. <div class="modal-content">
  364. <span class="close">&times;</span>
  365. <div class="content">
  366. <b> AdSkip YouTube </b>:<br>
  367. <b>For this plugin to work, turn off your ad blocker :</b> Add YouTube to the whitelist of all Firefox extensions that block ads or any third-party items that disable ads. Don't worry, this script removes intrusive ads on videos.
  368. <br><br>
  369. <button class="gotIt">Got it !</button>
  370. </div>
  371. </div>
  372.  
  373. </div>
  374. `;
  375. }
  376. }
  377. // Wait for load in
  378. window.addEventListener('load', function() {
  379. //
  380. var elementToBlock = document.querySelector('tp-yt-paper-dialog[style-target="host"]');
  381.  
  382. //
  383. if (elementToBlock) {
  384. // Block
  385. elementToBlock.style.display = 'none';
  386. }
  387. });
  388. //
  389. function removeModal() {
  390. var modal = document.getElementById('myModal');
  391. if (modal) {
  392. modal.remove();
  393. }
  394. }
  395.  
  396. //
  397. function addClickHandler() {
  398. var closeBtn = document.querySelector('#myModal .close');
  399. if (closeBtn) {
  400. closeBtn.addEventListener('click', removeModal);
  401. }
  402. }
  403.  
  404. //
  405. function checkAndRemoveModal() {
  406. var modal = document.getElementById('myModal');
  407. if (modal) {
  408. removeModal();
  409. }
  410. }
  411.  
  412. //
  413. setInterval(checkAndRemoveModal, 1000);
  414.  
  415. //
  416. window.addEventListener('load', addClickHandler);
  417. var dialogElement = document.getElementById("tp-yt-paper-dialog");
  418. var elementToBlock = dialogElement.querySelector("#element-id");
  419.  
  420. // Hide the element
  421. elementToBlock.style.display = "none";
  422. })();