Youtube block all, not interested in all, dismiss all

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

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

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