Youtube block all, not interested in all, dismiss all

不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa

当前为 2024-08-29 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Youtube block all, not interested in all, dismiss all
  3. // @name:zh-CN Youtube block all, not interested in all, dismiss all
  4. // @name:zh-TW Youtube block all, not interested in all, dismiss all
  5. // @name:ja Youtube block all, not interested in all, dismiss all
  6. // @name:ko Youtube block all, not interested in all, dismiss all
  7. // @name:de Youtube block all, not interested in all, dismiss all
  8. // @name:es Youtube block all, not interested in all, dismiss all
  9. // @name:eo Youtube block all, not interested in all, dismiss all
  10. // @name:fr Youtube block all, not interested in all, dismiss all
  11. // @name:it Youtube block all, not interested in all, dismiss all
  12. // @name:ru Youtube block all, not interested in all, dismiss all
  13. // @name:vi Youtube block all, not interested in all, dismiss all
  14. // @name:pt-BR Youtube block all, not interested in all, dismiss all
  15. // @name:id Youtube block all, not interested in all, dismiss all
  16. // @name:ar Youtube block all, not interested in all, dismiss all
  17. // @name:bg Youtube block all, not interested in all, dismiss all
  18. // @name:cs Youtube block all, not interested in all, dismiss all
  19. // @name:tr Youtube block all, not interested in all, dismiss all
  20. // @name:el Youtube block all, not interested in all, dismiss all
  21. // @name:hu Youtube block all, not interested in all, dismiss all
  22. // @name:th Youtube block all, not interested in all, dismiss all
  23. // @version 0.1
  24. // @description 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  25. // @description:zh-CN 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  26. // @description:zh-TW 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  27. // @description:ja 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  28. // @description:ko 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  29. // @description:de 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  30. // @description:es 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  31. // @description:eo 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  32. // @description:fr 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  33. // @description:it 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  34. // @description:ru 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  35. // @description:vi 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  36. // @description:pt-BR 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  37. // @description:id 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  38. // @description:ar 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  39. // @description:bg 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  40. // @description:cs 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  41. // @description:tr 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  42. // @description:el 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  43. // @description:hu 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  44. // @description:th 不感兴趣, दिलचस्पी नहीं है, 興味なし, 관심 없음, Kein Interesse,لا يهمني,Pas intéressé, Не интересует, Não tenho interesse, No me interesa
  45. // @author evanlai
  46. // @match https://www.youtube.com/*
  47. // @require https://openuserjs.org/src/libs/sizzle/GM_config.js
  48. // @require https://cdn.jsdelivr.net/npm/sweetalert@2.1.2/dist/sweetalert.min.js
  49. // @require https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js
  50. // @grant GM_getValue
  51. // @grant GM_setValue
  52. // @grant none
  53. // @namespace https://greasyfork.org/users/732057
  54. // ==/UserScript==
  55. if (window.trustedTypes && window.trustedTypes.createPolicy) {
  56. window.trustedTypes.createPolicy('default', {
  57. createHTML: string => string,
  58. createScriptURL: string => string,
  59. createScript: string => string,
  60. });
  61. }
  62. function wait(ms) {
  63. return new Promise((resolve) => {
  64. setTimeout(resolve, ms);
  65. });
  66. }
  67. function inArray(array, element) {
  68. return array.indexOf(element) !== -1;
  69. }
  70.  
  71.  
  72. var runflag = true;
  73. var firstEnterThisPage = true;
  74. async function dismissCurrent() {
  75. let clickedSomething = false;
  76. let foundAusblenden = false;
  77.  
  78. for (const item of document.querySelectorAll('ytd-menu-service-item-renderer')) {
  79.  
  80. if (item.icon === (localStorage.getItem('videoOrCreator') === "video" ? "REMOVE" : "NOT_INTERESTED")) {
  81. clickedSomething = true;
  82. item.click();
  83. }
  84. // else if (item.icon === "__") {
  85. // foundAusblenden = item;
  86. // }
  87. }
  88. if (!clickedSomething && foundAusblenden !== false) {
  89. foundAusblenden.click();
  90. }
  91. return true;
  92. }
  93. async function dismissAll() {
  94. let list = document.querySelectorAll('ytd-rich-grid-media button[aria-label]');
  95.  
  96. while (firstEnterThisPage && list.length < 1) {
  97. await wait(1000);
  98. list = document.querySelectorAll('ytd-rich-grid-media button[aria-label]');
  99. }
  100. firstEnterThisPage = false;
  101.  
  102. let i = 0;
  103. for (let item of list) {
  104. item.click();
  105. await wait(50);
  106. await dismissCurrent();
  107. await wait(100);
  108. i++;
  109. if (i >= parseInt(localStorage.getItem('maximumNumberOfBlocksPerSession'))) break;
  110. }
  111. if (runflag) {
  112. runflag = false;
  113. // await dismissAll();
  114. }
  115. window.location.reload();
  116. }
  117.  
  118. window.dismissAll = function() {
  119. dismissAll();
  120. }
  121. window.openGmcSettings = function() {
  122. let settings = document.getElementById('J_settings');
  123. settings.style.display = '';
  124.  
  125. swal({
  126. content: settings,
  127. buttons: {
  128. // confirm: {
  129. // text: "save",
  130. // value: 1
  131. // },
  132. cancel: "close",
  133. },
  134. }).then(async (value) => {
  135. settings.style.display = 'none';
  136. // if (value !== 1) return false
  137.  
  138. });
  139. }
  140.  
  141. function createButton() {
  142. var elementForInsertNewButton = document.querySelector('#start') || document.querySelector('#logo-icon') || document.querySelector('#country-code');
  143.  
  144. var dismissAllLink = document.createElement('a');
  145. dismissAllLink.id = 'J_dismiss_all';
  146. dismissAllLink.href = 'javascript:';
  147. dismissAllLink.style.display = 'inline-flex';
  148. dismissAllLink.style.marginLeft = '2em';
  149. dismissAllLink.style.alignItems = 'center';
  150. dismissAllLink.style.verticalAlign = 'middle';
  151. dismissAllLink.style.color = 'gray';
  152. dismissAllLink.style.fontSize = '2em';
  153. dismissAllLink.style.lineHeight = '2em';
  154. dismissAllLink.style.textDecoration = 'none';
  155. dismissAllLink.onclick = window.dismissAll;
  156. dismissAllLink.textContent = '⟳';
  157.  
  158. var openGmcSettingsLink = document.createElement('a');
  159. openGmcSettingsLink.id = 'J_open_settings';
  160. openGmcSettingsLink.href = 'javascript:';
  161. openGmcSettingsLink.style.display = 'inline-flex';
  162. openGmcSettingsLink.style.marginTop = '1px';
  163. openGmcSettingsLink.style.marginLeft = '16px';
  164. openGmcSettingsLink.style.alignItems = 'center';
  165. openGmcSettingsLink.style.verticalAlign = 'middle';
  166. openGmcSettingsLink.style.color = 'gray';
  167. openGmcSettingsLink.style.fontSize = '2em';
  168. openGmcSettingsLink.style.lineHeight = '2em';
  169. openGmcSettingsLink.style.textDecoration = 'none';
  170. openGmcSettingsLink.onclick = window.openGmcSettings;
  171. openGmcSettingsLink.textContent = '⋮';
  172.  
  173. elementForInsertNewButton.appendChild(dismissAllLink);
  174. elementForInsertNewButton.appendChild(openGmcSettingsLink);
  175. }
  176.  
  177. createButton();
  178.  
  179. // settings
  180. document.addEventListener('alpine:init', () => {
  181. var maximumNumberOfBlocksPerSession = localStorage.getItem('maximumNumberOfBlocksPerSession');
  182. if(typeof maximumNumberOfBlocksPerSession === 'undefined') {
  183. maximumNumberOfBlocksPerSession = 12;
  184. localStorage.setItem('maximumNumberOfBlocksPerSession', maximumNumberOfBlocksPerSession);
  185. }
  186. Alpine.store('maximumNumberOfBlocksPerSession', {
  187. value: maximumNumberOfBlocksPerSession,
  188. valueHasChanged(){
  189. localStorage.setItem('maximumNumberOfBlocksPerSession', this.value);
  190. }
  191. })
  192.  
  193.  
  194. var autoMode = localStorage.getItem('autoMode');
  195. if(typeof autoMode === 'undefined') {
  196. autoMode = false;
  197. localStorage.setItem('autoMode', autoMode);
  198. }
  199. Alpine.store('autoMode', {
  200. on: autoMode,
  201. toggle() {
  202. this.on = ! this.on
  203. localStorage.setItem('autoMode', this.on);
  204. }
  205. })
  206.  
  207.  
  208. var videoOrCreator = localStorage.getItem('videoOrCreator');
  209. if(typeof videoOrCreator === 'undefined') {
  210. videoOrCreator = 'video';
  211. localStorage.setItem('videoOrCreator', videoOrCreator);
  212. }
  213. Alpine.store('videoOrCreator', {
  214. value: videoOrCreator,
  215.  
  216. toggle() {
  217. this.value = this.value === "creator" ? "video" : "creator";
  218. localStorage.setItem('videoOrCreator', this.value);
  219. }
  220. })
  221.  
  222. if(localStorage.getItem('autoMode') && localStorage.getItem('autoMode') !== 'false') window.dismissAll()
  223. });
  224.  
  225. var gmcSettings = document.createElement('div');
  226. gmcSettings.id = 'J_settings';
  227.  
  228. gmcSettings.innerHTML = `
  229. <span>Maximum number of blocks per session:<input type="text" x-data="$store.maximumNumberOfBlocksPerSession" x-model="value" x-init="$watch('value', value => $store.maximumNumberOfBlocksPerSession.valueHasChanged())"></span>
  230. <button x-data @click="$store.autoMode.toggle()">Automatically refresh the page and process all</button> ---> <span x-data="$store.autoMode" x-text="on"></span>
  231. <button x-data @click="$store.videoOrCreator.toggle()">Block video or creator</button> ---> <span x-data="$store.videoOrCreator" x-text="value"></span>
  232.  
  233. `;
  234. document.querySelector('body').appendChild(gmcSettings);