NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Replace Image on Right Click // @namespace https://openuserjs.org/users/shaggyze/scripts // @updateURL https://openuserjs.org/meta/shaggyze/Replace_Image_on_Right_Click.meta.js // @downloadURL https://openuserjs.org/install/shaggyze/Replace_Image_on_Right_Click.user.js // @copyright 2025, shaggyze (https://openuserjs.org/users/shaggyze) // @version 3.0 // @description Replace Image on Right Click. // @author ShaggyZE // @include * // @icon https://shaggyze.website/movies/website.png // @run-at document-begin // @grant GM_getValue // @grant GM_setValue // @license MIT; https://opensource.org/licenses/MIT // ==/UserScript== (function() { 'use strict'; const storageKey = 'replacedImages'; const replacedImages = GM_getValue(storageKey, {}); function isPlaceholderImage(imgSrc) { return imgSrc.includes('spacer.gif') || imgSrc === ''; } function getOriginalSrc(img) { return img.dataset.originalSrc || (img.dataset.src && isPlaceholderImage(img.src)) ? img.dataset.src : img.src; } function setOriginalSrc(img) { if (!img.dataset.originalSrc) { img.dataset.originalSrc = getOriginalSrc(img); } } function applyStoredReplacements() { document.querySelectorAll('img').forEach(img => { setOriginalSrc(img); const originalSrc = getOriginalSrc(img); if (replacedImages[originalSrc]) { const replacementUrl = replacedImages[originalSrc]; if (img.hasAttribute('src')) { img.src = replacementUrl; } if (img.hasAttribute('srcset')) { img.srcset = replacementUrl; } if (img.dataset.hasOwnProperty('srcset')) { img.dataset.srcset = replacementUrl; } } }); } window.addEventListener('load', () => { setTimeout(applyStoredReplacements, 500); }); let isApplyingReplacements = false; window.addEventListener('scroll', () => { if (!isApplyingReplacements) { isApplyingReplacements = true; requestAnimationFrame(() => { applyStoredReplacements(); isApplyingReplacements = false; }); } }); let replaceButton = null; let rightClickPosition = null; document.addEventListener('mousedown', function(event) { if (event.button === 2 && event.target.tagName === 'IMG') { const targetImage = event.target; rightClickPosition = { x: event.clientX, y: event.clientY }; if (replaceButton && replaceButton.parentNode) { replaceButton.parentNode.removeChild(replaceButton); replaceButton = null; } setTimeout(function() { if (targetImage && rightClickPosition) { const x = rightClickPosition.x; const y = rightClickPosition.y; replaceButton = document.createElement('button'); replaceButton.textContent = 'Replace Image'; replaceButton.style.position = 'fixed'; replaceButton.style.left = `${x + 5}px`; replaceButton.style.top = `${y + 5}px`; replaceButton.style.backgroundColor = '#eee'; replaceButton.style.border = '1px solid #ccc'; replaceButton.style.padding = '8px 12px'; replaceButton.style.zIndex = '10001'; replaceButton.style.boxShadow = '1px 1px 3px rgba(0,0,0,0.1)'; replaceButton.style.cursor = 'pointer'; replaceButton.style.fontSize = '14px'; const handleReplaceClick = function() { const originalImageUrl = getOriginalSrc(targetImage); const newImageUrl = prompt('Enter the new image URL:'); if (newImageUrl) { targetImage.src = newImageUrl; replacedImages[originalImageUrl] = newImageUrl; GM_setValue(storageKey, replacedImages); } removeButton(); }; replaceButton.addEventListener('click', handleReplaceClick, { once: true }); document.body.appendChild(replaceButton); function removeButton() { if (replaceButton && replaceButton.parentNode) { replaceButton.parentNode.removeChild(replaceButton); replaceButton = null; rightClickPosition = null; document.removeEventListener('mousedown', handleOutsideClick); document.removeEventListener('mouseup', handleOutsideRightClick); document.removeEventListener('keydown', handleEscape); } } function handleOutsideClick(e) { if (replaceButton && !replaceButton.contains(e.target) && e.button === 0) { removeButton(); } } function handleOutsideRightClick(e) { if (replaceButton && e.button === 2 && e.target !== targetImage) { removeButton(); } } function handleEscape(e) { if (e.key === 'Escape') { removeButton(); } } setTimeout(() => { document.addEventListener('mousedown', handleOutsideClick); document.addEventListener('mouseup', handleOutsideRightClick); document.addEventListener('keydown', handleEscape); }, 50); } }, 300); } }, false); })();