MidJourney Image Downloader

Добавить кнопки для скачивания изображений на сайте MidJourney

// ==UserScript==
// @name         MidJourney Image Downloader
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  Добавить кнопки для скачивания изображений на сайте MidJourney
// @author       You
// @match        https://www.midjourney.com/*
// @grant        GM_download
// @grant        GM_addStyle
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Добавление стилей для значков скачивания
    const style = `
    .download-badge {
        position: absolute;
        top: 8px;
        right: 8px;
        background-color: rgba(0, 0, 0, 0.7);
        color: white;
        padding: 5px 10px;
        border-radius: 5px;
        cursor: pointer;
        z-index: 9999;
    }
    .download-badge:hover {
        background-color: rgba(0, 0, 0, 0.9);
    }
    `;
    GM_addStyle(style);

    // Функция для генерации ссылки на оригинальное изображение
    const getImageUrl = (src) => {
        let baseUrl = src.split("?")[0]; // Убираем параметры запроса
        baseUrl = baseUrl.replace("_640_N", ""); // Убираем _640_N
        return baseUrl.replace(".webp", ".png"); // Заменяем .webp на .png
    };

    // Функция для создания значка скачивания
    const addDownloadBadge = (imgElement) => {
        if (imgElement.dataset.downloadBadge) return; // Проверка, чтобы не добавлять несколько раз

        const badge = document.createElement("div");
        badge.className = "download-badge";
        badge.innerText = "↓ Скачайте";

        // Генерируем ссылку для скачивания
        const imgUrl = getImageUrl(imgElement.src);

        badge.addEventListener("click", (e) => {
            e.preventDefault();
            e.stopPropagation();

            // Используем GM_download для скачивания изображения
            GM_download({
                url: imgUrl, // URL изображения
                name: imgUrl.split("/").pop(), // Название файла будет последней частью URL
                saveAs: true // Открывает диалоговое окно для выбора места сохранения
            });
        });

        imgElement.parentElement.style.position = 'relative'; // Чтобы значок был внутри контейнера
        imgElement.parentElement.appendChild(badge); // Добавляем значок на картинку
        imgElement.dataset.downloadBadge = true; // Помечаем изображение как с кнопкой скачивания
    };

    // Функция для добавления значков на все изображения на странице
    const scanImages = () => {
        const images = document.querySelectorAll('img');
        images.forEach(img => {
            if (img.src.includes("cdn.midjourney.com")) {
                addDownloadBadge(img);
            }
        });
    };

    // Инициализация сканирования изображений при загрузке страницы
    window.addEventListener('load', () => {
        scanImages();
    });

    // Наблюдатель для динамической загрузки изображений
    const observer = new MutationObserver(scanImages);
    observer.observe(document.body, { childList: true, subtree: true });
})();