Greasy Fork is available in English.

Block Youtube Users

Prevent from seeing videos by certain users (from recommended, search, related channels...) [for BOTH the OLD and NEW YT's LAYOUT]

2017/10/17のページです。最新版はこちら

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
  1. // ==UserScript==
  2. // @name Block Youtube Users
  3. // @author Schegge
  4. // @namespace https://github.com/Schegge
  5. // @description Prevent from seeing videos by certain users (from recommended, search, related channels...) [for BOTH the OLD and NEW YT's LAYOUT]
  6. // @version 2.3.1
  7. // @match *://www.youtube.com/*
  8. // @exclude *://www.youtube.com/embed/*
  9. // @require https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js
  10. // @grant GM_getValue
  11. // @grant GM_setValue
  12. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkMzRDhDREZEMzVGMDExRTVBOUUzRDg5MDZENTJEMTA2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkMzRDhDREZFMzVGMDExRTVBOUUzRDg5MDZENTJEMTA2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QzNEOENERkIzNUYwMTFFNUE5RTNEODkwNkQ1MkQxMDYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QzNEOENERkMzNUYwMTFFNUE5RTNEODkwNkQ1MkQxMDYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6dWQTHAAADwklEQVR42tRaTUwTQRR+u10q5WKTclOExASMwXT1aExoQpB4UHswajyVSDx40Caa6AmrJ000URI9EJP2ZOJJiBeh/oD4c6S9iScRDxyoQQ4USuk6s4wy2c7szP6Uti95TCAz3W9nvve996YohmFAM5oKTWpNC1wTTchOTibQ8Bj5Xh+fm0e+gvwH8WniQhsYHJQDjizhM2hsUTL2kfEOGSeQZ5CP+0GV3C4y4CzyV+SZuieqkCMFZbkAwedpT6gqh3qgcqADjd1gtLWJTmQO+RA5AVfAYRv4Mqjz370pAbV+66gO5ZP95svYWJqKgcZQlcBcDvY8eAQtL16KpmYaUg617DsRBTuJQLjjuC13O/YDIM7Sx46phePCShHm7n/+CgG0duvEcd6UpHXnNT9UZePeCP3rAut4tZnZU9qb7BFlaSnE+oyW8dd2wKOug5NnRiRSpfuhoSusZJIyf4Zap6C4PlAV/IUCqD8XTdXhWIwOUs8cN9ojzhYU189zVefbvP+1itHe7lc84piZYUruWrEWwCPQSFYfOVRV5i7Y8LtK3VTJo3ViYVvp7D18ESqVXnZJ0M1btmBVN1/k0KoexfSYTr009i6l8LtV+zh7LpB9f5C1qDzQb1e/pHyXQ5xcgqPPwNg55qhVd7FaKEjqlCI7+IxQCMrx07xHTDDzgl91B8y5q34x6NLtm7zd/sNK946Dk5FsvOUABBpnXZugjPNizBlwnyURUyc4+tTMmAybsWvn6l4dqou/IHj/IQt8HwEe9tRImLa2xvwzbgoMOw1G6zAwXpWId74FlbaWYo0GH7NSRnO6O1Xa29MNpWtXJbuogtk4BBiBjD878OkLq0KMEjlM1o0qOEbwS+ITYh7/1Fve0us4F/guh4wsN85RA4xYR5rdydt1BdGKI41JetdrATyD6vGUbWWbHsOc/cCkE4oFg91Ax2ngMlTR/X4zTqMhsk6aLjLAww4fkPO0Gfb3LV2Og5OTJNxWk3Fu9Whf2rpQFY6Gu6CWbpU2Wlp3r5GofqGwzTGnSEJhXqKW+V2+q8wZEyUlFGz/d0tZXR1mrNFBcOOLC7gtMfBp3+WQSuf7iDuy0nBCNCXfUEWWCfpyQnT5CWC5M9fqCRjX45uXLshQBMDFFVxNAFeO6bAZPyNb4z+B7etm58GJj3Lj1g1mwqC1V3gbZZkvYXnPzbIED6XmOLB/PedKw3VAgiozxishGhX4XaL9OS8JKAc7X+vV0vJEOTIy9Y4M8CQB3yWbTSVtmhpz4PCqT2nWf0L4K8AAGQEtCug+rd8AAAAASUVORK5CYII=
  13. // ==/UserScript==
  14.  
  15. /*** DESCRIPTION
  16. → the program is case-insensitive
  17. → you can choose the symbol to split the usernames (default is a comma) ('*' not allowed) (max 1 character)
  18. → put a * in front of a word for wildcard (only in the blacklist!), it will find the word no matter its position in the username (example: *vevo)
  19. → you can enable/disable to blacklist channels by clicking/right clicking on '[x]' before the usernames
  20. → you can suspend temporarily the block (to reactivate it just click on save or refresh the page)
  21. → it also hides videos from the playlists/mixes, but it doesn't prevent them from playing if the playlist is in autoplay
  22.  
  23. <!> please report any bugs
  24. ***/
  25.  
  26. /*** <!> KNOWN BUG WITH THE NEW LAYOUT
  27.  
  28. when the click on the usernames to blacklist them it's enabled
  29. clicking on '[x]' opens the video
  30. ***/
  31.  
  32. (function($) {
  33.  
  34. // get black/whitelist saved
  35. var sBL, sWL, sep, add, ytblacklist, ytwhitelist;
  36. function getValues() {
  37. sBL = GM_getValue('savedblocks', 'it is case-insensitive, split the usernames with a comma (default), put a * in front of a word for wildcard, it will find the word no matter its position in the username');
  38. sWL = GM_getValue('savedwhites', 'write here whitelisted usernames, if for example you blacklist *vevo, but you want to see IndilaVEVO');
  39. sep = GM_getValue('sep', ',');
  40. add = GM_getValue('enableadd', '');
  41. ytblacklist = sBL.split(sep);
  42. ytwhitelist = sWL.split(sep);
  43. }
  44. getValues();
  45.  
  46. if (GM_getValue('byuver', '1') !== '2.3.1') {
  47. $('body').append('<div id="byu-notice" style="position: fixed; z-index: 999999; width: 40%; min-width: 200px; font-size: 1.2em; padding: 1.5em; bottom: 50px; right: 50px; background: red; color: #fff">[2.3] "Block YouTube Users" now works with both the old and new layout!<br><br>[2.3.1] KNOWN BUG (with the new layout): clicking on [x] opens the video, so <b>right-click</b> it instead.<br><br><span style="cursor: pointer; background: rgba(0,0,0,.5); border-radius: 5px; padding: 0 5px">dismiss</span></div>');
  48. GM_setValue('byuver', '2.3.1');
  49. $('#byu-notice span').on('click', function() { $('#byu-notice').remove(); });
  50. }
  51.  
  52. // vars
  53. var suspend = false;
  54. var uClasses, tClasses, margintop;
  55.  
  56. // check what layout
  57. var ver = $('#upload-btn').length ? 'old' : 'new';
  58.  
  59. if (ver == 'new') {
  60. // where the usernames are
  61. // //grid
  62. uClasses = ['#byline.ytd-grid-video-renderer a',
  63. //big channel recommend
  64. 'a.ytd-shelf-renderer[href*=user] #title.ytd-shelf-renderer, a.ytd-shelf-renderer[href*=channel] #title.ytd-shelf-renderer',
  65. //search
  66. '#byline.ytd-video-meta-block',
  67. //search channels
  68. '#channel-title.ytd-channel-renderer span.ytd-channel-renderer',
  69. //related channels
  70. '.title.ytd-mini-channel-renderer',
  71. //playlist
  72. '#byline.ytd-playlist-panel-video-renderer'];
  73. tClasses = 'ytd-video-renderer, ytd-grid-video-renderer, ytd-channel-renderer, ytd-mini-channel-renderer, ytd-playlist-renderer, ytd-compact-video-renderer, ytd-compact-autoplay-renderer, ytd-playlist-panel-video-renderer';
  74.  
  75. // research
  76. window.addEventListener('load', search, false);
  77. window.addEventListener('yt-action', search, false);
  78. window.addEventListener('yt-page-data-updated', search, false);
  79. window.addEventListener('yt-load-next-continuation', search, false);
  80. window.addEventListener('yt-load-reload-continuation', search, false);
  81. window.addEventListener('shown-items-changed', search, false);
  82.  
  83. } else { // old
  84. uClasses = ['#content .g-hovercard',
  85. //related channels
  86. '.branded-page-related-channels-list .yt-uix-tile-link',
  87. //playlist/mixes
  88. '.video-uploader-byline'];
  89. tClasses = 'tr, li';
  90.  
  91. // research
  92. var target = document.querySelector('#content');
  93. var config = { attributes: false, childList: true, characterData: false, subtree: true };
  94. var observer = new MutationObserver(function(mutations) { search(); });
  95.  
  96. try { observer.observe(target, config); } catch (e) {}
  97. }
  98.  
  99. $('head').append('<style> ' +
  100. '#byu-is-black { display: none!important; } ' +
  101. '#byu { color: #A0A0A0; cursor: pointer; font-size: 22px; vertical-align: middle; } ' +
  102. '#byu-options { width: 500px; display: flex; flex-flow: row wrap; align-items: baseline; position: fixed; right: 70px; padding: 0 20px 15px; background-color: #fff; box-shadow: 0 1px 2px 0 rgba(0,0,0,.1); border: 1px solid #fafafa; border-top: 0; z-index: 9999999999; } ' +
  103. '#byu-options div { box-sizing: border-box; padding: 5px; font-size: 1em; } ' +
  104. '#byu-options .textarea div { font-size: 1.2em; width: 100%; text-align: center; font-weight: 500; } ' +
  105. '#byu-options .textarea textarea { font-size: 1em; resize: vertical; width: 100%; padding: 4px; border: 2px solid rgba(0,0,0,.13); box-sizing: border-box; } ' +
  106. '#byu-options .textarea.wl { width: 45%; } ' +
  107. '#byu-options .textarea.bl { width: 55%; } ' +
  108. '#byu-saveblacklist { font-size: 1.2em; font-weight: bold; cursor: pointer; color: #FF0000; } ' +
  109. '.byu-sep { width: 33%; font-size: 9px; color: rgba(0,0,0,.5); } ' +
  110. '#byu-sep-symbol { width: 10px; background: #fff; border: 1px dotted rgba(0,0,0,.13); padding: 0 2px; color: #000; } ' +
  111. '#byu-enableadd { width: 33%; cursor: pointer; color: rgba(0,0,0,.5); text-align: center; } ' +
  112. '#byu-suspend { width: 33%; cursor: pointer; color: rgba(0,0,0,.5); text-align: right; } ' +
  113. '.byu-add { font-size: .8em; margin-right: .5em; cursor: pointer; color: #FF0000; font-family: consolas, monospace; vertical-align: top; }' +
  114. '#byline.ytd-playlist-panel-video-renderer { display: inline-block!important; }' +
  115. '</style>');
  116.  
  117. $('body').append('<div id="byu-options" style="display: none">' +
  118. '<div style="width: 100%; text-align: right"><span id="byu-saveblacklist">save</span></div>' +
  119. '<div class="textarea wl"><div>Whitelist</div><textarea rows="4" id="byu-whitelist-words">' + sWL + '</textarea></div>' +
  120. '<div class="textarea bl"><div>Blacklist</div><textarea rows="4" id="byu-blacklist-words">' + sBL + '</textarea></div>' +
  121. '<div class="byu-sep">separator: <input id="byu-sep-symbol" type="text" value="' + sep + '" maxlength="1" /></div>' +
  122. '<div id="byu-enableadd">enable click add</div>' +
  123. '<div id="byu-suspend">suspend block</div>' +
  124. '</div>');
  125. if (add) $('#byu-enableadd').text('disable click add');
  126.  
  127. // with the new layout, wait till the masthead is added
  128. var waiting = setInterval(function() {
  129. if (ver == 'old' || $('#buttons').length) {
  130. clearInterval(waiting);
  131. button();
  132. }
  133. }, 1000);
  134.  
  135. function button() {
  136. if (ver == 'new') {
  137. $('#buttons').before('<div style="display: inline-block; position: relative; height: 28px; width: 30px"><span id="byu">B</span></div>');
  138. margintop = $('#container.ytd-masthead').height();
  139. } else {
  140. $('#upload-btn').before('<div style="display: inline-block; position: relative; height: 28px; width: 30px"><span id="byu">B</span></div>');
  141. margintop = $('#yt-masthead-container').height() + parseInt($('#yt-masthead-container').css('padding-top')) + parseInt($('#yt-masthead-container').css('padding-bottom'));
  142. }
  143.  
  144. $('head').append('<style>#byu-options {top:' + margintop + 'px; }</style>');
  145. }
  146.  
  147. // check if a username is whitelisted
  148. function ifWhite(u) {
  149. var whitelisted = false;
  150. for(var z = 0; z < ytwhitelist.length; z++) {
  151. var w = ytwhitelist[z].trim().toLowerCase();
  152. if (w.length && u == w) {
  153. whitelisted = true;
  154. }
  155. }
  156. return whitelisted;
  157. }
  158.  
  159. // check if a username is blacklisted
  160. function ifMatch(u) {
  161. var match = false;
  162. if (!ifWhite(u)) { // if the username isn't whitelisted
  163. for (var j = 0; j < ytblacklist.length; j++) {
  164. var b = ytblacklist[j].trim().toLowerCase();
  165. if (b.charAt(0) == '*') { // wildcards
  166. var part = b.split('*'),
  167. item = part[1];
  168. if (item.length && u.indexOf(item) !== -1) {
  169. match = true;
  170. }
  171. } else { // exact match
  172. if (b.length && u == b) {
  173. match = true;
  174. }
  175. }
  176. }
  177. }
  178. return match;
  179. }
  180.  
  181. // do the thing
  182. function findMatch(s) {
  183. $(s).each(function() {
  184. var username = $(this).text().trim().toLowerCase();
  185. if (!username) return 'continue';
  186.  
  187. // if the username is blacklisted
  188. if (!suspend && ifMatch(username)) {
  189. if (!$(this).closest(tClasses).attr('id', 'byu-is-black')) {
  190. $(this).closest(tClasses).attr('id', 'byu-is-black');
  191. }
  192. } else if (add) {
  193. if (!$(this).siblings('.byu-add').length) {
  194. $('<span class="byu-add" data="' + username + '">[x]</span>').insertBefore($(this));
  195. } else if ($(this).siblings('.byu-add').attr('data') != username) {
  196. $(this).siblings('.byu-add').attr('data', username);
  197. }
  198. }
  199. });
  200. }
  201.  
  202. // the final search function
  203. function search() {
  204. var url = window.location.href;
  205. // playlist?list=WL = Watch Later | != feed/t... = History, Subscriptions
  206. if (!/.*youtube\.com\/(playlist\?list=WL|feed\/[^t]\w+)/.test(url)) {
  207. for (var i = 0; i < uClasses.length; i++) {
  208. findMatch(uClasses[i]);
  209. }
  210. }
  211. }
  212. search();
  213.  
  214. // open and close options
  215. $('body').on('click', '#byu', function() {
  216. $('#byu-options').slideToggle();
  217. $(this).css('font-weight', $(this).css('font-weight') == 'bold' ? 'normal' : 'bold');
  218. });
  219.  
  220. // save blacklist changes and research
  221. $saved = $('<span style="margin-right: 7px; font-size: 80%">saved</span>');
  222. $error = $('<span style="margin-right: 7px; font-size: 80%; color: red">ERROR! * NOT ALLOWED AS SEPARATOR</span>');
  223. $('#byu-saveblacklist').on('click', function() {
  224. if ($('#byu-sep-symbol').val() == '*') {
  225. $(this).before($error);
  226. setTimeout(function() { $error.remove(); }, 4000);
  227. } else {
  228. if (suspend) {
  229. $('#byu-suspend').css('font-weight', 'normal');
  230. suspend = false;
  231. }
  232. // save new values
  233. GM_setValue('savedblocks', $('#byu-blacklist-words').val());
  234. GM_setValue('savedwhites', $('#byu-whitelist-words').val());
  235. GM_setValue('sep', $('#byu-sep-symbol').val());
  236. // add notification
  237. $(this).before($saved);
  238. setTimeout(function() { $saved.remove(); }, 2000);
  239. // clear everything
  240. $('[id="byu-is-black"]').each(function(){ $(this).attr('id', ''); });
  241. // research
  242. getValues();
  243. search();
  244. }
  245. });
  246.  
  247. // enable/disable click add
  248. $('#byu-enableadd').on('click', function() {
  249. if (add) {
  250. add = '';
  251. $('.byu-add').remove();
  252. $(this).text('enable click add');
  253. } else {
  254. add = 'yes';
  255. $(this).text('disable click add');
  256. }
  257. GM_setValue('enableadd', add);
  258. search();
  259. });
  260.  
  261. // suspend
  262. $('#byu-suspend').on('click', function() {
  263. suspend = true;
  264. $('[id="byu-is-black"]').each(function(){ $(this).attr('id', ''); });
  265. $(this).css('font-weight', 'bold');
  266. });
  267.  
  268. // add usernames to blacklist
  269. $('body').on('click contextmenu', '.byu-add', function(e) {
  270. e.preventDefault();
  271. e.stopPropagation();
  272. var q = sBL ? sep + ' ' : '';
  273. $('#byu-blacklist-words').val($('#byu-blacklist-words').val() + q + $(this).attr('data'));
  274. GM_setValue('savedblocks', $('#byu-blacklist-words').val());
  275. getValues();
  276. search();
  277. });
  278.  
  279. })(jQuery);