// ==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)
});
}