YT Hide Recom Tool

將 YT 某些元素進行隱藏

当前为 2023-07-30 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name YT Hide Recom Tool
  3. // @version 0.0.13
  4. // @author HentaiSaru
  5. // @description 將 YT 某些元素進行隱藏
  6. // @icon https://cdn-icons-png.flaticon.com/512/1383/1383260.png
  7.  
  8. // @run-at document-end
  9. // @match *://www.youtube.com/*
  10.  
  11. // @license MIT
  12. // @grant GM_setValue
  13. // @grant GM_getValue
  14. // @grant GM_addStyle
  15. // @grant GM_registerMenuCommand
  16. // @namespace https://greasyfork.org/users/989635
  17. // ==/UserScript==
  18.  
  19. /*
  20. Original Author Page : [https://github.com/hoothin/]
  21. Original Author Link : [https://greasyfork.org/zh-TW/scripts/438403-youtube-hide-related-suggestion-which-occlude-the-video]
  22. */
  23.  
  24. (function() {
  25. var currentUrl = window.location.href;
  26. let pattern = /^https:\/\/www\.youtube\.com\/.+$/;
  27. // 在首頁不會載入以下方法
  28. if (pattern.test(currentUrl)) {
  29. // 為推薦卡添加 css 樣式
  30. let css = `
  31. .ytp-ce-element{opacity: 0.1!important;}
  32. .ytp-ce-element:hover{opacity: 1!important;}
  33. `;
  34. if (typeof GM_addStyle !== "undefined") {
  35. GM_addStyle(css);
  36. } else {
  37. let ElementNode = document.createElement("style");
  38. ElementNode.appendChild(document.createTextNode(css));
  39. (document.querySelector("head") || document.documentElement).appendChild(ElementNode);
  40. }
  41. /* -------------------------------------------- */
  42. const Menu = GM_registerMenuCommand(
  43. "📜 [功能說明]",
  44. function() {
  45. alert(
  46. "功能失效時 [請重新整理] !!\n\n(Shift) : 完全隱藏影片尾部推薦\n(Alt + 1) : 隱藏右側影片推薦\n(Alt + 2) : 隱藏留言區\n(Alt + 3) : 隱藏功能選項\n(Alt + 4) : 隱藏播放清單資訊\n(Ctrl + Z) : 使用極簡化"
  47. );
  48. }
  49. );/* -------------------------------------------- */
  50. // 隱藏判斷
  51. function HideJudgment(element, gm="") {
  52. if (element.style.display === "none") {
  53. element.style.display = "block";
  54. if (gm !== "") {GM_setValue(gm, false);}
  55. } else {
  56. element.style.display = "none";
  57. if (gm !== "") {GM_setValue(gm, true);}
  58. }
  59. }
  60. function SetTrigger(element) {
  61. element.style.display = "none";
  62. return new Promise(resolve => {
  63. setTimeout(function() {
  64. if (element.style.display === "none") {
  65. resolve(true);
  66. } else {
  67. resolve(false);
  68. }
  69. }, 300);
  70. });
  71. }
  72. async function runAsync() {
  73. // 監聽快捷鍵
  74. document.addEventListener("keydown", function(event) {
  75. if (event.shiftKey) {
  76. event.preventDefault();
  77. let elements = document.querySelectorAll(".ytp-ce-element, .ytp-ce-covering");
  78. elements.forEach(function(element) {
  79. HideJudgment(element);
  80. });
  81. } else if (event.ctrlKey && event.key === "z") {
  82. event.preventDefault();
  83. let UserMenu = document.getElementById("end");
  84. let Message = document.getElementById("below");
  85. let RecommViewing = document.getElementById("secondary");
  86. if (GM_getValue("極簡化", [])) {
  87. UserMenu.style.display = "block";
  88. Message.style.display = "block";
  89. RecommViewing.style.display = "block";
  90. GM_setValue("極簡化", false);
  91. } else {
  92. UserMenu.style.display = "none";
  93. Message.style.display = "none";
  94. RecommViewing.style.display = "none";
  95. GM_setValue("極簡化", true);
  96. }
  97. } else if (event.altKey && event.key === "1") {
  98. event.preventDefault();
  99. let element = document.getElementById("secondary");
  100. HideJudgment(element, "Trigger_1");
  101. } else if (event.altKey && event.key === "2") {
  102. event.preventDefault();
  103. let element = document.getElementById("comments");
  104. HideJudgment(element, "Trigger_2");
  105. } else if (event.altKey && event.key === "3") {
  106. event.preventDefault();
  107. let element = document.getElementById("menu-container");
  108. HideJudgment(element, "Trigger_3");
  109. } else if (event.altKey && event.key === "4") {
  110. event.preventDefault();
  111. let element = document.querySelector("#page-manager > ytd-browse > ytd-playlist-header-renderer > div");
  112. HideJudgment(element, "Trigger_4");
  113. }
  114. });
  115. // 判斷在播放頁面運行
  116. let VVP_Pattern = /^https:\/\/www\.youtube\.com\/watch\?v=.+$/;
  117. // 判斷在播放清單運行
  118. let Playlist_Pattern = /^https:\/\/www\.youtube\.com\/playlist\?list=.+$/;
  119. if (VVP_Pattern.test(currentUrl)) {
  120. if (GM_getValue("極簡化", [])) {
  121. let interval;
  122. interval = setInterval(function() {
  123. let UserMenu = document.getElementById("end");
  124. let Message = document.getElementById("below");
  125. let RecommViewing = document.getElementById("secondary");
  126. if (UserMenu && Message && RecommViewing) {
  127. Promise.all([SetTrigger(UserMenu), SetTrigger(Message), SetTrigger(RecommViewing)]).then(results => {
  128. if (results[0] && results[1] && results[2]) {
  129. clearInterval(interval);
  130. return;
  131. }
  132. });
  133. }
  134. }, 1000);
  135. }
  136. if (GM_getValue("Trigger_1", [])){
  137. let interval;
  138. interval = setInterval(function() {
  139. let element = document.getElementById("secondary");
  140. if (element) {
  141. SetTrigger(element).then(result => {
  142. clearInterval(interval);
  143. });
  144. }
  145. }, 1000);
  146. }
  147. if (GM_getValue("Trigger_2", [])){
  148. let interval;
  149. interval = setInterval(function() {
  150. let element = document.getElementById("comments");
  151. if (element) {
  152. SetTrigger(element).then(result => {
  153. clearInterval(interval);
  154. });
  155. }
  156. }, 1000);
  157. }
  158. if (GM_getValue("Trigger_3", [])){
  159. let interval;
  160. interval = setInterval(function() {
  161. let element = document.getElementById("menu-container");
  162. if (element) {
  163. SetTrigger(element).then(result => {
  164. clearInterval(interval);
  165. });
  166. }
  167. }, 1000);
  168. }
  169. } else if (Playlist_Pattern.test(currentUrl)) {
  170. if (GM_getValue("Trigger_4", [])){
  171. let interval;
  172. interval = setInterval(function() {
  173. let element = document.querySelector("#page-manager > ytd-browse > ytd-playlist-header-renderer > div");
  174. if (element) {
  175. SetTrigger(element).then(result => {
  176. clearInterval(interval);
  177. });
  178. }
  179. }, 1000);
  180. }
  181. }
  182. }
  183. // 異步運行
  184. runAsync();
  185. }
  186. })();