// ==UserScript== // @name TMDB load unloadable images // @namespace https://github.com/Tetrax-10 // @description Force TMDB to load unloaded images // @icon https://www.google.com/s2/favicons?sz=64&domain=themoviedb.org // @license MIT // @version 1.1 // @match *://*.themoviedb.org/* // @run-at document-idle // @downloadURL none // ==/UserScript== ;(() => { function changeSrc(img) { if ( img.src.includes("media.themoviedb.org") && [".jpg", ".png"].some((e) => img.src.endsWith(e)) && !img.naturalHeight && img.hasAttribute("srcset") ) { // Get the resolution and id of the image const resolution = img.src.match(/\/t\/p\/([^\/]+)\/[^\/]+$/)?.[1] ?? "" const id = img.src.split("/").pop() img.src = `https://image.tmdb.org/t/p/${resolution}/${id}` img.removeAttribute("srcset") } } // Function to handle intersection events function handleIntersection(entries, observer) { entries.forEach((entry) => { if (entry.isIntersecting) { // Check if the element is visible in the viewport const imgElement = entry.target changeSrc(imgElement) // Change the image source if it's unloaded observer.unobserve(imgElement) // Stop observing the current image after it's logged } }) } // Create a new IntersectionObserver instance const observer = new IntersectionObserver(handleIntersection, { root: null, // Observe the viewport rootMargin: "0px", // No margin around the viewport threshold: 0.1, // Trigger when at least 10% of the image is visible }) // Select all img elements and observe them document.querySelectorAll("img").forEach((img) => { observer.observe(img) }) })()