From 45f190ebcdc51a34c9e63fcbe57309c5bdd628c1 Mon Sep 17 00:00:00 2001 From: blankie Date: Sun, 30 Jul 2023 21:00:27 +1000 Subject: [PATCH] Update Image Loader Placeholder Remover to 1.13.0 - Automatically identify and remove image loaders, even from unknown sites - Add support for Wikihow --- Image Loader Placeholder Remover.user.js | 397 +++++++++++------------ 1 file changed, 186 insertions(+), 211 deletions(-) diff --git a/Image Loader Placeholder Remover.user.js b/Image Loader Placeholder Remover.user.js index 1fe24e9..15ca90d 100644 --- a/Image Loader Placeholder Remover.user.js +++ b/Image Loader Placeholder Remover.user.js @@ -3,243 +3,218 @@ // @namespace blankie-scripts // @match http*://*/* // @grant none -// @version 1.12.1 +// @version 1.13.0 // @author blankie // @run-at document-end // @description Removes image loading placeholders // ==/UserScript== -// https://closeronline.co.uk -// https://closeronline.co.uk/real-life/news/ever-used-excuses-documented-spreadsheet-man-used-expose-wife-s-lack-sex -function closeronline() { - for (element of document.querySelectorAll(".image-container")) { - let imageElement = element.querySelector("img"); - let loadingElement = element.querySelector(".image-loading"); - if (imageElement === null || loadingElement === null) { - continue; - } - if (imageElement.attributes["data-src"] === undefined || imageElement.attributes["data-src"].value.length <= 0) { - continue; - } - let url = new URL(imageElement.attributes["data-src"].value, location); - let dontAddLink = hasLinkParent(element); +"use strict"; - if (!dontAddLink) { - let newImageElement = imageElement.cloneNode(); - newImageElement.src = url.href; - newImageElement.style.opacity = 100; - newImageElement.style.display = "block"; - url.search = ""; - let imageWrapper = document.createElement("a"); - imageWrapper.href = url.href; - imageWrapper.appendChild(newImageElement); - imageElement.replaceWith(imageWrapper); - } else { - imageElement.src = url.href; - imageElement.style.opacity = 100; - imageElement.style.display = "block"; - } - - loadingElement.remove(); - } +function isUrlLike(url) { + return url && /^(?:\/|https?:\/\/)\S+$/.test(url); } - -// https://www.indiatoday.in -// https://www.indiatoday.in/technology/news/story/vivo-v25-pro-launched-in-india-price-starts-from-rs-35-999-1988971-2022-08-17 -function indiatoday() { - for (element of document.querySelectorAll("img.lazyload")) { - if (element.attributes["data-src"] === undefined || element.attributes["data-src"].value.length <= 0) { - continue; - } - let url = new URL(element.attributes["data-src"].value, location); - let dontAddLink = hasLinkParent(element); - - if (!dontAddLink) { - let newElement = element.cloneNode(); - newElement.src = url.href; - url.search = ""; - let wrapper = document.createElement("a"); - wrapper.href = url.href; - wrapper.appendChild(newElement); - element.replaceWith(wrapper); - } else { - element.src = url.href; +function findUrl(element) { + if (window.location.host === "www.vice.com") { + let picture = element.parentElement; + let source = picture && picture.localName === "picture" ? picture.querySelector("source") : null; + if (source) { + return source.srcset; } } -} -// TODO add support for home page, i'm too lazy -// https://www.vice.com/en/article/dy73n7/ehallpass-1000-thousand-schools-monitor-bathroom -function vice() { - for (element of document.querySelectorAll(".lazyloader--lowres")) { - let sourceElement = element.querySelector("source"); - let imgElement = element.querySelector("img"); - if (sourceElement === null || imgElement === null) { + // Examples of data-src: + // - https://closeronline.co.uk + // - https://closeronline.co.uk/real-life/news/ever-used-excuses-documented-spreadsheet-man-used-expose-wife-s-lack-sex + // - https://daramiblog.com + // - https://daramiblog.com/how-to-group-irregular-verbs-for-more-efficient-learning/ + // - https://www.bleepingcomputer.com/ + // - https://www.bleepingcomputer.com/news/microsoft/windows-11-snipping-tool-privacy-bug-exposes-cropped-image-content/ + // - https://blog.joshumax.me/general/2021/08/11/running-doom-on-captioncall.html + // - https://legendsoflocalization.com/common-problems-when-translating-games-into-japanese/ + // - https://knowyourmeme.com/ + // - https://knowyourmeme.com/memes/saddam-husseins-hiding-place + if (isUrlLike(element.dataset.src)) { + return element.dataset.src; + } + + for (let attr of element.attributes) { + // Examples of lazy: + // - https://daramiblog.com/ + // - https://daramiblog.com/how-to-group-irregular-verbs-for-more-efficient-learning/ + // - https://www.theautopian.com/ + // - https://www.theautopian.com/nobody-wants-touch-screen-glove-box-latches-and-it-needs-to-stop-now/ + // - https://vulcan.io/blog/ + // - https://vulcan.io/blog/ai-hallucinations-package-risk + // Examples of src: + // - https://vulcan.io/blog/ + // - https://vulcan.io/blog/ai-hallucinations-package-risk + // Examples of loading: + // - https://closeronline.co.uk + // - https://closeronline.co.uk/real-life/news/ever-used-excuses-documented-spreadsheet-man-used-expose-wife-s-lack-sex + // Examples of original: + // - https://www.pcgamer.com/ + // - https://www.pcgamer.com/windows-95-theme-for-windows-10/ + if (!attr.name.includes("lazy") && !(attr.name.includes("src") && attr.name !== "src") && !attr.name.includes("loading") && !attr.name.includes("original")) { continue; } - let url = new URL(sourceElement.srcset, location); - url.search = ""; - - let newImgElement = imgElement.cloneNode(); - newImgElement.src = url.href; - newImgElement.style.filter = "none"; - let imgWrapper = document.createElement("a"); - imgWrapper.href = url.href; - imgWrapper.appendChild(newImgElement); - imgElement.replaceWith(imgWrapper); - - for (sourceElement of element.querySelectorAll("source")) { - sourceElement.remove(); + if (!isUrlLike(attr.value)) { + continue; } + return attr.value; + } + + return null; +} + +function unhideElement(element) { + let style = getComputedStyle(element); + + // Examples of opacity: + // - https://closeronline.co.uk + // - https://closeronline.co.uk/real-life/news/ever-used-excuses-documented-spreadsheet-man-used-expose-wife-s-lack-sex + // - https://www.vice.com/en/article/dy73n7/ehallpass-1000-thousand-schools-monitor-bathroom + // - https://daramiblog.com/ + // - https://daramiblog.com/how-to-group-irregular-verbs-for-more-efficient-learning/ + // - https://www.wired.com/ + // - https://www.wired.com/story/researcher-fooled-a-google-ai-into-thinking-a-rifle-was-a-helicopter/ + if (style.opacity === "0") { element.style.opacity = 1; } -} -// https://daramiblog.com/ -// https://daramiblog.com/how-to-group-irregular-verbs-for-more-efficient-learning/ -function wordpress() { - for (element of document.querySelectorAll("img.lazyload.wp-post-image")) { - if (element.attributes["data-src"] === undefined || element.attributes["data-src"].value.length <= 0) { - continue; - } - element.src = element.attributes["data-src"].value; - element.style.opacity = 100; + // Examples of display: + // - https://closeronline.co.uk + // - https://closeronline.co.uk/real-life/news/ever-used-excuses-documented-spreadsheet-man-used-expose-wife-s-lack-sex + if (style.display === "none") { + element.style.display = "block"; } } -// https://www.pcgamer.com/ -// https://www.pcgamer.com/windows-95-theme-for-windows-10/ -function pcgamer() { - // look into video carousels? - for (element of document.querySelectorAll("img.lazy-image-van")) { - let originalUrl = element.getAttribute("data-original-mos"); - if (originalUrl === null) { - continue; - } - element.src = originalUrl; +function isElementLazyloader(element) { + if (element.dataset.src) { + return true; } -} -// https://www.wired.com/ -// https://www.wired.com/story/researcher-fooled-a-google-ai-into-thinking-a-rifle-was-a-helicopter/ -function wired() { - let style = document.createElement("style"); - style.innerText = ".gbVKFf {opacity: 1}"; - document.head.appendChild(style); -} - -// https://www.theautopian.com/ -// https://www.theautopian.com/nobody-wants-touch-screen-glove-box-latches-and-it-needs-to-stop-now/ -function theautopian() { - for (element of document.querySelectorAll("img[data-jzl-lazy-src]")) { - let originalUrl = element.getAttribute("data-jzl-lazy-src"); - if (originalUrl === null) { - continue; - } - element.src = originalUrl; - } -} - -// https://www.bleepingcomputer.com/ -// https://www.bleepingcomputer.com/news/microsoft/windows-11-snipping-tool-privacy-bug-exposes-cropped-image-content/ -function bleepingcomputer() { - for (element of document.querySelectorAll(".b-lazy")) { - const addLink = !hasLinkParent(element); - const dataSrc = element.getAttribute("data-src"); - if (dataSrc === null) { - return; - } - - const url = new URL(dataSrc, location); - if (addLink) { - const newElement = element.cloneNode(); - newElement.src = url.href; - const wrapper = document.createElement("a"); - wrapper.href = url.href; - wrapper.appendChild(newElement); - element.replaceWith(wrapper); - } else { - element.src = url.href; - } - } -} - -// https://securelist.com/ -// https://securelist.com/cosmicstrand-uefi-firmware-rootkit/106973/ -function securelist() { - let style = document.createElement("style"); - style.innerText = "img {opacity: 1 !important;}"; - document.head.appendChild(style); -} - -// https://vulcan.io/blog/ -// https://vulcan.io/blog/ai-hallucinations-package-risk -function vulcan() { - for (let element of document.querySelectorAll("img[nitro-lazy-src]")) { - const addLink = !hasLinkParent(element); - const url = new URL(element.getAttribute("nitro-lazy-src"), location); - - if (addLink) { - const newElement = element.cloneNode(); - newElement.src = url.href; - const wrapper = document.createElement("a"); - wrapper.href = url.href; - wrapper.appendChild(newElement); - element.replaceWith(wrapper); - } else { - element.src = url.href; - } - } -} - -// https://blog.joshumax.me/general/2021/08/11/running-doom-on-captioncall.html -// https://legendsoflocalization.com/common-problems-when-translating-games-into-japanese/ -// https://knowyourmeme.com/ -// https://knowyourmeme.com/memes/saddam-husseins-hiding-place -function datasrc() { - for (let element of document.querySelectorAll("img[data-src]")) { - const addLink = !hasLinkParent(element); - const url = new URL(element.getAttribute("data-src"), location); - - if (addLink) { - const newElement = element.cloneNode(); - newElement.src = url.href; - const wrapper = document.createElement("a"); - wrapper.href = url.href; - wrapper.appendChild(newElement); - element.replaceWith(wrapper); - } else { - element.src = url.href; - } - } -} - -function hasLinkParent(element) { - while (element) { - if (element.localName === "a") { + for (let className of element.classList) { + // Examples of loading: + // - https://closeronline.co.uk + // - https://closeronline.co.uk/real-life/news/ever-used-excuses-documented-spreadsheet-man-used-expose-wife-s-lack-sex + // Examples of lazy: + // - https://www.vice.com/en/article/dy73n7/ehallpass-1000-thousand-schools-monitor-bathroom + // - https://www.pcgamer.com/ + // - https://www.pcgamer.com/windows-95-theme-for-windows-10/ + // - https://www.theautopian.com/ + // - https://www.theautopian.com/nobody-wants-touch-screen-glove-box-latches-and-it-needs-to-stop-now/ + // - https://vulcan.io/blog/ + // - https://vulcan.io/blog/ai-hallucinations-package-risk + // Examples of responsive: + // - https://www.vice.com/en/article/dy73n7/ehallpass-1000-thousand-schools-monitor-bathroom + // - https://www.wired.com (it's a parent of lazyloaded s) + // - https://www.wired.com/story/researcher-fooled-a-google-ai-into-thinking-a-rifle-was-a-helicopter/ (it's a parent of lazyloaded s) + if (className.includes("loading") || className.includes("lazy") || className.includes("responsive")) { return true; } - element = element.parentElement; } + return false; } -switch (location.host) { - case "closeronline.co.uk": closeronline(); break; - case "www.indiatoday.in": indiatoday(); break; - case "www.vice.com": vice(); break; - case "www.pcgamer.com": pcgamer(); break; - case "www.wired.com": wired(); break; - case "www.theautopian.com": theautopian(); break; - case "www.bleepingcomputer.com": bleepingcomputer(); break; - case "securelist.com": securelist(); break; - case "vulcan.io": vulcan(); break; - case "blog.joshumax.me": - case "knowyourmeme.com": - case "legendsoflocalization.com": - datasrc(); - break; - default: wordpress(); break; -}; \ No newline at end of file +function removePlaceholder(img) { + let hasLinkParent = false; + let parentElement = img.parentElement; + while (parentElement) { + hasLinkParent = hasLinkParent || parentElement.localName === "a"; + // Examples of hidden parents: + // - https://www.wired.com/ + // - https://www.wired.com/story/researcher-fooled-a-google-ai-into-thinking-a-rifle-was-a-helicopter/ + if (isElementLazyloader(parentElement)) { + unhideElement(parentElement); + } + + parentElement = parentElement.parentElement; + } + + let url = findUrl(img); + if (!url) { + return; + } + let originalUrl = url; + + + if (window.location.host === "www.vice.com") { + let picture = img.parentElement; + + img.style.filter = "none"; + picture.style.opacity = 1; + + let urlObject = new URL(url, window.location); + urlObject.search = ""; + originalUrl = urlObject.href; + urlObject.search = "?resize=1024:*"; + url = urlObject.href; + + for (let source of picture.querySelectorAll("source")) { + source.remove(); + } + } else if (window.location.host === "closeronline.co.uk") { + let urlObject = new URL(url, window.location); + urlObject.search = ""; + originalUrl = urlObject.href; + img.closest(".image-container").querySelector(".image-loading").remove(); + } + + img.src = url; + unhideElement(img); + + if (!hasLinkParent) { + let wrapper = document.createElement("a"); + img.replaceWith(wrapper); + wrapper.href = originalUrl; + wrapper.appendChild(img); + } +} + + + +for (let img of document.querySelectorAll("img")) { + removePlaceholder(img); +} +// the reason we check for mutations for 1s after the page loads is because of