Greasy Fork is available in English.

TwitchBlock Plus

Remove people/games from directories

// ==UserScript==
// @name        TwitchBlock Plus
// @description Remove people/games from directories
// @namespace   mothproof
// @include     http://www.twitch.tv/*
// @version     1.1
// @grant       none
// ==/UserScript==

if(typeof $ == 'undefined') var $ = unsafeWindow.jQuery;

$(function()
{
  var
  people = [
    'lirik',
    'sodapoppin'
  ],
  games = [
    'fifa',
    'counter-strike',
    'dota',
    'hearth',
    'gaming talk shows'
  ];
  
  var
  debug = false,
  $b = $('body'),
  wrapper,
  lastChannelCount,
  pplReg,
  gamesReg;
  
  if (games) {
    gamesReg = new RegExp(games.join('|').replace(/[-[\]{}()*+?.,\\^$#\s]/g, '\\$&'), 'i');
  }
  if (people) {
    pplReg = new RegExp(people.join('|').replace(/[-[\]{}()*+?.,\\^$#\s]/g, '\\$&'), 'i');
  }
  
  function log(msg) {
    if (!debug) {
      return;
    }
    console.log(msg);
  }
  
  var treeModifiedEvent = function (e)
  {
    $b.off('DOMSubtreeModified', treeModifiedEvent);
    
    switch (window.location.pathname) {
      case '/directory':
        wrapper = '.js-games';
        titleObject = 'a.game-item';
        break;
      default:
      case '/directory/all':
        titleObject = '.boxart';
        wrapper = '.js-streams';
        break;
    }
    
    var 
    $w = $(wrapper),
    $channels = $w.find('> div > div');
    
    if ($channels.length != lastChannelCount)
    {
      $channels.each(function()
      {
        var 
        $gameContainer = $(this),
        $title = $gameContainer.find(titleObject),
        $cap = $gameContainer.find('a.cap');
        
        if (gamesReg && gamesReg.test($title.attr('title'))) {
          log('removing game ' + $title.attr('title'));
          $gameContainer.css('display', 'none');
        }
        if (pplReg && pplReg.test($cap.attr('href'))) {
          log('removing person ' + $cap.attr('href'));
          $gameContainer.remove();
        }
        
        // in cases when there are few results, there might not be enough filler to scroll
        $('.tse-scroll-content').scroll();
      });
      
      lastChannelCount = $channels.length;
    }

    setTimeout(function () {
      $b.on('DOMSubtreeModified', treeModifiedEvent);
    }, 1000);
  };
  
  $b.on('DOMSubtreeModified', treeModifiedEvent);
});