Bye Bye Pinterest

Hides Pinterest from search and Image results

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name        Bye Bye Pinterest
// @namespace   https://cool-website.xyz/projects
// @match       *://www.google.com/*
// @match       *://www.ecosia.org/*
// @match       *://duckduckgo.com/*
// @match       *://html.duckduckgo.com/*
// @match       *://yandex.com/*
// @match       *://search.yahoo.com/*
// @match       *://search.yahoo.co.jp/*
// @match       *://ya.ru/*
// @match       *://yandex.ru/*
// @match       *://yandex.eu/*
// @grant       none
// @version     0.1
// @author      Carn
// @description Hides Pinterest from search and Image results
// @icon        https://cool-website.xyz/projects/bye-bye-pinterest/icon.png
// @homepageURL https://cool-website.xyz/projects/bye-bye-pinterest/
// @license MIT
// ==/UserScript==

// if you add a string to the array here, it blocks it if the hostnames
//are exact matches, otherwises it tests the host name against the regex
//to see if it should block it
const hiddenWebsites = [/.*\.pinterest\..*/, /pinterest\..*/];
const domain = unsafeWindow.location.hostname;

function isBannedHostname(hostname)
{
        return hiddenWebsites.some((hiddenWebsite) =>
        {
                console.log(hiddenWebsite);
                // if you put a string here, it blocks it if
                // the hostnames are exact matches, otherwises it
                // tests the host name against the regex
                return (typeof (hiddenWebsite) == "string" ?
                        hostname ==
                        hiddenWebsite : hiddenWebsite
                        .test(hostname));
        });
}

// takes in the class name of an element containing a URL, a function
// to extract the URL string from that element, and the class name of
// the ansector element that contains the whole search result
// (the element to be removed)
function genericRemove(urlTextEl, urlgetter, containerName)
{
        Array.from(document.getElementsByClassName(urlTextEl))
                .forEach((el) =>
                {
                        //exctract url from element
                        let url = urlgetter(el);
                        console.log(url);
                        let hidden = isBannedHostname((new URL(url))
                                .hostname);
                        if (hidden)
                        {
                                let ancestorElement = el.parentNode;
                                while (ancestorElement && ancestorElement.classList)
                                {
                                        console.log(ancestorElement);
                                        if (ancestorElement.classList
                                                .contains(containerName)
                                        )
                                        {
                                                console.log(ancestorElement);
                                                ancestorElement.style
                                                        .display ="none";
                                                console.log("removed: " +
                                                        url);
                                                break;
                                        }
                                        ancestorElement =
                                                ancestorElement
                                                .parentNode;
                                }
                        }
                        else
                        {
                                console.log("didn't remove: " + url);
                        }
                });
}

switch (domain)
{
case 'html.duckduckgo.com':
        genericRemove('result__url', (a) =>
        {
                return 'http://' + a.textContent.trim();
        }, 'web-result');
        genericRemove('results__url', (a) =>
        {
                return 'http://' + a.textContent.trim();
        }, 'web-results');
        break;
case 'duckduckgo.com':
        // I hate react and the terrible way it names classes
        // Select the target node
        var targetNode = document.querySelector('#links');
        // Create a new instance of the MutationObserver with a callback function
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('Wo6ZAEmESLNUuWBkbMxx', (a) =>
                {
                        return (a.textContent
                                .startsWith(
                                        'https://'
                                ) ?
                                a
                                .textContent
                                .trim() :
                                "https://" +
                                a
                                .textContent
                                .trim());
                }, 'nrn-react-div');
            genericRemove('Wo6ZAEmESLNUuWBkbMxx', (a) =>
                {
                          return (a.textContent
                                .startsWith(
                                        'https://'
                                ) ?
                                a
                                .textContent
                                .trim() :
                                "https://" +
                                a
                                .textContent
                                .trim());
                }, 'wLL07_0Xnd1QZpzpfR4W');
                genericRemove('tile--img__domain', (a) =>
                {
                        return a.title;
                }, 'tile');
                console.log('Content of the div changed');
        });
        // Start observing the target node for configured mutations
        observer.observe(document.body,
        {
                subtree: true,
                childList: true
        });
        break;
case 'www.google.com':
        console.log("google detected");
        genericRemove('VFACy', (a) =>
        {
                return a.href;
        }, 'isv-r');
        //no js version
        genericRemove('UPmit', (a) =>
        {
                return 'http://' + (a.innerText.split('›')[0])
                        .trim();
        }, 'Gx5Zad');
        // Select the target node
        // Create a new instance of the MutationObserver with a callback function
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('VFACy', (a) =>
                {
                        return a.href;
                }, 'isv-r');
                genericRemove('tjvcx', (a) =>
                {
                        return a.firstChild.data
                                .trim();
                }, 'g');
                console.log('Content of the div changed');
        });
        // Start observing the target node for configured mutations
        observer.observe(document.body,
        {
                subtree: true,
                childList: true
        });
        break;
        //images don't work for yahoo
case "search.yahoo.com":
        genericRemove('p-abs', (el) =>
        {
                return "https://" + el.innerText.split("›")[0]
                        .trim();
        }, 'dd');
        break;
        //yahoo japan is different
case "search.yahoo.co.jp":
        genericRemove('sw-Card__titleInner', (el) =>
        {
                return el.href.trim();
        }, 'sw-CardBase');
        genericRemove('sw-ThumbnailGrid__domain', (el) =>
        {
                return "https://" + el.innerText.trim();
        }, 'sw-Thumbnail');
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('sw-ThumbnailGrid__domain', (
                        el) =>
                {
                        return "https://" + el
                                .innerText
                                .trim();
                }, 'sw-Thumbnail');
        });
        observer.observe(document.body,
        {
                subtree: true,
                childList: true
        });
        break;
        // Baidu is explicitly not supported
        //case "www.baidu.com":
        //    genericRemove
        //Neither is bing
        //case "bing.com":
        //images don't work for yandex
case "yandex.com":
case "yandex.eu":
        // for the next two, I'm just assuming it works
case "ya.ru":
case "yandex.ru":
        genericRemove('Path-Item', (el) =>
        {
                return "https://" + el.innerText.split("›")[0]
                        .trim();
        }, 'serp-item');
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('Path-Item', (el) =>
                {
                        return "https://" + el
                                .innerText
                                .split("›")[0]
                                .trim();
                }, 'serp-item');
        });
        if (document.querySelector('main__center'))
        {
                observer.observe(document.querySelector('.main__center'),
                {
                        subtree: true,
                        childList: true
                });
        }
        break;
case "www.ecosia.org":
        genericRemove('source__content--domain', (el) =>
        {
            var a = el.innerText.trim();
           return (a.startsWith('https://') ? a : "https://" +  a);

        }, 'result__body');
        genericRemove('image-result__details-source', (el) =>
        {
                return "https://" + el.innerText.trim();
        }, 'image-result');
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('image-result__details-source', (el) =>
                {
                        return "https://" + el
                                .innerText
                                .trim();
                }, 'image-result');
        });
        if (document.querySelector('.image-feed')){
                observer.observe(document.querySelector('.image-feed'),
                {
                        subtree: true,
                        childList: true
                });
        }
        break;
default:
        break;
}