yt blocker

none

目前為 2025-03-17 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name yt blocker
  3. // @version 2
  4. // @description none
  5. // @run-at document-start
  6. // @author rssaromeo
  7. // @license GPLv3
  8. // @match *://youtube.com/*
  9. // @match *://*.youtube.com/*
  10. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAMAAABiM0N1AAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAHJQTFRFAAAAEIijAo2yAI60BYyuF4WaFIifAY6zBI2wB4usGIaZEYigIoiZCIyrE4igG4iYD4mjEomhFoedCoqpDIqnDomlBYyvE4efEYmiDYqlA42xBoytD4mkCYqqGYSUFYidC4qoC4upAo6yCoupDYqmCYur4zowOQAAACZ0Uk5TAO////9vr////1+/D/+/L+/Pf/////+f3///////H4////////+5G91rAAACgUlEQVR4nM2Y22KjIBCGidg1264liZqDadK03X3/V2wNKHMC7MpF/xthHD5mgERAqZhWhfYqH6K+Qf2qNNf625hCoFj9/gblMUi5q5jLkXLCKudgyiRm0FMK82cWJp1fLbV5VmvJbCIc0GCYaFqqlDJgADdBjncqAXYobm1xh72aFMflbysteFfdy2Yi1XGOm5HGBzQ1dq7TzEoxjeNTjQZb7VA3e1c7+ImgasAgQ9+xusNVNZIo5xmOMgihIS2PbCQIiHEUdTvhxCcS/kPomfFI2zHy2PkWmA6aNatIJpKFJyekyy02xh5Y3DI9T4aOT6VhIUrsNTFp1pf79Z4SIIVDegl6IJO6cHiL/GimIZDhgTu/BlYWCQzHMl0zBWT/T3KAhtxOuUB9FtBrpsz0RV4xsjHmW+UCaffcSy/5viMGer0/6HdFNMZBq/vjJL38H9Dqx4Fuy0Em12DbZy+9pGtiDijbglwAehyj11n0tRD3WUBm+lwulE/8h4BuA+iWAQQnteg2Xm63WQLTpnMnpjdge0Mgu/GRPsV4xdjQ94Lfi624fabhDkfUqIKNrM64Q837v8yL0prasepCgrtvw1sJpoqanGEX7b5mQboNW8eawXaWXTMfMGxub472hzWzHSn6Sg2G9+6TAyRruE71s+zAzjWaknoyJCQzwxrghH2k5FDT4eqWunuNxyN9QCGcxVod5oADbYnIUkDTGZEf1xDJnSFteQ3KdsT8zYDMQXcHxsevcLH1TrsABzkNPyA/L7b0jg704viMMlpQI96WsHknCt/3YH0kOEo9zcGkwrFK39ck72rmoehmKqo2RKlilzSy/nJKEV45CT38myJp456fezktHjN5aeMAAAAASUVORK5CYII=
  11. // @grant unsafeWindow
  12. // @require https://update.gf.qytechs.cn/scripts/491829/1356221/tampermonkey%20storage%20proxy.js
  13. // @grant GM_getValue
  14. // @grant GM_setValue
  15. // @namespace https://gf.qytechs.cn/users/1184528
  16. // ==/UserScript==
  17.  
  18. ;(async () => {
  19. const a = loadlib("allfuncs")
  20. const sp = new storageproxy("globaloptions")
  21. var ls = sp.get()
  22. var rate = 2
  23. var vidlock = true
  24. ls.blockedUsers ??= []
  25. ls.blockedTitles ??= []
  26. ls.blockedTitlesReg ??= []
  27. ls.blockedCreatorsReg ??= []
  28. await a.waitforelem(
  29. "#channel-name>#container>#text-container>yt-formatted-string>a"
  30. )
  31. var globalname
  32. function newBlockBtn(title, creator) {
  33. var elem = a.newelem("button", {
  34. innerHTML: ls.blockedUsers.includes(this.title)
  35. ? "unblock"
  36. : "block",
  37. creator,
  38. title,
  39. id: "blockbtn",
  40. onclick(e) {
  41. e.stopImmediatePropagation()
  42. e.stopPropagation()
  43. e.preventDefault()
  44. log(this.creator)
  45. if (ls.blockedUsers.includes(this.creator)) {
  46. ls.blockedUsers.splice(
  47. ls.blockedUsers.indexOf(this.creator),
  48. 1
  49. )
  50. } else {
  51. ls.blockedUsers.push(this.creator)
  52. }
  53. update()
  54. log(ls.blockedUsers, this.creator)
  55. },
  56. })
  57. ;((elem, creator) => {
  58. var val = creator
  59. Object.defineProperty(elem, "creator", {
  60. get() {
  61. return val
  62. },
  63. set(newval) {
  64. val = newval.replace(/ • \d+\w? views$/, "")
  65. },
  66. enumerable: true,
  67. configurable: true,
  68. })
  69. })(elem, creator)
  70. return elem
  71. }
  72.  
  73. update()
  74.  
  75. function update() {
  76. unsafeWindow.ls = ls = sp.get()
  77. if (issearch()) {
  78. addVid(
  79. "div#dismissible.style-scope.ytd-video-renderer",
  80. "#video-title",
  81. "#text > a",
  82. "#channel-info"
  83. )
  84. } else if (isroot()) {
  85. globalname = null
  86. addVid(
  87. "div#content.style-scope.ytd-rich-item-renderer:has(ytd-rich-grid-media)",
  88. "#video-title-link",
  89. "#details>#meta>ytd-video-meta-block>#metadata>#byline-container>ytd-channel-name#channel-name>#container>#text-container>yt-formatted-string#text>a",
  90. "#details>#meta>ytd-video-meta-block"
  91. )
  92. } else if (iswatch()) {
  93. globalname = a.qs(
  94. "ytd-channel-name#channel-name>#container>#text-container>yt-formatted-string#text > a"
  95. )?.textContent
  96. if (
  97. !globalname ||
  98. !a.qs("#upload-info") ||
  99. !a.qs("#title > h1 > span.cbCustomTitle")
  100. ) {
  101. return "loading"
  102. }
  103. if (a.qs("#upload-info>#blockbtn")) {
  104. a.qs("#upload-info>#blockbtn").creator = globalname
  105. } else {
  106. a.qs("#upload-info").appendChild(
  107. newBlockBtn(
  108. a.qs("#title > h1 > span.cbCustomTitle").textContent,
  109. globalname
  110. )
  111. )
  112. }
  113. const btn = a.qs("#upload-info>#blockbtn")
  114. vidlock = isBlocked(btn.creator, btn.title)
  115. btn.innerHTML = isBlocked(btn.creator, btn.title)
  116. ? "unblock"
  117. : "block"
  118. try {
  119. addVid(
  120. "#dismissible:has(#video-title)",
  121. "#video-title",
  122. "#container>#text-container>yt-formatted-string#text",
  123. "#byline-container"
  124. )
  125. addVid(
  126. "#movie_player > div.html5-endscreen.ytp-player-content.videowall-endscreen.ytp-show-tiles > div > a:has(span.ytp-videowall-still-info)",
  127. "span.ytp-videowall-still-info > span > span>div>.cbCustomTitle",
  128. "span.ytp-videowall-still-info > span > span>.ytp-videowall-still-info-author",
  129. "span.ytp-videowall-still-info > span > span>div"
  130. )
  131. } catch (e) {
  132. error(e)
  133. }
  134. }
  135. }
  136. function isroot() {
  137. return /^https?:\/\/(?:www\.)?youtube\.com\/?(?:\?|#|$)/.test(
  138. location.href
  139. )
  140. }
  141. function iswatch() {
  142. return /^https?:\/\/(?:www\.)?youtube\.com\/watch\/?(?:\?|#|$)/.test(
  143. location.href
  144. )
  145. }
  146. function issearch() {
  147. return /^https?:\/\/(?:www\.)?youtube\.com\/results\?search_query=.*(?:#|$)/.test(
  148. location.href
  149. )
  150. }
  151.  
  152. setInterval(() => {
  153. update()
  154. if (iswatch()) {
  155. for (var vid of a.qsa("video")) {
  156. vid.playbackRate = vidlock ? 0 : rate
  157. }
  158. }
  159. })
  160.  
  161. function addVid(
  162. mainDivID,
  163. titleID,
  164. creatorID,
  165. blockButtonParentID
  166. ) {
  167. for (var viddiv of a.qsa(mainDivID)) {
  168. var btn
  169. if ((btn = a.qs(blockButtonParentID + ">#blockbtn", viddiv))) {
  170. ;(btn.title = a.qs(titleID, viddiv).textContent),
  171. (btn.creator = a.qs(creatorID, viddiv).textContent)
  172. btn.innerHTML = ls.blockedUsers.includes(btn.creator)
  173. ? "unblock"
  174. : "block"
  175. } else {
  176. btn = a
  177. .qs(blockButtonParentID, viddiv)
  178. .appendChild(
  179. newBlockBtn(
  180. a.qs(titleID, viddiv).textContent,
  181. a.qs(creatorID, viddiv).textContent
  182. )
  183. )
  184. }
  185. viddiv.style.display = isBlocked(btn.creator, btn.title)
  186. ? "none"
  187. : ""
  188. }
  189. }
  190. unsafeWindow.isBlocked = isBlocked
  191. unsafeWindow.addVid = addVid
  192. function isBlocked(creator, title) {
  193. if (
  194. ls.blockedUsers.includes(creator) ||
  195. ls.blockedTitles.includes(title)
  196. )
  197. return true
  198. for (let reg of ls.blockedCreatorsReg) {
  199. if (new RegExp(reg, "i").test(creator)) return true
  200. }
  201. for (let reg of ls.blockedTitlesReg) {
  202. if (new RegExp(reg, "i").test(title)) return true
  203. }
  204. return false
  205. }
  206. })()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址