Youtube 隐藏工具

快捷隐藏 YouTube 评论区、相关推荐、视频结尾推荐和设置菜单

当前为 2023-08-16 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Youtube Hide Tool
  3. // @name:zh-TW Youtube 隱藏工具
  4. // @name:zh-CN Youtube 隐藏工具
  5. // @name:ja Youtube 非表示ツール
  6. // @name:ko 유튜브 숨기기 도구
  7. // @name:en Youtube Hide Tool
  8. // @name:de Youtube Versteckwerkzeug
  9. // @name:pt Ferramenta de Ocultação do Youtube
  10. // @name:es Herramienta de Ocultación de Youtube
  11. // @name:fr Outil de Masquage de Youtube
  12. // @name:hi यूट्यूब छुपाने का उपकरण
  13. // @name:id Alat Sembunyikan Youtube
  14. // @version 0.0.15
  15. // @author HentaiSaru
  16. // @description 快捷隱藏 YouTube 留言區、相關推薦、影片結尾推薦和設置選單
  17. // @description:zh-TW 快捷隱藏 YouTube 留言區、相關推薦、影片結尾推薦和設置選單
  18. // @description:zh-CN 快捷隐藏 YouTube 评论区、相关推荐、视频结尾推荐和设置菜单
  19. // @description:ja YouTubeのコメント欄、関連おすすめ、動画の最後のおすすめ、設定メニューを素早く非表示にする
  20. // @description:ko 빠른 YouTube 댓글 영역, 관련 추천, 비디오 끝 추천 및 설정 메뉴 숨기기
  21. // @description:en Quickly hide YouTube comments, related recommendations, video end recommendations, and settings menu
  22. // @description:de Schnell verstecken YouTube Kommentare, verwandte Empfehlungen, Video-Ende-Empfehlungen und Einstellungsmenü
  23. // @description:pt Ocultar rapidamente comentários do YouTube, recomendações relacionadas, recomendações de final de vídeo e menu de configurações
  24. // @description:es Ocultar rápidamente comentarios de YouTube, recomendaciones relacionadas, recomendaciones de final de video y menú de configuración
  25. // @description:fr Masquer rapidement les commentaires de YouTube, les recommandations connexes, les recommandations de fin de vidéo et le menu des paramètres
  26. // @description:hi यूट्यूब टिप्पणियाँ, संबंधित सिफारिशें, वीडियो के अंत की सिफारिशें और सेटिंग्स मेनू को त्वरित रूप से छुपाएं
  27. // @description:id Sembunyikan cepat komentar YouTube, rekomendasi terkait, rekomendasi akhir video, dan menu pengaturan
  28.  
  29. // @match *://www.youtube.com/*
  30. // @icon https://cdn-icons-png.flaticon.com/512/1383/1383260.png
  31.  
  32. // @license MIT
  33. // @namespace https://greasyfork.org/users/989635
  34.  
  35. // @run-at document-end
  36. // @grant GM_setValue
  37. // @grant GM_getValue
  38. // @grant GM_addStyle
  39. // @grant GM_registerMenuCommand
  40. // ==/UserScript==
  41.  
  42. (function() {
  43. var currentUrl = window.location.href, transform = false;
  44. let pattern = /^https:\/\/www\.youtube\.com\/.+$/;
  45. // Home page not loading
  46. if (pattern.test(currentUrl)) {
  47. let language = display_language(navigator.language);
  48. RunMaim();
  49. GM_addStyle(`
  50. .ytp-ce-element{opacity: 0.1!important;}
  51. .ytp-ce-element:hover{opacity: 1!important;}
  52. `);
  53. GM_registerMenuCommand(
  54. language[0],
  55. function() {
  56. alert(language[1]);
  57. }
  58. );
  59. async function RunMaim() {
  60. let set;
  61. async function HideJudgment(element, gm="") {
  62. if (element.style.display === "none" || transform) {
  63. element.style.display = "block";
  64. if (gm !== "") {GM_setValue(gm, false)}
  65. } else {
  66. element.style.display = "none";
  67. if (gm !== "") {GM_setValue(gm, true)}
  68. }
  69. }
  70. async function SetTrigger(element) {
  71. element.style.display = "none";
  72. return new Promise(resolve => {
  73. setTimeout(function() {
  74. if (element.style.display === "none") {
  75. resolve(true);
  76. } else {
  77. resolve(false);
  78. }
  79. }, 100);
  80. });
  81. }
  82. document.addEventListener("keydown", function(event) {
  83. if (event.shiftKey) {
  84. event.preventDefault();
  85. let elements = document.querySelectorAll(".ytp-ce-element, .ytp-ce-covering");
  86. elements.forEach(function(element) {
  87. HideJudgment(element);
  88. });
  89. } else if (event.ctrlKey && event.key === "z") {
  90. event.preventDefault();
  91. let UserMenu = document.getElementById("end");
  92. let Message = document.getElementById("below");
  93. let RecommViewing = document.getElementById("secondary");
  94. let RecommViewing2 = document.getElementById("related");
  95. set = GM_getValue("Minimalist", null);
  96. if (set && set != null) {
  97. UserMenu.style.display = "block";
  98. Message.style.display = "block";
  99. RecommViewing.style.display = "block";
  100. RecommViewing2.style.display = "block";
  101. GM_setValue("Minimalist", false);
  102. } else {
  103. UserMenu.style.display = "none";
  104. Message.style.display = "none";
  105. RecommViewing.style.display = "none";
  106. RecommViewing2.style.display = "none";
  107. GM_setValue("Minimalist", true);
  108. }
  109. } else if (event.altKey && event.key === "1") {
  110. event.preventDefault();
  111. let child = document.getElementById("secondary-inner").childElementCount;
  112. if (child > 1) {// 子元素數量
  113. let element1 = document.getElementById("secondary");
  114. HideJudgment(element1, "Trigger_1");
  115. let element2 = document.getElementById("related");
  116. HideJudgment(element2, "Trigger_1");
  117. transform = false;
  118. } else {
  119. let element2 = document.getElementById("related");
  120. HideJudgment(element2, "Trigger_1");
  121. transform = true;
  122. }
  123. } else if (event.altKey && event.key === "2") {
  124. event.preventDefault();
  125. let element = document.getElementById("comments");
  126. HideJudgment(element, "Trigger_2");
  127. } else if (event.altKey && event.key === "3") {
  128. event.preventDefault();
  129. let element = document.getElementById("menu-container");
  130. HideJudgment(element, "Trigger_3");
  131. } else if (event.altKey && event.key === "4") {
  132. event.preventDefault();
  133. let element = document.querySelector("#page-manager > ytd-browse > ytd-playlist-header-renderer > div");
  134. HideJudgment(element, "Trigger_4");
  135. }
  136. });
  137. // 判斷在播放頁面運行
  138. let VVP_Pattern = /^https:\/\/www\.youtube\.com\/watch\?v=.+$/;
  139. // 判斷在播放清單運行
  140. let Playlist_Pattern = /^https:\/\/www\.youtube\.com\/playlist\?list=.+$/;
  141. let Lookup_Delay = 300;
  142. if (VVP_Pattern.test(currentUrl)) {
  143. set = GM_getValue("Minimalist", null);
  144. if (set && set !== null) {
  145. let interval;
  146. interval = setInterval(function() {
  147. let UserMenu = document.getElementById("end");
  148. let Message = document.getElementById("below");
  149. let RecommViewing = document.getElementById("secondary");
  150. let RecommViewing2 = document.getElementById("related");
  151. if (UserMenu && Message && RecommViewing && RecommViewing2) {
  152. Promise.all([SetTrigger(UserMenu), SetTrigger(Message), SetTrigger(RecommViewing), SetTrigger(RecommViewing2)]).then(results => {
  153. if (results[0] && results[1] && results[2] && results[3]) {
  154. clearInterval(interval);
  155. }
  156. });
  157. }
  158. }, Lookup_Delay);
  159. }
  160. set = GM_getValue("Trigger_1", null);
  161. if (set && set !== null){
  162. let interval;
  163. interval = setInterval(function() {
  164. let element = document.getElementById("secondary");
  165. let element2 = document.getElementById("related");
  166. if (element && element2) {
  167. Promise.all([SetTrigger(element), SetTrigger(element2)]).then(results => {
  168. if (results[0] && results[1]) {
  169. clearInterval(interval);
  170. }
  171. });
  172. }
  173. }, Lookup_Delay);
  174. }
  175. set = GM_getValue("Trigger_2", null);
  176. if (set && set !== null){
  177. let interval;
  178. interval = setInterval(function() {
  179. let element = document.getElementById("comments");
  180. if (element) {
  181. SetTrigger(element).then(result => {
  182. clearInterval(interval);
  183. });
  184. }
  185. }, Lookup_Delay);
  186. }
  187. set = GM_getValue("Trigger_3", null);
  188. if (set && set !== null){
  189. let interval;
  190. interval = setInterval(function() {
  191. let element = document.getElementById("menu-container");
  192. if (element) {
  193. SetTrigger(element).then(result => {
  194. clearInterval(interval);
  195. });
  196. }
  197. }, Lookup_Delay);
  198. }
  199. } else if (Playlist_Pattern.test(currentUrl)) {
  200. set = GM_getValue("Trigger_4", null);
  201. if (set && set !== null){
  202. let interval;
  203. interval = setInterval(function() {
  204. let element = document.querySelector("#page-manager > ytd-browse > ytd-playlist-header-renderer > div");
  205. if (element) {
  206. SetTrigger(element).then(result => {
  207. clearInterval(interval);
  208. });
  209. }
  210. }, Lookup_Delay);
  211. }
  212. }
  213. }
  214. }
  215. })();
  216.  
  217. function display_language(language) {
  218. let display = {
  219. "zh-TW": ["📜 設置快捷", `@ 功能失效時 [請重新整理] =>
  220.  
  221. (Shift) : 完全隱藏影片尾部推薦
  222. (Alt + 1) : 隱藏右側影片推薦
  223. (Alt + 2) : 隱藏留言區
  224. (Alt + 3) : 隱藏功能選項
  225. (Alt + 4) : 隱藏播放清單資訊
  226. (Ctrl + Z) : 使用極簡化`],
  227. "zh-CN": ["📜 设置快捷", `@ 功能失效时 [请重新刷新] =>
  228.  
  229. (Shift) : 全部隐藏视频尾部推荐
  230. (Alt + 1) : 隐藏右侧视频推荐
  231. (Alt + 2) : 隐藏评论区
  232. (Alt + 3) : 隐藏功能选项
  233. (Alt + 4) : 隐藏播放列表信息
  234. (Ctrl + Z) : 使用极简化`],
  235. "ja": ["📜 設定ショートカット", `@ 機能が無効になった場合 [再読み込みしてください] =>
  236.  
  237. (Shift) : 動画の最後のおすすめを完全に非表示にする
  238. (Alt + 1) : 右側の動画おすすめを非表示にする
  239. (Alt + 2) : コメント欄を非表示にする
  240. (Alt + 3) : 機能オプションを非表示にする
  241. (Alt + 4) : プレイリスト情報を非表示にする
  242. (Ctrl + Z) : 簡素化を使用する`],
  243. "en": ["📜 Settings Shortcut", `@ When function fails [Please refresh] =>
  244.  
  245. (Shift) : Fully hide video end recommendations
  246. (Alt + 1) : Hide right side video recommendations
  247. (Alt + 2) : Hide comments section
  248. (Alt + 3) : Hide function options
  249. (Alt + 4) : Hide playlist information
  250. (Ctrl + Z) : Use minimalism`],
  251. "ko": ["📜 설정 바로 가기", `@ 기능이 실패하면 [새로 고침하세요] =>
  252.  
  253. (Shift) : 비디오 추천을 완전히 숨기기
  254. (Alt + 1) : 오른쪽 비디오 추천 숨기기
  255. (Alt + 2) : 댓글 섹션 숨기기
  256. (Alt + 3) : 기능 옵션 숨기기
  257. (Alt + 4) : 재생 목록 정보 숨기기
  258. (Ctrl + Z) : 미니멀리즘 사용하기`]};
  259. return display[language] || display["en"];
  260. }