sjehuda / SearX Results Filter

// ==UserScript== 
// @name        SearX Results Filter
// @namespace   i2p.schimon.searxfilter
// @description Remove links from search results.
// @author      Schimon Jehudah, Adv.
// @copyright   2023, Schimon Jehudah (http://schimon.i2p)
// @license     MIT; https://opensource.org/licenses/MIT
// @grant       none
// @homepageURL https://openuserjs.org/scripts/sjehuda/SearX_Results_Filter
// @supportURL  https://openuserjs.org/scripts/sjehuda/SearX_Results_Filter/issues
// @include     https://SearxngInstanceUrl/search*
// @version     23.03
// @run-at      document-end
// @icon        data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjRtbSIgaGVpZ2h0PSI2NG1tIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTkycHg7bGluZS1oZWlnaHQ6MDt0ZXh0LWluZGVudDowO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uLXN0eWxlOnNvbGlkO3RleHQtZGVjb3JhdGlvbi1jb2xvcjojMDAwO3dyaXRpbmctbW9kZTpsci10YjtkaXJlY3Rpb246bHRyO3RleHQtb3JpZW50YXRpb246bWl4ZWQ7ZG9taW5hbnQtYmFzZWxpbmU6YXV0bztiYXNlbGluZS1zaGlmdDpiYXNlbGluZTt0ZXh0LWFuY2hvcjpzdGFydDtzaGFwZS1wYWRkaW5nOjA7c2hhcGUtbWFyZ2luOjA7aW5saW5lLXNpemU6MDtvcGFjaXR5OjE7ZmlsbDojMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDoxLjI3OTgyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3N0b3AtY29sb3I6IzAwMDtzdG9wLW9wYWNpdHk6MSIgeD0iMTcuMDA1MjQ1IiB5PSIzMS42NTg0MDUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjQzNjg1NjQgNDAuODk0OTQpIHNjYWxlKC4yNjQ1OCkiPjx0c3BhbiB4PSIxNy4wMDUyNDUiIHk9IjMxLjY1ODQwNSIgc3R5bGU9ImZvbnQtc2l6ZToxOTJweCI+8J+boO+4jzwvdHNwYW4+PC90ZXh0Pjwvc3ZnPgo=
// ==/UserScript==

// Javascript implementation of Java’s String.hashCode() method
String.prototype.hashCode = function(){
  var hash = 0;
  if (this.length == 0) return hash;
  for (i = 0; i < this.length; i++) {
    char = this.charCodeAt(i);
    hash = ((hash<<5)-hash)+char;
    hash = hash & hash; // Convert to 32bit integer
  }
  return hash;
};
// Manwe Security Consulting

const domains = [
1011086976,1072789513,1746076303,1873419916,1807696995,200689189,208906360,
165020600,-138065189,-554920372,1482490179,2041621832,508927357,332286469,
2127428686,1803821636,-772970925,60433162,2056911440,-696086213,-226216208,
568696146,2056911440,-1376709159,374301332,-1710483397,-491772566,58427465,
-2051420948,-1031144132,-333386213,1837301364,204018826,-972811757,-686515808,
-2044679369,540535309,-383025757,1591598804,-2032889839,-516285098,2056053460,
904207091,-774960864,-1704017372,754392788,253824854,1331596452,-1394732048,
-2049573906,-1694642173,1877757210,707076672,-2050497427,1073639165,1011107447,
-2067829511,1561330680,2004471051,-964488554,-2044898019,129388118,1042705622,
659999749,-1986430767,-1557529491,-1473409395,-640005308,-1830313082,1320172991,
-1452764056,1530878469,1672584528,1912841799,-631031994,-1759516559,-373274299,
1472103342,28462918,-1384399005,-1025028954,-1002905536,-1536293812,847444939,
-1240091005,-1240090634,-1610658671,426751880,1349062171,-1423874876,855396316,
-1057382331,
-1207901707, // abc.com
-224401944, // www.abc.net.au
91124052, // abcnews.go.com
-1413024603, // ap.org
-255548196, // www.ap.org
-1059667691, // apnews.com
-593770790, // ground.news
-347527963, // bbcnews.bbcstudios.com
-1856091953, // wwwnews.live.bbc.co.uk
1201632223, // www.bbc.com
824039218, // www.bbcnews.com
-770409358, // news.bbc.co.uk
1335085517, // bbc.co.uk
-577693130, // www.bbc.co.uk
758316297, // bbcnews.com
941125331, // bing.com
879422794, // www.bing.com
317218970, // bloomberglaw.com
-1802373298, // bloomberg.com
1227811639, // www.bloomberg.com
-1057277710, // www.businessinsider.com
1100257225, // businessinsider.com
106864602, // cbsnews.com
172587523, // www.cbsnews.com
-1815724417, // cnbc.com
-1877426954, // www.cnbc.com
920814198, // cnn.com
-1852122849, // www.cnn.com
369654750, // www.foxnews.com
303931829, // foxnews.com
-1242184837, // go.com
1617840950, // guardian.ng
1001802679, // www.huffpost.com
-1035607872, // huffpost.com
-471498931, // www.independent.co.uk
1881581540, // independent.co.uk
1668850948, // latimes.com
1734573869, // www.latimes.com
'mozilla.com',
'mozilla.org',
669736469, // nbcnews.com
735459390, // www.nbcnews.com
955565566, // nypost.com
-2140583194, // npr.org
2014281623, // www.nytimes.com
1948558702, // nytimes.com
1065885552, // politico.com
-1191671193, // www.politico.com
-381258527, // politico.eu
-315535606, // www.politico.eu
802420432, // www.reuters.com
736697511, // reuters.com
-2134724812, // sky.com
1103245374, // www.theguardian.com
1083347605, // theguardian.com
622620063, // thetimes.co.uk
69072598, // www.thetimes.co.uk
-2036711631, // usatoday.com
698920, // www.usatoday.com
1149470915, // washingtonpost.com
1218420346, // www.washingtonpost.com
-1328826067, // wikipedia.org
1630470305, // wsj.com
-1142466742, // www.wsj.com
-1311829293, // yahoo.com
1070359356, // www.yahoo.com
1123383988, // ca.sports.yahoo.com
'yewtu.be',
'youtu.be',
'youtube.com',
-12310945, // www.youtube.com
-78033866, // youtube.com
];

console.info('Copy the following string, if you want to filter results of this website');
console.info(location.hostname.hashCode() + ', // ' + location.hostname);

(function removeResultItems() {

  // Scan results to filter
  for (const link of document.querySelectorAll('a[href^="http"]')) {

    var hostname, url, i = 0;

    try {
      url = new URL (link.href);
      hostname = url.hostname;
    } catch (err) {
      var invalidLink = link.href;
      var locationHrf = location.href;
      var searchQuery = document.querySelector('input').value;
      console.error(`Error: ${err}`);
      console.warn(
      `
        WARNING! Invalid URL
        URL: "${invalidLink}"
        Instance: "${locationHrf}"
        Query: "${searchQuery}".
        Please report this to SearXNG.
      `
      );
    }

    if (hostname.endsWith('.xxx') ||
        hostname.endsWith('.sex') ||
        hostname.endsWith('.porn') ||
        hostname.endsWith('.adult')) {
      removeNode(link);
      removalReason(link.href, null);
      continue;
    }

    if (domains.includes(hostname) ||
        domains.includes(hostname.hashCode())) {
      removalReason(link.href, hostname);
      removeNode(link);
      continue;
    }

    if (hostname.startsWith('www.')) {
      hostname =
        hostname
        .slice(
          hostname
          .indexOf('www.')+4
        );
    }

    /*
    if (domains.includes(hostname)) {
      link
      .closest('.result')
      .remove();
    }
    */

    if (domains.includes(hostname) ||
        domains.includes(hostname.hashCode())) {
      removalReason(link.href, hostname);
      removeNode(link);
      continue;
    }

    var partedHost = hostname.split('.');
    var tld = partedHost[partedHost.length-2] + '.' + partedHost[partedHost.length-1];

    if (domains.includes(tld) ||
        domains.includes(tld.hashCode())) {
      removalReason(link.href, tld);
      removeNode(link);
      continue;
    }

  }

  // When all result were filtered, navigate to next page
  if (document.querySelectorAll('.result').length < 1) {
    try {
      document.querySelector('.next_page > * > button').click();
    } catch {
      alert('No results.');
    }
  }

  // TODO Execute upon content change
  document.addEventListener('scroll', removeResultItems);

  // Display block rule
  document.addEventListener("mouseover", function(e) {
    if (e.target && e.target.nodeName == "A") {
      url = new URL (e.target);
      console.info(`INFO: To filter results from ${url.hostname}, use the following string ${url.hostname.hashCode() + ', // ' + url.hostname}`);
    }
  });

})();

function removeNode(link) {
  try {
    link
    .closest('.result')
    .remove();
  } catch {
    try {
      link
      .closest('#infoboxes')
      .remove();
    } catch (err) {
      console.error('Error: ' + err);
    }
  }

}

function removalReason(url, rule) {

  if (rule) {
    try {
      rule = domains[domains.indexOf(rule.hashCode())];
    } catch {
      rule = domains[domains.indexOf(rule)];
    }
    console.log(`Link: ${url} has been blocked by rule ${rule}`);
  } else {
    console.log(`Link: ${url} has been blocked by TLD rule.`);
  }
}