Civitai网站辅助

Civitai模型信息辅助获取

// ==UserScript==
// @name         Civitai网站辅助
// @namespace    http://tampermonkey.net/
// @version      2.7.4
// @description  Civitai模型信息辅助获取
// @author       Faded_lov
// @license      GPL
// @match        *://civitai.com/images/*
// @match        *://civitai.com/models/*
// @icon         data:image/png;base64,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
// @grant        none
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.3/jquery.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/jszip/3.10.1/jszip.min.js

// ==/UserScript==
// 当页面准备好
$(function () {
    setTimeout(() => { // 定时一秒后执行
        check_localStorage();
        main(); // 执行主函数
    }, 1000);
});

var gallery_data_arr = new Array();  // 用于下载评论区图库中图片
var zip = new JSZip();  // 创建zip实例用于下载zip文件

/**
 * @brief 检查localStorage
 */
function check_localStorage() {
    let localStorage_list = ["settings", "png_format", "md_flag", "zip_images"];
    localStorage_list.forEach(function (item, index) {
        if (localStorage.getItem(item) == null) {
            console.log("添加存储信息:" + item);
            localStorage.setItem(item, "");
        }
    });
}

/**
 * @brief 主要运行函数
 */
function main() {
    // ^ 8. 保存https://civitai.com/images/*中的图片和信息
    // * 8.1 控件添加
    let $pic_down_btn = $(`
            <button class="mantine-UnstyledButton-root mantine-Button-root mantine-b0t5u6 down_pic" type="button" data-button="true" id="">
                <div class="mantine-3xbgk5 mantine-Button-inner">
                    <span>Download !</span>
                </div>
            </button>
            `);
    let timely = setInterval(function () {
        if ($('.down_pic').length == 0) { // 控件还没加上
            if (location.href.match(/images/g) != null) // 页面仍在正确页面(没回到模型页面)
            {
                console.log('add control...' + $('.mantine-UnstyledButton-root.mantine-Button-root.mantine-b0t5u6').length);
                // $('.mantine-ButtonGroup-root.mantine-n93y9k').append($btn);
                $('.mantine-UnstyledButton-root.mantine-Button-root.mantine-b0t5u6').after($pic_down_btn);
            }
        }
    }, 1000);

    // * 8.2 控件事件绑定
    // 以委派方式实现新增元素的事件绑定
    $(document).on('mousedown', '.down_pic', function () {
        let picture_name = location.href.match(/\d+/g)[0]; // 获取文件名
        $('.mantine-UnstyledButton-root.mantine-Button-root.mantine-b0t5u6').click(); // 点击复制按钮到剪切板
        readClipText(picture_name); // 读取剪切板并保存到本地
        $('.down_pic span').text('Downloading...');
        let picture_url = $(this).parents('.mantine-Paper-root.mantine-eljy0r').find('.mantine-8od8ev img').attr('src'); // 获取链接
        console.log(picture_url);
        downloadImg(picture_url, picture_name)
            .then(function () {
                // 这里可以执行下载完成后需要执行的代码
                $('.down_pic span').text('Download !');
            })
            .catch(function (error) {
                console.error(error);
                alert('图片下载出现错误,请检查控制台中相关信息\n' + error.message);
                // 这里可以执行下载失败后需要执行的代码
                $('.down_pic span').text('Error !!');
            });; // 下载图片
    });


    // ^ 0. 预处理程序
    // * 0.1 当前主题读取:light or dark
    let theme = document.cookie.match(/(?<=mantine-color-scheme=)\w(?=[^;]+)/);  // l 或 d

    // * 0.2 LocalStorage数据读取
    let md_flag = false;
    if (localStorage.getItem("md_flag") == "1") {
        md_flag = true;
    }

    // * 0.3 设计交互按钮区域的底框
    $Interaction_region = $(`<div id="interaction-region"></div>`);
    $Interaction_region_style = $(`
    <style>
    #interaction-region {
        height: auto;
        width: auto;
        background-color: #f8f9fa;
        border: 1px solid #dee2e6;
        padding: 5px;
        border-radius: 5px;
    }
    </style>
    `);
    if (theme == 'd') {
        $('.mantine-agabl4:contains("Details")').parent().before($Interaction_region);
        $('#interaction-region').css({
            'background-color': '#25262b',
            'border': '1px solid #373a40'
        });
    } else {
        $('.mantine-9dt51j:contains("Details")').parent().before($Interaction_region);
    }
    $('head').append($Interaction_region_style);

    // * 0.4 创建一个公用的类(主要是对背景色等的处理)
    $public_css = $(`
    <style>
        .public-downloading {
            color: white !important;
            background-color: #FFA500 !important;
        }

        .public-error {
            color: white !important;
            background-color: red !important;
        }
    </style>
    `);
    $('head').append($public_css);

    // ^ 1. 文件格式切换处理
    // * 1.1 样式、控件添加
    $file_format = $(`
    <label class="switch" title="txt格式">
        <input type="checkbox" id="switch-checkbox"/>
        <span class="slider round"></span>
    </label>
    `);
    $file_format_style = $(`
    <style>
    /* 样式化复选框 */
    .switch {
        position: relative;
        display: inline-block;
        width: 60px;
        height: 34px;
    }

    .switch input {
        opacity: 0;
        width: 0;
        height: 0;
    }

    .slider {
        position: absolute;
        cursor: pointer;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background-color: #ccc;
        transition: .2s;
    }

    .slider:before {
        position: absolute;
        content: "";
        height: 26px;
        width: 26px;
        left: 4px;
        bottom: 4px;
        background-color: white;
        transition: .3s;
    }

    input:checked+.slider {
        background-color: #2196F3;
    }

    input:checked+.slider:before {
        transform: translateX(26px);
    }

    .slider.round {
        border-radius: 34px;
    }

    .slider.round:before {
        border-radius: 50%;
    }

    /* 隐藏复选框 */
    .switch input {
        display: none;
    }
</style>

    `);
    $('.mantine-Group-root.mantine-1eod8xg').before($file_format);
    $('head').append($file_format_style);

    // * 1.2 文件格式切换事件监听、处理
    // 1.2.1 检查localStorage状态,初始化页面控件显示
    if (md_flag) {
        $("#switch-checkbox").prop("checked", true).parent().prop("title", "markdown格式");
    }
    // 1.2.2 监听复选框状态变化,状态变化时更新localStorage,并刷新页面
    $("#switch-checkbox").on("change", () => {
        if ($("#switch-checkbox").prop("checked")) {
            localStorage.setItem("md_flag", "1");
        } else {
            localStorage.removeItem("md_flag");
        }
        location.reload();
    });

    // ^ 2. 模型信息API数据处理:文件名显示、.info下载、文档下载、所有图片下载
    // * 2.1 添加控件、样式(文本信息下载按钮、图片下载按钮、备注框、文件名显示等)
    $filename = $(`
    <tr class="mantine-1avyp1d">
        <td class="mantine-vp2u6p">
            <div class="mantine-Text-root mantine-152y8ed">File Name</div>
        </td>
        <td class="mantine-1avyp1d">
            <div class="mantine-Group-root mantine-1u5ck20 filename">loading...</div>
        </td>
    </tr>
    <tr class="mantine-1avyp1d">
        <td class="mantine-vp2u6p">
            <div class="mantine-Text-root mantine-152y8ed">File Size</div>
        </td>
        <td class="mantine-1avyp1d">
            <div class="mantine-Group-root mantine-1u5ck20 filesize">loading...</div>
        </td>
    </tr>
    `);
    $filename_dark = $(`
    <tr class="mantine-1avyp1d">
        <td class="mantine-1lnluqq">
            <div class="mantine-Text-root mantine-1363hig">File Name</div>
        </td>
        <td class="mantine-1avyp1d">
            <div class="mantine-Text-root mantine-ljqvxq filename">loading...</div>
        </td>
    </tr>
    <tr class="mantine-1avyp1d">
        <td class="mantine-1lnluqq">
            <div class="mantine-Text-root mantine-1363hig">File Size</div>
        </td>
        <td class="mantine-1avyp1d">
            <div class="mantine-Text-root mantine-ljqvxq filesize">loading...</div>
        </td>
    </tr>
    `);
    $down_msg_div = $(`
    <div class="container">
        <div class="btn-down" id="downInfo" style="margin-right:3px;" title="下载.info文件">Loading...</div>
        <div class="btn-down" id="downMsg" style="margin-left:3px;" title="下载说明文档">Loading...</div>
    </div>
    <div class="container">
        <div class="png-set-btn" onclick="png_set()" title="图片格式设置"><span>图片格式</span></div>
        <div class="png-set-menu">
            <div id="png-set">
                <form>
                    <div><input type="checkbox" name="preview" id="png-set-1"><label for="png-set-1" title="文件后缀">.preview.png</label>
                    </div>
                    <div><input type="checkbox" name="info_tips" id="png-set-2"><label for="png-set-2" title="判断图片是否含有参数">_noInfo</label>
                    </div>
                </form>
            </div>
        </div>
        <script>
            function png_set() {
                if (!$(".png-set-menu").width()) {
                    // 打开动画
                    $('.png-set-btn').addClass('open-png-menu');
                    $('.png-set-menu').width(402);
                    // 加载设置
                    let settings = localStorage.getItem('png_format');
                    if (!settings) settings = '';
                    $('#png-set input').each(function (i, ele) {
                        if (settings.includes($(ele).prop('name'))) {
                            $(ele).prop('checked', true);
                        } else {
                            $(ele).prop('checked', false);
                        }
                    });
                } else {
                    // 关闭动画
                    $('.png-set-btn').removeClass('open-png-menu');
                    $('.png-set-menu').width(0);
                    // 保存设置
                    let settings = '';
                    $('#png-set input:checked').each(function (i, ele) {
                        settings += $(ele).prop('name') + ',';
                    });
                    localStorage.setItem('png_format', settings);
                }
            }
        </script>
        <div class="btn-down" id="downPic" title="下载左侧所有预览图">Loading...</div>
    </div>
    `);
    $textarea = $(`
    <textarea id="tips" rows=15 placeholder='备注...' ></textarea>
    `);
    $style = $(`
    <style>
        .filename,.filesize {
            font-weight: 600;
            color: #d400ff;
        }

        .container {
            display: flex;
            position: relative;
            padding: 0;
        }

        .btn-down {
            flex-grow: 1;
            width: auto;
            height: 35px;
            margin: 3px auto;
            text-align: center;
            line-height: 35px;
            font-size: 15px;
            font-weight: 500;
            color: #fff;
            background-color: #40c057;
            border-radius: 5px;
            cursor: pointer;
            user-select: none;
            transition: 0.3s;
        }

        .btn-down:hover {
            background-color: #37b24d;
        }

        .png-set-btn {
            z-index: 2;
            width: 80px;
            height: 35px;
            margin: 3px 5px 0 0;
            line-height: 35px;
            text-align: center;
            background-color: #40c057;
            color: white;
            border-radius: 5px;
            user-select: none;
            cursor: pointer;
            transition: all 0.5s;
        }

        .png-set-btn:hover {
            background-color: #37b24d;
        }

        .open-png-menu {
            height: 25px;
            line-height: 25px;
            margin-top: 8px;
            margin-left: 3px;
            font-size: 14px;
        }

        .png-set-menu {
            position: absolute;
            z-index: 1;
            width: 0px;
            height: 35px;
            margin-top: 3px;
            background-color: #f8f9fa;
            overflow: hidden;
            border-radius: 5px;
            transition: all 0.5s;
        }

        #png-set form div {
            float: right;
        }

        #png-set input {
            display: none;
        }

        #png-set label {
            display: inline-block;
            width: 150px;
            height: 25px;
            margin: 5px 5px 5px 0;
            background-color: #868e96;
            color: white;
            text-align: center;
            line-height: 25px;
            border-radius: 5px;
            transition: all .3s;
            user-select: none;
            cursor: pointer;
        }

        #png-set input:checked+label {
            background-color: #40c057;
        }

        #tips {
            width: auto;
            font-size: 15px;
            background-color: #f8f9fa;
            border: 2px solid #999;
            border-radius: 5px;
            resize: none;
        }
    </style>
    `);
    if (theme == 'd') { // 深色模式
        $('#interaction-region~.mantine-1avyp1d tbody').append($filename_dark);
    } else {  // 浅色模式
        $('#interaction-region~.mantine-1avyp1d tbody').append($filename);
    }
    // 加载交互区域控件
    $('#interaction-region').append($down_msg_div);
    // markdown格式不加载备注栏,txt格式加载
    if (!md_flag) {
        $('.mantine-1h0gy36:last').after($textarea);
    }
    if (theme == 'd') { // 深色模式
        $('.png-set-menu').css('background-color', '#25262b');
        $('#tips').css('backgroundColor', '#25262b');
    }
    // 样式加载
    $('head').append($style);

    // * 2.2 图片下载格式切换事件处理
    if (localStorage.getItem('png_format') == 'preview') {
        $('.png-format-checkbox input').prop('checked', true);
    }
    $('.png-format-checkbox input').on('click', function () {
        if ($('.png-format-checkbox input').prop('checked')) {
            localStorage.setItem('png_format', 'preview');
        } else {
            localStorage.removeItem('png_format');
        }
    });

    // * 2.3 通过api配合模型id获取模型信息数据
    let requestUrl = 'https://civitai.com/api/v1/models/' + location.href.match(/\d+/);
    console.log('请求链接: ' + requestUrl);
    fetch(requestUrl)
        .catch(error => {
            alert('API数据不正常,请检查或重试\n' + error.message);
        })
        .then(response => {
            console.log(response);
            if (!response.ok) {
                throw new Error('Network response was not ok');
            }
            return response.json();
        })
        .then(data => {
            console.log(data);

            // * 2.4 显示当前选择的模型的版本和文件名
            let model_version = 0;
            let filename;
            let version_class = theme == 'd' ? 'mantine-z8ikjj' : 'mantine-14vhbbe';
            console.log('当前版本: ' + $(`.mantine-lw13s0 .mantine-lw13s0 button[class*="${version_class}"]`).text());
            // 判断是否存在相同版本名
            let versions_name = new Array();
            for (let i = 0; i < data.modelVersions.length; i++) {
                let name = data.modelVersions[i].name;
                if (versions_name.includes(name)) {  // 存在相同版本名
                    alert('当前模型存在相同版本名,请自行确认下载的信息正确性');
                    let flag = false;
                    // 不确定直接通过API索引号判断版本是否正确
                    $(`.mantine-lw13s0 .mantine-lw13s0 button`).each(function (index, ele) {
                        if ($(ele).hasClass(version_class)) {
                            model_version = index;
                            flag = true;
                            return false;
                        }
                    });
                    if (flag) {
                        break;
                    }
                } else {
                    versions_name.push(name);
                    if (name == $(`.mantine-lw13s0 .mantine-lw13s0 button[class*="${version_class}"]`).text()) {
                        model_version = i;
                    }
                }
            }
            console.log('模型版本序号(从0开始): ' + model_version);
            filename = getFilename(data, model_version);

            // 模型切换时更新文件名显示
            $('.mantine-lw13s0 .mantine-lw13s0 button').on('click', function () {
                let btn_text = $(this).text();
                setTimeout(function () {
                    console.log('当前版本: ' + btn_text);
                    // 判断是否存在相同版本名
                    let versions_name = new Array();
                    for (let i = 0; i < data.modelVersions.length; i++) {
                        let name = data.modelVersions[i].name;
                        if (versions_name.includes(name)) {  // 存在相同版本名
                            // alert('当前模型存在相同版本名,请自行确认下载的信息正确性');
                            let flag = false;
                            // 不确定直接通过API索引号判断版本是否正确
                            $(`.mantine-lw13s0 .mantine-lw13s0 button`).each(function (index, ele) {
                                if ($(ele).hasClass(version_class)) {
                                    model_version = index;
                                    flag = true;
                                    return false;
                                }
                            });
                            if (flag) {
                                break;
                            }
                        } else {
                            versions_name.push(name);
                            if (name == btn_text) {
                                model_version = i;
                            }
                        }
                    }
                    console.log('模型版本序号: ' + model_version);
                    filename = getFilename(data, model_version);
                }, 500);
            });
            // // 手动触发模型切换函数以代替模型版本初次获取
            // $('.mantine-lw13s0 .mantine-lw13s0 button:eq(0)').click();

            // * 2.5 下载.info文件的按钮事件处理
            $('#downInfo').text('下载.info文件(C站助手)')
                .click(function () {
                    $(this).text('Downloading......').addClass('public-downloading');
                    downInfo(data.modelVersions[model_version].id, filename);
                });

            // * 2.6 下载说明文档的按钮的事件处理
            $('#downMsg').text(`下载说明文档 (${md_flag ? "markdown" : "txt"}格式)`)
                .click(function () {
                    downloadDoc(data, model_version, md_flag); // 下载文件
                    // 点击like
                    if (theme == 'd') { // 深色模式
                        $('.mantine-1tkveyv .mantine-3xbgk5:eq(1)').click();
                    } else { // 浅色模式
                        $('.mantine-1ayq7x2 .mantine-3xbgk5:eq(1)').click();
                    }
                });

            // * 2.7 批量下载图片的按钮事件处理
            // 2.7.1 获取当前模型版本预览图数量
            let pictures_count = $('.mantine-ContainerGrid-col:eq(1) .mantine-7aj0so').length;
            $('#downPic').text(`下载所有预览图(${pictures_count})`);
            if (!pictures_count) {
                // alert('绑定图片下载失败,请手动点击切换版本(当前版本就行)以重新绑定');
                $('#downPic').text('信息加载失败,请点击当前版本按钮重新绑定')
                    .prop('title', '下载左侧所有预览图\n版本按钮即图片区域左上角按钮');
            }
            // 切换版本时更新当前版本预览图提示
            $('.mantine-lw13s0 .mantine-lw13s0 button').on('click', function () {
                $('#downPic').text(`Loading...`);
                let update_status = setInterval(function () {
                    if ($('.picbtn').length != 0) {  // 页面加载完成
                        pictures_count = $('.mantine-ContainerGrid-col:eq(1) .mantine-7aj0so').length
                        $('#downPic').text(`下载所有预览图(${pictures_count})`);
                        clearInterval(update_status);
                    }
                }, 500);
            });

            // 2.7.2 下载所有预览图
            $('#downPic').on({
                click: () => {
                    console.log('=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=');
                    $('#downPic').text('Downloading...').addClass('public-downloading');
                    let images_arr = new Array();
                    $('.mantine-ContainerGrid-col:eq(1) .mantine-7aj0so').each(function (index, domEle) {
                        images_arr.push($(domEle).prop('src'));
                    });

                    // 下载图片
                    console.log(images_arr);
                    if (localStorage.getItem('zip_images') == '1') { // 以zip格式下载图片
                        downloadZip(data, model_version, images_arr, filename, 0);
                    } else { // 直接下载图片
                        downloadImages(data, model_version, images_arr, filename, 0);
                    }
                }
            });

            // ^ 3. 图片下载(左侧单张下载)
            // * 3.1 相关控件、样式添加
            $btn = $('<button type="button" style="position:absolute;bottom:37px;left:6px" class="picbtn" title="下载当前图片">Download</button>');
            $btn_style = $(`
            <style>
                .picbtn {
                    z-index: 2;
                    width: auto;
                    height: 30px;
                    align: center;
                    text-align: center;
                    border: 0;
                    background: #d5d5d3;
                    color: gray;
                    border-radius: 5px;
                    transition: all 0.5s;
                }

                .picbtn:hover {
                    background: #40c057;
                    color: white;
                }
            </style>
            `);
            $('head').append($btn_style);
            $("a[href^='/images/']").after($btn);
            // 切换版本时重新绑定按钮
            $('.mantine-lw13s0 .mantine-lw13s0 button').on('click', function () {
                $('.picbtn').remove();
                let add_btn = setInterval(function () {
                    if ($('.picbtn').length == 0) {
                        $("a[href^='/images/']").after($btn);
                        console.log('绑定图片下载按钮ing...');
                    } else {
                        console.log('绑定图片下载按钮成功');
                        clearInterval(add_btn);
                    }
                }, 500);
            });
            // 过滤按钮切换时重新绑定按钮
            $('.mantine-xickm0').on('mouseout', function () {
                $('.picbtn').remove();
                $("a[href^='/images/']").after($btn);
            });
            // 右上角切换按钮
            $('.mantine-6v7rx2 .mantine-1g4q40w button:eq(0)').on('mouseout', function () {
                setTimeout(function () {
                    $('.picbtn').remove();
                    $("a[href^='/images/']").after($btn);
                }, 2000);
            });

            // * 3.2 单张图片下载按钮事件处理
            // 以委派方式实现新增元素的事件绑定
            $(document).on('mousedown', '.picbtn', function () {
                $(this).text('Downloading...').addClass('public-downloading');

                // 3.2.1 获取下载的图片文件名
                let pic_name = filename;  // 当前选择的模型版本文件名
                console.log('=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=');
                console.log('picture name        : ' + pic_name);

                let pic_url = $(this).parent().find('img,video').prop('src'); // 图片链接(或者动图)

                // 判断API中是否有图片(理论上没有图片不会有按钮能点击,为了保险增加该检测)
                if (!data.modelVersions[model_version].images.length) {
                    alert('未查找到该模型版本图片的信息,请自行检查错误');
                    return;
                }

                // 3.2.2 通过遍历请求的数据中图片链接获取宽度信息
                let pic_width = 0;
                // (1). 在模型API中查询
                for (let index = 0; index < data.modelVersions[model_version].images.length; index++) {  // 当前模型版本内所有图片遍历
                    if (data.modelVersions[model_version].images[index].url.includes(pic_url.split('/')[4].replace(/\s+/g, ""))) {
                        pic_width = data.modelVersions[model_version].images[index].width;
                        console.log('picture width       : ' + pic_width);
                        break;
                    }
                }
                // (2). 在图库API中查询
                if (pic_width == 0) {
                    for (let index = 0; index < gallery_data_arr.length; index++) { // 数组遍历
                        for (let img_index = 0; img_index < gallery_data_arr[index].images.length; img_index++) { // 数据元素内部数据遍历
                            if (gallery_data_arr[index].images[img_index].url.includes(pic_url.split('/')[4].replace(/\s+/g, ""))) {
                                pic_width = gallery_data_arr[index].images[img_index].width;
                                console.log('picture width(gal..): ' + pic_width);
                                break;
                            }
                        }
                        if (pic_width) {  // 查询到宽度
                            break;
                        }
                    }
                }
                // (3). 获取模型API中最大宽度
                if (pic_width == 0) {// 图片不在api返回数据内(api只返回10张图片)
                    alert('未查询到该图片宽度,以模型预览图中最大宽度为准\r\n获取到的极大可能不是原图');
                    pic_width = getMaxWidth(data.modelVersions[model_version].images);
                    console.log('picture width (max) : ' + pic_width);
                }

                // 3.2.3 图片下载
                console.log('original picture url: ' + pic_url);
                pic_url = pic_url.replace(/width=\d+/, 'width=' + pic_width);
                console.log('new picture url     : ' + pic_url);

                let clicked_btn = $(this);  // 存储被点击的按钮的索引,方便在图片下载完成时进行操作
                downloadImg(pic_url, pic_name)
                    .then(function () {
                        // 图片下载完成
                        clicked_btn.text('Download').removeClass('public-downloading');
                    })
                    .catch(function (error) {
                        alert('图片下载出现错误,请检查控制台中相关信息\n' + error.message);
                        clicked_btn.text('Download').addClass('public-error');
                    });
                console.log('=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=');
            });

            // ^ 4. 懒人一键下载
            // * 4.1 相关控件、样式添加
            $easy_download = $(`
            <div class="auto_download">
                <div class="setting-btn" onclick="open_menu()" title="设置一键下载内容"><span>配置</span></div>
                <div class="setting-menu">
                    <div id="setting" style="display: none;">
                        <div class="close-btn" onclick="close_menu()" title="save">save</div>
                        <form>
                            <div><input type="checkbox" name="model_down" id="setting_1"><label for="setting_1">下载模型</label></div>
                            <div><input type="checkbox" name="picture_down" id="setting_2"><label for="setting_2">下载第一张预览图</label></div>
                            <div><input type="checkbox" name="text_down" id="setting_3"><label for="setting_3">下载说明文件</label></div>
                            <div><input type="checkbox" name="info_down" id="setting_4"><label for="setting_4">下载.info文件</label></div>
                        </form>
                    </div>
                </div>
                <script>
                    function open_menu() {
                        // 加载设置
                        let settings = localStorage.getItem('settings');
                        if (!settings) settings = '';
                        $('#setting input').each(function (i, ele) {
                            if (settings.includes($(ele).prop('name'))) {
                                $(ele).prop('checked', true);
                            }
                        });

                        // 展开动画
                        $('.setting-btn span').fadeOut(10);
                        $('.setting-menu').animate({
                            width: '402',
                            height: '125'
                        }, 500);
                        $('#setting').delay(500).fadeIn(500);
                    }

                    function close_menu() {
                        // 保存设置
                        let settings = '';
                        $('#setting input:checked').each(function (i, ele) {
                            settings += $(ele).prop('name') + ',';
                        });
                        localStorage.setItem('settings', settings);

                        // 关闭动画
                        $('#setting').fadeOut(500);
                        $('.setting-menu').delay(300).animate({
                            width: '0',
                            height: '0'
                        }, 500);
                        $('.setting-btn span').delay(850).fadeIn(50);
                    }
                </script>
                <div class="easy_download" title="一键下载选定的文件"> 一键下载 !</div>
            </div>
            `);
            $easy_download_style = $(`
            <style>
            .auto_download {
                position: relative;
                display: flex;
                align-items: center;
                justify-content: center;
            }

            .setting-btn {
                width: 60px;
                height: 36px;
                font-size: 15px;
                line-height: 36px;
                text-align: center;
                color: white;
                background-color: #228be6;
                border-radius: 5px;
                user-select: none;
                cursor: pointer;
                transition: all .2s;
            }

            .setting-btn:hover {
                background-color: #1c7ed6;
            }

            .setting-menu {
                position: absolute;
                top: 0;
                left: 0;
                z-index: 9;
                width: 0;
                height: 0;
                background-color: #f8f9fa;
                overflow: hidden;
                border-radius: 5px;
            }

            .close-btn {
                position: absolute;
                bottom: 0;
                left: 50%;
                transform: translateX(-50%);
                margin: 5px;
                width: 75px;
                height: 25px;
                color: white;
                background-color: #228be6;
                border-radius: 5px;
                text-align: center;
                line-height: 22px;
                cursor: pointer;
                user-select: none;
                transition: all 0.3s;
            }

            .close-btn:hover {
                background-color: #1c7ed6;
            }

            #setting form div {
                float: left;
            }

            #setting input {
                display: none;
            }

            #setting label {
                display: inline-block;
                width: 190px;
                height: 36px;
                margin: 5px;
                background-color: #868e96;
                text-align: center;
                line-height: 36px;
                color: white;
                border-radius: 5px;
                transition: all .3s;
                user-select: none;
                cursor: pointer;
            }

            #setting input:checked+label {
                background-color: #40c057;
            }

            .easy_download {
                flex-grow: 1;
                width: auto;
                height: 36px;
                margin: 3px 0 3px 5px;
                text-align: center;
                line-height: 36px;
                font-size: 15px;
                font-weight: 500;
                color: #fff;
                background-color: #228be6;
                border-radius: 5px;
                cursor: pointer;
                user-select: none;
                transition: 0.3s;
            }

            .easy_download:hover {
                background-color: #1c7ed6;
            }
            </style>
            `);
            $('#interaction-region').prepend($easy_download);
            $('head').append($easy_download_style);
            if (theme == 'd') { // 深色模式
                $('.setting-menu').css('background-color', '#25262b');
            }

            // * 4.3 懒人下载事件处理
            $('.easy_download').on({
                click: () => {
                    // 读取设置并给出提示信息
                    let settings = localStorage.getItem('settings');
                    if (!settings) {
                        alert('请先设置一键下载选项');
                        return;
                    } else {
                        console.log('=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=');
                        console.log(settings);
                        $('.easy_download').text(' 任务提交中......').addClass('public-downloading');
                    }

                    // 点击like
                    if (theme == 'd') { // 深色模式
                        $('.mantine-1tkveyv .mantine-3xbgk5:eq(1)').click();
                    } else { // 浅色模式
                        $('.mantine-1ayq7x2 .mantine-3xbgk5:eq(1)').click();
                    }

                    // 4.3.1 下载第一张预览图(按模型版本来)
                    if (settings.includes('picture_down')) {
                        let picture = data.modelVersions[model_version].images[0];
                        console.log(picture);

                        pic_url = picture.url.replace(/width=\d+/, 'width=' + picture.width);
                        console.log('pic_url: ' + pic_url);
                        downloadImg(pic_url, filename)
                            .then(function (status) {
                                console.log(status);
                                // 这里可以执行下载完成后需要执行的代码
                                $('.easy_download').text(' 一键下载 !').removeClass('public-downloading');
                            })
                            .catch(function (error) {
                                console.error(error);
                                alert('图片下载出现错误,请检查控制台中相关信息\n' + error.message);
                                // 这里可以执行下载失败后需要执行的代码
                                $('.easy_download').text(' 下载出现错误 !').addClass('public-error');
                            });
                    }

                    // 4.3.2 说明文档下载
                    if (settings.includes('text_down')) {
                        downloadDoc(data, model_version, md_flag);
                    }

                    // 4.3.3 info下载
                    if (settings.includes('info_down')) {
                        downInfo(data.modelVersions[model_version].id, filename);
                    }

                    // 4.3.4 模型下载
                    if (settings.includes('model_down')) {
                        // 获取下载链接
                        let down_url = data.modelVersions[model_version].files[0].downloadUrl;  // 默认链接
                        // 查找最大的文件
                        if (data.modelVersions[model_version].files.length > 1) {  // 存在多个文件
                            let max_sizeKB = data.modelVersions[model_version].files[0].sizeKB;
                            for (let i = 1; i < data.modelVersions[model_version].files.length; i++) {
                                if (data.modelVersions[model_version].files[i].sizeKB > max_sizeKB) {  // 有更大的文件
                                    down_url = data.modelVersions[model_version].files[i].downloadUrl;
                                }
                            }
                        }
                        console.log('下载链接: ' + down_url);
                        let link = $("<a>");
                        link.attr("href", down_url);
                        link.attr("download", "");
                        // 将 a 标签添加到页面中
                        $("body").append(link);
                        // 模拟点击操作,从而触发文件的下载
                        link[0].click();
                        // 将 a 标签从页面中移除
                        link.remove();
                    }

                    //不下载图片时直接恢复按钮样式
                    if (!settings.includes('picture_down')) {
                        $('.easy_download').text(' 一键下载 !').removeClass('public-downloading');
                    }
                    console.log('=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=');
                }
            });

            // ^ 5. 触发词下载格式切换(\n)
            // * 5.1 相关控件添加
            $trigger_words = $(`
            <div class="trigger-words-checkbox" id="trigger_words" title="是否在触发词中添加回车以分隔tag(适合如不同tag代表不同服装、发型)">
                <input type="checkbox">
                <label>\\n</label>
            </div>
            `);
            $trigger_words_style = $(`
            <style>
            .trigger-words-checkbox {
                width: 36px;
                height: 36px;
                position: relative;
                margin-left: 5px;
                border-radius: 5px;
                box-sizing: border-box;
            }

            .trigger-words-checkbox input[type="checkbox"] {
                position: absolute;
                top: 0;
                left: 0;
                width: 100%;
                height: 100%;
                z-index: 1;
                opacity: 0;
                cursor: pointer;
            }

            .trigger-words-checkbox label {
                position: absolute;
                width: 36px;
                height: 36px;
                border-radius: 5px;
                background-color: #868e96;
                box-sizing: border-box;
                transition: all 0.3s ease-out;
                color: white;
                font-size: 18px;
                font-weight: 500;
                line-height: 36px;
                text-align: center;
            }

            .trigger-words-checkbox input:hover + label {
                background-color: #565a5f;
            }

            .trigger-words-checkbox input[type="checkbox"]:checked + label {
                background-color: #228be6;
                border-color: #228be6;
            }
            </style>
            `);
            $('.easy_download').after($trigger_words);
            $('head').append($trigger_words_style);

            // ^ 6. 图库内图片下载
            // * 6.1 相关控件添加
            $add_btn = $(`
            <div id="gallery_btn" class="mantine-UnstyledButton-root mantine-Button-root mantine-16ez2wg" style="
                line-height: 34px;
                height: 34px;
                width: 125px;
                margin: auto 5px;
                text-align: center;
            " title="重新绑定当前页面中图片下载按钮">添加图片下载按钮</div>
            `);
            $('#switch-checkbox').parents('.mantine-Grid-col').prepend($add_btn);
            if (theme == 'd') {  // 暗黑模式
                $('#gallery_btn').removeClass('mantine-1tk98uh').addClass('mantine-3rhhm4');
            }

            // * 6.2 按钮事件处理
            $('#gallery_btn').on('click', function () {
                $(this).text('Loading...');
                console.log('=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=↓=');
                $('.picbtn').remove();

                // 通过API获取信息
                getGalleryData(data.modelVersions[model_version].id, location.href.match(/\d+/));

                let complete = setInterval(() => {
                    if (gallery_data_arr.length >= $('#gallery div[id]').length - 2) {
                        clearInterval(complete);
                        console.log('=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=');
                        console.log('页面元素个数:' + $('#gallery div[id]').length);
                        console.log(gallery_data_arr);
                        // 重新绑定按钮
                        $("a[href^='/images/']").after($btn);
                        $(this).text('添加图片下载按钮');
                    }
                }, 500);
            });

            // ^ 7. ZIP打包预览图下载(zip)
            // * 7.1 相关控件添加
            $zip_images = $(`
            <!-- 懒得重新写css, 直接套用之前的 -->
            <div class="trigger-words-checkbox" id="zipImages" title="将所有预览图以zip格式打包下载,激活后点击下载所有预览图即可">
                <input type="checkbox">
                <label>ZIP</label>
            </div>
            `);
            $zip_images_styles = $(`
            <style>
            #zipImages {
                width: 48px;
                height: 35px;
                margin-top: 3px;
            }

            #zipImages label {
                width: 48px;
                height: 35px;
            }
            </style>
            `);
            $('#downPic').after($zip_images);
            $('head').append($zip_images_styles);

            // * 7.2 打包预览图控件事件处理
            // 7.2.1 控件状态加载
            if (localStorage.getItem('zip_images') == '1') {
                $('#zipImages input').prop('checked', true);
            }
            // 7.2.2 点击切换控件状态并存储
            $('#zipImages input').on('click', function () {
                if ($('#zipImages input').prop('checked')) {
                    localStorage.setItem('zip_images', '1');
                } else {
                    localStorage.removeItem('zip_images');
                }
            });
            // 7.2.3 重新访问页面时加载显示以确保显示正确
            window.onfocus = function () {  // 当前页面得到焦点
                if (localStorage.getItem('zip_images') == '1') {
                    $('#zipImages input').prop('checked', true);
                } else {
                    $('#zipImages input').prop('checked', false);
                }
            }
            // * 7.3 打包预览图下载事件触发在 2.7.2(下载所有预览图) 中
        });
}

/**
 * 对请求到的数据根据需要下载的版本返回文件名并更新显示
 * TIPS: 增加了对文件大小的显示
 * @param {*} fetch_data 请求的数据
 * @param {*} model_version 模型版本号
 * @returns 文件名
 */
function getFilename(fetch_data, model_version) {

    let file_name = fetch_data.modelVersions[model_version].files[0].name;
    let file_size = fetch_data.modelVersions[model_version].files[0].sizeKB;
    if (fetch_data.modelVersions[model_version].files.length > 1) {  // 存在多个文件
        for (let i = 1; i < fetch_data.modelVersions[model_version].files.length; i++) {
            if (fetch_data.modelVersions[model_version].files[i].sizeKB > file_size) {  // 有更大的文件
                file_size = fetch_data.modelVersions[model_version].files[i].sizeKB;
                file_name = fetch_data.modelVersions[model_version].files[i].name;
            }
        }
    }

    file_name = file_name.slice(0, file_name.lastIndexOf('.'));
    $('.filename').text(file_name);
    $('.filesize').text((file_size / 1024).toFixed(2) + "MB");
    return file_name;
}

/**
 * 下载.info文件
 * @param {*} model_version_id 模型版本id
 * @param {*} file_name 文件名
 */
function downInfo(model_version_id, file_name) {
    let url = 'https://civitai.com/api/v1/model-versions/' + model_version_id;
    console.log('请求链接: ' + url);
    fetch(url)
        .catch(error => {
            alert('API数据不正常,请检查或重试\n' + error.message);
        })
        .then(response => {
            if (!response.ok) {
                throw new Error('Network response was not ok');
            }
            return response.json();
        })
        .then(data => {
            console.log(data);

            let encoded = encodeChinese(JSON.stringify(data, null, 4));
            let blob = new Blob([encoded], {
                type: "text/plain;charset=utf-8"
            });
            saveAs(blob, `${file_name}.civitai.info`);
            $('#downInfo').text('下载.info文件(C站助手)').removeClass('public-downloading');
        });
}

/**
 * 对中文进行Unicode编码
 * @param {*} str 字符串
 * @returns 编码结果
 */
function encodeChinese(str) {
    let encoded = '';
    for (let i = 0; i < str.length; i++) {
        let code = str.charCodeAt(i);
        if (code < 128) {
            // ASCII 字符
            encoded += str[i];
        } else {
            // 非 ASCII 字符,转换为 Unicode 编码
            encoded += '\\u' + code.toString(16);
        }
    }
    return encoded;
}

/**
 * 对请求到的数据根据版本号组合并下载说明文件
 * @param {*} fetch_data  请求的数据
 * @param {*} model_version 模型版本号
 * @param {*} md_flag 是否下载markdown格式
 */
function downloadDoc(fetch_data, model_version, md_flag) {
    // * 1. 获取提示词
    let triggerWords = '';
    let words = fetch_data.modelVersions[model_version].trainedWords;
    if (words == undefined || words.length == 0) {
        triggerWords = '无';
    } else {
        for (let i = 0; i < words.length; i++) {
            triggerWords += words[i] + ',';
            if ($('#trigger_words input').prop('checked')) {
                triggerWords += '\n';
            }
        }
    }

    // * 2. 获取示例图参数
    let examples = '';
    let request_json_data = `{"json":{"period":"AllTime","sort":"Most Reactions",
    "modelVersionId":${fetch_data.modelVersions[model_version].id},"modelId":${fetch_data.id},"hidden":false,"limit":50,"cursor":null,"authed":true},
    "meta":{"values":{"cursor":["undefined"]}}}`;
    let request_url = 'https://civitai.com/api/trpc/image.getImagesAsPostsInfinite?input=' + encodeURIComponent(request_json_data);
    console.log('图片请求链接: ' + request_url);
    fetch(request_url)
        .catch(error => {
            alert('图片信息请求API数据不正常\n' + error.message);
        })
        .then(response => {
            console.log(response);
            if (!response.ok) {
                throw new Error('Network response was not ok');
            }
            return response.json();
        })
        .then(data => {
            console.log(data);
            let image_data = data.result.data.json.items;
            console.log(image_data);

            // 提取示例图参数
            let pictures = fetch_data.modelVersions[model_version].images;
            for (let pic_index = 0; pic_index < pictures.length; pic_index++) { // 遍历待下载的图片
                let img_url = pictures[pic_index].url; // 获取图片链接
                let hash = pictures[pic_index].hash; // 获取图片hash
                let msg = ''; // 图片信息

                for (let j = 0; j < image_data.length; j++) { // 遍历数据组
                    for (let image_info of image_data[j].images) { // 每个数据组最多10个数据
                        if (hash == image_info.hash) { // hash 匹配,查找到对应的信息
                            console.log(image_info);
                            for (let key in image_info.meta) {
                                if (key == 'hashes') {
                                    msg += '--hashes: ' + JSON.stringify(image_info.meta[key]) + '\n';
                                    continue; // 继续下一循环,不执行下方代码
                                }
                                if (key == 'resources') {
                                    for (let res in image_info.meta[key]) {
                                        msg += '--' + key + ': ' + JSON.stringify(image_info.meta[key][res]) + '\n';
                                    }
                                    continue; // 继续下一循环,不执行下方代码
                                }
                                msg += '--' + key + ': ' + image_info.meta[key] + '\n';
                            }
                            break; // 退出10个数据的循环
                        }
                    }
                    if (msg != '') {
                        break; // 找到对应的数据,退出数据组循环
                    }
                }
                if (md_flag) {  // markdown格式
                    if (msg) {
                        examples += '\n================< ' + (pic_index + 1) + ' >================\n' + '预览图: \n![](' + img_url + ')\n参数: \n' + msg;
                    } else {
                        examples += '\n================< ' + (pic_index + 1) + ' >================\n' + '预览图: \n![](' + img_url + ')\n该图无参数\n';
                    }
                } else {  // txt格式
                    if (msg) {
                        examples += '\n================< ' + (pic_index + 1) + ' >================\n' + '预览图链接: \n' + img_url + '\n参数: \n' + msg;
                    } else {
                        examples += '\n================< ' + (pic_index + 1) + ' >================\n' + '预览图链接: \n' + img_url + '\n该图无参数\n';
                    }
                }
            }

            // * 3. 数据组合
            let content = '';
            let title = $('.mantine-1k4l0d8 h1').text();  // 获取标题文本
            if (title == '') {
                title = fetch_data.name;
            }
            let url = location.href;  // 获取网页链接
            if (md_flag) {  // markdown格式
                content = '## 标题:\n' + title.replace(/([\\<>])/g, '\\$1') + '\n\n' +
                    '## 链接:\n' + url + '\n\n' +
                    '## 触发词:\n' + triggerWords.replace(/([\\<>])/g, '\\$1') + '\n\n' +
                    '## 介绍:\n' + fetch_data.description + '\n\n';
                if (fetch_data.modelVersions[model_version].description)  // 版本介绍
                    content += `## 版本(${fetch_data.modelVersions[model_version].name})介绍:\n${fetch_data.modelVersions[model_version].description}\n\n`;
                content += '## 示例:' + examples.replace(/([\\<>])/g, '\\$1');
            } else {  // txt格式
                content = '标题:\n' + title + '\n\n' +
                    '链接:\n' + url + '\n\n' +
                    '触发词:\n' + triggerWords + '\n\n' +
                    '备注:\n' + $('#tips').val() + '\n\n' +
                    '示例:' + examples;
            }

            // * 4. 下载文件
            let file_name = getFilename(fetch_data, model_version);
            let blob = new Blob([content], {
                type: "text/plain;charset=utf-8"
            });
            saveAs(blob, `${file_name}${md_flag ? '.md' : '.txt'}`);
        });
}

/**
 * 获取当前模型版本示例图中最大宽度
 * @param {*} images 图片json数据
 * @returns 最大宽度
 */
function getMaxWidth(images) {
    let max_width = 0;
    for (let i = 0; i < images.length; i++) {
        if (images[i].width > max_width) {
            max_width = images[i].width;
        }
    }
    return max_width;
}

/**
 * 将 Blob 对象转换为文本内容
 * @param {*} blob blob数据
 * @param {*} callback 回调函数
 */
function blobToText(blob, callback) {
    var reader = new FileReader();
    reader.onload = function () {
        var text = reader.result;
        callback(text);
    };
    reader.readAsText(blob);
}

/**
 * 图片下载
 * @param {*} pic_url 图片链接
 * @param {*} file_name 文件名
 * @param {*} content_flag 内容返回flag
 * @returns
 */
function downloadImg(pic_url, file_name, content_flag = 0) {
    return new Promise(function (resolve, reject) {
        let x = new XMLHttpRequest();
        x.open('GET', pic_url, true);
        x.responseType = 'blob';
        x.onload = function () {
            // 将 Blob 对象转换为文本内容
            blobToText(this.response, function (text) {
                // console.log(text);

                // 判断图片是否含有参数
                if ((!text.includes('seed')) && (!text.includes('Seed')) && (!text.includes('UNICODE'))
                    && localStorage.getItem('png_format').includes('info_tips')) {  // 查找不到seed字符或UNICODE字符视为没有参数
                    file_name += '_noInfo';
                }

                // 判断是否增加预览格式
                if (localStorage.getItem('png_format').includes('preview')) {
                    file_name += '.preview';
                }

                // 获取图片格式
                if (text.startsWith('GIF89a'))  // 以该子字符串开头
                {
                    file_name += '.gif';
                } else if (pic_url.endsWith('.mp4')) { // mp4格式结尾 NOTE: 或者可以判断blob数据的type属性
                    file_name += '.mp4';
                } else {
                    file_name += '.png';
                }

                if (content_flag == 1) {  // 如果以zip格式进行打包
                    // resolve里的参数就是传入then的数据
                    resolve({ fileName: file_name, blobData: x.response });  // 返回包含文件名和 Blob 数据的对象
                } else {  // 直接下载图片
                    // 保存图片
                    let url = window.URL.createObjectURL(x.response);
                    let a = document.createElement('a');
                    a.href = url;
                    a.download = file_name;
                    a.click();
                    resolve('图片下载完成');  // 返回图片下载完成
                }

            });
        };
        x.onerror = function () {
            reject(new Error('图片下载失败'));
        };
        x.send();
    });
}

/**
 * 下载所有预览图
 * @param {*} fetch_data 请求的数据
 * @param {*} model_version 模型版本号
 * @param {*} images_arr 图片链接数组
 * @param {*} filename 文件名
 * @param {*} index 索引号
 * @returns
 */
function downloadImages(fetch_data, model_version, images_arr, filename, index) {
    // 判断API中是否有图片信息(理论上没有图片不会有按钮能点击,为了保险增加该检测)
    if (!fetch_data.modelVersions[model_version].images.length) {
        alert('未查找到该模型版本图片的信息,请自行检查错误');
        $('#downPic').text(`下载出现错误!`).addClass('public-error');
        return;
    }

    if (index >= images_arr.length) {
        console.log('所有图片下载完成');
        console.log('=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=');
        // 这里可以执行所有下载完成后需要执行的代码
        $('#downPic').text(`下载所有预览图(${images_arr.length})`).removeClass('public-downloading');
        return;
    }

    // 通过遍历请求的数据中图片链接获取宽度信息
    let image_width = 0;
    for (let i = 0; i < fetch_data.modelVersions[model_version].images.length; i++) {  // 当前模型版本内所有图片遍历
        if (fetch_data.modelVersions[model_version].images[i].url.includes(images_arr[index].split('/')[4])) {
            image_width = fetch_data.modelVersions[model_version].images[i].width;
            break;
        }
    }
    if (image_width == 0) {// 图片不在api返回数据内(api只返回10张图片)
        image_width = getMaxWidth(fetch_data.modelVersions[model_version].images);
    }
    // let image_width = getMaxWidth(fetch_data.modelVersions[model_version].images);

    // 图片链接获取
    let image_url = '';
    if (images_arr[index]) {
        image_url = images_arr[index].replace(/width=\d+/, 'width=' + image_width);
    }

    console.log(`pic_down: ${index + 1}/${images_arr.length}`);
    console.log(`ori_url : ${images_arr[index]}`);
    console.log(`pic_url : ${image_url}`);

    // 图片下载
    downloadImg(image_url, `${filename}_${index + 1}`)
        .then(function () {
            $('#downPic').text(`Downloading(${index + 1}/${images_arr.length})`);
            downloadImages(fetch_data, model_version, images_arr, filename, index + 1);
        })
        .catch(function (error) {
            console.error(error);
            // 是否继续下载
            let continue_flag = confirm('图片下载出现错误,是否跳过本张图片并尝试下载下一张?');
            if (continue_flag) {
                downloadImages(fetch_data, model_version, images_arr, filename, index + 1);
            } else {
                $('#downPic').text(`下载出现错误!`).addClass('public-error');
                return;
            }
        });
}

/**
 * 获取当前页面中的gallery一栏图片的API数据
 * @param {*} model_version_id 模型版本id
 * @param {*} model_id 模型id
 * @param {*} cursor
 * @param {*} cursor_value
 */
function getGalleryData(model_version_id, model_id, cursor = null, cursor_value = 'undefined') {
    let period = 'AllTime';
    let sort = 'Most Reactions';
    let temp = JSON.parse(localStorage.getItem('model-image-filters'));
    if (temp) {
        period = temp.period;
        sort = temp.sort;
    }

    // 数据组合
    let request_data = `{"json": {"period": "${period}","sort": "${sort}","modelVersionId": ${model_version_id},"modelId": ${model_id},"limit": 50,"cursor": ${cursor},"authed": true},"meta": {"values": {"cursor": ["${cursor_value}"]}}}`;
    // 请求数据
    console.log(request_data);
    let url = 'https://civitai.com/api/trpc/image.getImagesAsPostsInfinite?input=' + encodeURIComponent(request_data);
    console.log('请求链接: ' + url);
    fetch(url)
        .catch(error => {
            alert('API数据不正常,请检查或重试\n' + error.message);
        })
        .then(response => {
            if (!response.ok) {
                throw new Error('Network response was not ok');
            }
            return response.json();
        })
        .then(data => {
            console.log(data);

            // 获取下次请求值
            let nextcursor = data.result.data.json.nextCursor;
            let nextcursor_value = data.result.data.meta.values.nextCursor;

            // 数据存储
            let gallery_info = data.result.data.json.items;
            for (let i = 0; i < gallery_info.length; i++) {
                gallery_data_arr.push(gallery_info[i]);
            }

            // 判断是否结束
            if (nextcursor != null && ($('#gallery div[id]').length - 2) > gallery_data_arr.length) {
                // 请求下一个数据
                getGalleryData(model_version_id, model_id, nextcursor, nextcursor_value);
            }

            return;
        });
}

/**
 * 将所有预览图打包下载
 * @param {*} fetch_data 请求的数据
 * @param {*} model_version 模型版本号
 * @param {*} images_arr 图片链接数组
 * @param {*} file_name 文件名
 * @param {*} index 索引号
 */
function downloadZip(fetch_data, model_version, images_arr, file_name, index) {
    // 判断API中是否有图片信息(理论上没有图片不会有按钮能点击,为了保险增加该检测)
    if (!fetch_data.modelVersions[model_version].images.length) {
        alert('未查找到该模型版本图片的信息,请自行检查错误');
        $('#downPic').text(`下载出现错误!`).addClass('public-error');
        return;
    }

    // * 0. 创建zip实例 (提前到程序开始处)
    // var zip = new JSZip();

    // 图片遍历结束
    if (index >= images_arr.length) {
        // * 2. ZIP压缩
        // 将Zip打包成Blob对象
        zip.generateAsync({
            type: "blob"
        }, function updateCallback(metadata) {
            // 显示压缩进度
            var percent = metadata.percent.toFixed(2);
            $('#downPic').text(percent + "% done");
        }).then(function (content) {
            // 下载Zip文件
            saveAs(content, `${file_name}.zip`);

            // * 3. 下载完成并给出提示
            console.log('ZIP打包下载完成');
            console.log('=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=↑=');
            // 这里可以执行所有下载完成后需要执行的代码
            $('#downPic').text(`下载所有预览图(${images_arr.length})`).removeClass('public-downloading');
            return;
        });
    }
    if (index >= images_arr.length) { // 上面是异步的,需要提前退出不执行下面的语句
        return;
    }

    // * 1. 获取图片内容
    // 1.1 获取图片链接
    // 通过遍历请求的数据中图片链接获取宽度信息
    let image_width = 0;
    for (let i = 0; i < fetch_data.modelVersions[model_version].images.length; i++) {  // 当前模型版本内所有图片遍历
        if (fetch_data.modelVersions[model_version].images[i].url.includes(images_arr[index].split('/')[4])) {
            image_width = fetch_data.modelVersions[model_version].images[i].width;
            break;
        }
    }
    if (image_width == 0) {// 图片不在api返回数据内(api只返回10张图片)
        image_width = getMaxWidth(fetch_data.modelVersions[model_version].images);
    }
    // let image_width = getMaxWidth(fetch_data.modelVersions[model_version].images);

    // 图片链接获取
    let image_url = '';
    if (images_arr[index]) {
        image_url = images_arr[index].replace(/width=\d+/, 'width=' + image_width);
    }

    console.log(`pic_down: ${index + 1}/${images_arr.length}`);
    console.log(`ori_url : ${images_arr[index]}`);
    console.log(`pic_url : ${image_url}`);

    // 1.2 获取图片内容
    downloadImg(image_url, `${file_name}_${index + 1}`, 1)
        .then(({ fileName, blobData }) => {
            // 文件名:fileName,Blob 数据:blobData
            // 在此处进行需要的操作
            console.log(blobData);

            // 向zip中添加文件
            zip.file(fileName, blobData);

            // 1.3 请求下一张图片
            $('#downPic').text(`Downloading(${index + 1}/${images_arr.length})`);
            downloadZip(fetch_data, model_version, images_arr, file_name, index + 1);
        });
}

/**
 * 获取剪切板内容并保存到本地
 * @param {*} file_name 文件名
 * @note 首次需要手动确认剪贴板权限
 */
function readClipText(file_name) {
    var clipPromise = navigator.clipboard.readText();
    clipPromise.then(function (clipText) {
        // alert(clipText);
        const stringData = clipText
        // dada 表示要转换的字符串数据,type 表示要转换的数据格式
        const blob = new Blob([stringData], {
            type: "text/plain;charset=utf-8"
        })
        // 根据 blob生成 url链接
        const objectURL = URL.createObjectURL(blob)
        // 创建一个 a 标签Tag
        const aTag = document.createElement('a')
        // 设置文件的下载地址
        aTag.href = objectURL
        // 设置保存后的文件名称
        aTag.download = `${file_name}.txt`
        // 给 a 标签添加点击事件
        aTag.click()
        // 释放一个之前已经存在的、通过调用 URL.createObjectURL() 创建的 URL 对象。
        // 当你结束使用某个 URL 对象之后,应该通过调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。
        URL.revokeObjectURL(objectURL)
    });
}