// ==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;
}