Dieses Skript fügt einen auf Giphy einen Download-Button hinzu. Für die Installation wird das Browser-Plugin Tampermonkey benötigt.



// ==UserScript==
// @name            Download Gif Button for GIPHY (working in 2025)
// @namespace       com.giphy
// @version         1.0.2
// @description     Adds a download button for gif download
// @author          Thomas R.
// @license          MIT
// @match           http*://giphy.com/*
// @icon            https://www.google.com/s2/favicons?sz=64&domain=giphy.com
// @require         https://greasyfork.org/scripts/374849-library-onelementready-es6/code/Library%20%7C%20onElementReady%20ES6.js
// @grant           GM.addStyle
// @grant           GM.download
// @run-at          document-end
// ==/UserScript==
 
const slugify = (string) => {
    return string
        .toString()
        .toLowerCase()
        .normalize('NFD')
        .replace(/[\u0300-\u036f]/g, '')
        .replace(/[^a-z0-9\s-]/g, '')
        .replace(/\s+/g, '-')
        .replace(/-+/g, '-')
        .replace(/^-+|-+$/g, '');
}
 
const downloadFile = (url, filename) => {
    GM.download({
        url: url,
        name: filename,
        saveAs: true
    });
}
 
const handleDownload = () => {
    // not present on client side navigation
    // const imageData = JSON.parse(document.querySelectorAll('script[type="application/ld+json"]')[1].text);
    // const urlArray = imageData.image.url.split('/');
    // const gifId = urlArray[urlArray.length - 2];
 
    const pageUrlArray = window.location.pathname.split('/');
    const gifNameArray = pageUrlArray[pageUrlArray.length - 1].split('-');;
    const gifId = gifNameArray[gifNameArray.length - 1];
 
    const gifURL = `https://i.giphy.com/${gifId}.gif`;
 
    downloadFile(gifURL, `${slugify(document.title.split('-')[0])}.gif`);
}
 
 
const addMenuItem = (menu) => {
    const lastMenuItem = menu.querySelector(':first-child');
    const newMenuItem = lastMenuItem.cloneNode(true);
 
    const svg = newMenuItem.querySelector('svg');
    svg.innerHTML = '';
    svg.setAttribute("style","margin-top: -6px;margin-right: 6px;");
    svg.setAttribute('width', '33.3');
    svg.setAttribute('height', '33.3');
 
    const textElement = newMenuItem.querySelector('label');
    textElement.textContent = 'Download';
 
    newMenuItem.addEventListener("click",handleDownload);
 
    menu.appendChild(newMenuItem);
}
 
const init = () => {
    onElementReady('figure > div:nth-child(2) > div:nth-child(2) >div:nth-child(1)', false, (element) => {
        addMenuItem(element);
    });
}
 
init();