Civitai Text Downloader Mod

Click the Download button to save the json file and images.

Versione datata 21/07/2024. Vedi la nuova versione l'ultima versione.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name            Civitai Text Downloader Mod
// @name:ja         Civitai Text Downloader Mod
// @namespace       http://tampermonkey.net/
// @version         5.2.2
// @description     Click the Download button to save the json file and images.
// @description:ja  Downloadボタンをクリックするとjsonファイルと画像が保存されます。
// @author          Takenoko3333
// @match           https://civitai.com/models/*
// @icon            https://civitai.com/favicon.ico
// @grant           none
// @license         BSD
// ==/UserScript==

(function() {
    'use strict';
    setInterval(function(){
        document.querySelectorAll('main a[type^="button"]:not([href])').forEach(button => {
            if(!button.classList.contains("ctd-done")){
                button.addEventListener("click", function(){
                    let _id = location.pathname.split("/")[2];

                    const codeElements = document.querySelectorAll('table code');
                    let file_id = null;
                    codeElements.forEach((element, index) => {
                        if (element.textContent === '@') {
                            if (codeElements[index + 1]) {
                                file_id = codeElements[index + 1].textContent;
                            }
                        }
                    });

                    const spanElements = document.querySelectorAll('table span');
                    let strength = null;
                    spanElements.forEach((element, index) => {
                        if (/^Strength:/.test(element.textContent)) {
                            strength = element.textContent.split(":")[1].trim();
                            console.log(strength)
                        }
                    });

                    fetch("https://civitai.com/api/v1/models/" + _id).then(x => x.json()).then(j => {
                        let file = j.modelVersions.find(x => x.id == file_id);
                        let link = document.createElement('a');
                        let text = {
                            "description": "",
                            "sd version": "Unknown",
                            "activation text": "",
                            "preferred weight": 0,
                            "notes": document.URL
                        };

                        if (/^SD 1/.test(file.baseModel)) {
                            text["sd version"] = "SD1";
                        } else if (/^SD 2/.test(file.baseModel)) {
                            text["sd version"] = "SD2";
                        } else if (/^SDXL/.test(file.baseModel) || /^Pony/.test(file.baseModel)) {
                            text["sd version"] = "SDXL";
                        } else if (/^SD 3/.test(file.baseModel)) {
                            text["sd version"] = "SD3";
                        }

                        if(j.description && j.description.textContent){
                            text.description = j.description.textContent;
                        }
                        if(file.trainedWords){
                            text["activation text"] = file.trainedWords.join(" ");
                        }
                        if(strength){
                            text["preferred weight"] = strength;
                        }
                        text = [JSON.stringify(text)];
                        link.href = window.URL.createObjectURL(new Blob(text));
                        let filename = file.files.find(x => x).name || file_id + ".json";
                        filename = filename.replace(/\.[a-z]*$/, ".json")
                        link.download = filename;
                        link.click();

                        let image = file.images.find(x => x);
                        if(image){
                            let xhr = new XMLHttpRequest();
                            let src = image.url;
                            let suffix = "." + src.slice(src.lastIndexOf('.') + 1);
                            suffix = ".png"; // URLの拡張子がjpegになってても実際にimage.civitai.comが返す画像はpngっぽいのでハードコーディングで決め打ち
                            xhr.open('GET', src, true);
                            xhr.responseType = "blob";
                            xhr.onload = function () {
                                let dlLink = document.createElement("a");
                                const dataUrl = URL.createObjectURL(this.response);
                                dlLink.href = dataUrl;
                                filename = filename.replace(".json", suffix)
                                dlLink.download = filename;
                                document.body.insertAdjacentElement("beforeEnd", dlLink);
                                dlLink.click();
                                dlLink.remove();
                                setTimeout(function () {
                                    window.URL.revokeObjectURL(dataUrl);
                                }, 1000);
                            };
                            xhr.send();
                        }
                    });
                });
                button.style.color = "#ffff00";
                button.classList.add("ctd-done");
            }
        });
    }, 500);
})();