NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Google Image Search Direct Download Mobile // @version 1 // @grant none // @match *://*.google.com/search* // @require https://code.jquery.com/jquery-3.4.1.min.js // @description Google doesn't want to let you download images directly. But you can just take a screenshot, so... why not just maintain the image quality? // @namespace adamrgrey.com // @license MIT // ==/UserScript== let contextLinkSelector = "a.isv-d.isv-rl[ping]"; function foundAContextLink(contextLink){ let wantedImage = $("img.isv-i[src]"); let contextLinkTextNode = $(contextLink).find(":not(iframe)").filter(function () { return $(this).html() === $(this).text() && $(this).text().length > 0; }); contextLinkTextNode.text("direct"); let linkNode = $(contextLinkTextNode); while(true){ if(linkNode[0].tagName.toLowerCase() === "a"){ break; } linkNode = linkNode.parent(); if(linkNode.length === 0){ console.error("couldn't find an anchor as a parent?"); return; } } if(linkNode[0].tagName.toLowerCase() !== "a"){ console.error("somehow didn't find an anchor as a parent?"); return; } linkNode.prop("href", wantedImage.prop("src")); linkNode.prop("download", true); } function checkAndMessWith(node){ if($(contextLinkSelector).is(node)){ foundAContextLink(node); } $(node).find("*").toArray().forEach(function(subNode){ if($(contextLinkSelector).is(subNode)){ foundAContextLink(subNode); } }); } function observeMutations(mutations){ mutations.forEach(function(mutation){ if(mutation.addedNodes.length > 0){ mutation.addedNodes.forEach(function(addedNode){ checkAndMessWith(addedNode); }); } let contextLinkFound = $(contextLinkSelector)[0]; if(mutation.target !== null && $.contains(mutation.target, contextLinkFound)){ checkAndMessWith(contextLinkFound); } }); } const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; const overallObserver = new MutationObserver(observeMutations); overallObserver.observe(document, { childList: true, subtree: true, attributes: true });