Liblib tool

一键下载Liblib.art模型+配图+简介

Versión del día 14/01/2024. Echa un vistazo a la versión más reciente.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Liblib tool
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  一键下载Liblib.art模型+配图+简介
// @author       宇泽同学
// @license      MIT
// @match        https://www.liblib.art/modelinfo/*
// @grant        GM_download
// ==/UserScript==

(function () {
    'use strict';

    // 添加按钮和选择器的样式
    var style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = `
    .custom-button {
        background-color: #4CAF50; /* Green */
        color: white;
        width: 100px;
        height: 35px;
        padding: 5px 15px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 5px 2px;
        cursor: pointer;
        border: none;
        border-radius: 20px;
     }
    .image-count-selector {
        width: 65px; /* 边框宽度 */
        height: 35px;
        padding: 5px;
        border: 1px solid #4CAF50; /* Green border */
        border-radius: 20px;
        margin-left: 5px;
        display: inline-block;
        border-width:1.5px 1.5px 1.5px 1.5px
    }
    `;
    document.head.appendChild(style);

    function getSelectedTabName() {
        // 获取所有的tab
        var tabs = document.querySelectorAll('.ant-tabs-tab');

        // 遍历所有的tab
        for (var i = 0; i < tabs.length; i++) {
            // 获取aria-selected属性
            var isSelected = tabs[i].querySelector('.ant-tabs-tab-btn').getAttribute('aria-selected');

            // 检查tab是否被选中
            if (isSelected === 'true') {
                // 获取tab的标题
                var title = tabs[i].textContent;
                return title;  // 返回标题
            }
        }
    }

    function getModelName() {
        var version = getSelectedTabName();
        var modelName = document.querySelector('.ModelInfoHead_title__p5txd').innerText;
        modelName += "_" + version;
        return modelName;
    }

    // Create a MutationObserver to monitor DOM changes
    var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            if (mutation.type === 'childList') {
                var generateButton = document.querySelector('.ModelActionCard_runPic__0I9wi');
                if (generateButton && !document.querySelector('.one-click-download')) {
                    // 创建"下载全部"按钮
                    var downloadButton = document.createElement('button');
                    downloadButton.innerHTML = '下载全部';
                    downloadButton.className = 'custom-button one-click-download';
                    downloadButton.onclick = autoDownload;

                    // 创建"下载图片"按钮
                    var downloadImageButton = document.createElement('button');
                    downloadImageButton.innerHTML = '下载图片';
                    downloadImageButton.className = 'custom-button download-images-only';
                    downloadImageButton.onclick = function () {
                        var modelName = getModelName();
                        var imageCount = document.querySelector('.image-count-selector').value;
                        downloadImages(modelName, imageCount);
                    };

                    // 创建图片数量选择器
                    var imageCountSelector = document.createElement('input');
                    imageCountSelector.type = 'number';
                    imageCountSelector.min = '1';
                    imageCountSelector.value = '1'; // 默认值为1
                    imageCountSelector.className = 'image-count-selector';

                    // 将"下载图片"按钮和图片数量选择器添加到页面上
                    generateButton.parentNode.insertBefore(downloadButton, generateButton.nextSibling);
                    generateButton.parentNode.insertBefore(downloadImageButton, downloadButton.nextSibling);
                    generateButton.parentNode.insertBefore(imageCountSelector, downloadImageButton.nextSibling);

                    // 创建"下载简介"按钮
                    var downloadDocButton = document.createElement('button');
                    downloadDocButton.innerHTML = '下载简介';
                    downloadDocButton.className = 'custom-button download-doc-only';
                    downloadDocButton.onclick = function () {
                        var modelName = getModelName();
                        saveAsPlainText(modelName);

                    };

                    generateButton.parentNode.insertBefore(downloadDocButton, imageCountSelector.nextSibling);

                    observer.disconnect();
                }
            }
        });
    });

    observer.observe(document.body, { childList: true, subtree: true });

    function autoDownload() {
        var modelName = getModelName();
        downloadModel();
        saveAsPlainText(modelName);

        var imageCount = document.querySelector('.image-count-selector').value;
        downloadImages(modelName, imageCount);
    }

    function downloadModel() {
        var downloadButton = document.querySelector('.ModelActionCard_inner__XBdzk');
        if (downloadButton) {
            downloadButton.click();
        }
    }

    function selectReadme() {
        var mainElement = document.querySelector('.mantine-AppShell-main');
        return mainElement.querySelector('[class^="ModelDescription_desc"]');
    }

    function recordURL(modelName) {
        var url = window.location.href;
        var blob = new Blob([url], { type: 'text/plain' });
        var urlObject = window.URL.createObjectURL(blob);
        var downloadLink = document.createElement('a');
        downloadLink.href = urlObject;
        downloadLink.download = modelName + '_URL.txt';
        downloadLink.click();
        window.URL.revokeObjectURL(urlObject);
    }

    function saveAsHTML(modelName) {
        var descriptionElement = selectReadme();
        if (descriptionElement) {
            var htmlText = descriptionElement.innerHTML;
            var blob = new Blob([htmlText], { type: 'text/html' });
            var url = window.URL.createObjectURL(blob);
            var link = document.createElement('a');
            link.href = url;
            link.download = modelName + '.html';
            link.style.display = 'none';
            document.body.appendChild(link);
            console.log('Attempting to download HTML file:', link.download);
            link.click();
            document.body.removeChild(link);
        } else {
            console.log('Description element not found.');
        }
    }



    function saveAsPlainText(modelName) {
        var descriptionElement = selectReadme();
        if (descriptionElement) {
            var plainText = descriptionElement.innerText;
            // Append the model URL and empty lines
            plainText += "\n\n☑️本模型地址:" + window.location.href + "\n\n";
            var blob = new Blob([plainText], { type: 'text/plain' });
            var url = window.URL.createObjectURL(blob);
            var link = document.createElement('a');
            link.href = url;
            link.download = modelName + '.txt';
            link.style.display = 'none';
            document.body.appendChild(link);
            console.log('Attempting to download text file:', link.download);
            link.click();
            document.body.removeChild(link);
        } else {
            console.log('Description element not found.');
        }
    }

async function downloadImages(modelName, maxImages) {
    var images = document.querySelectorAll('img');
    var count = 0;
    if (images.length > 0) {
        for (var i = 0; i < images.length && count < maxImages; i++) {
            // 检查图片地址是否符合预期的格式
            if (images[i].src.startsWith('https://liblibai-online.vibrou.com/img/') ||
                images[i].src.startsWith('https://liblibai-online.vibrou.com/web/image/')) {
                var url = new URL(images[i].src);
                var pathSegments = url.pathname.split('/').filter(Boolean); // 分割路径并过滤空值
                // 拼接出清洁的URL,移除任何额外的查询参数或片段
                var cleanUrl = url.protocol + '//' + url.host + '/' + pathSegments.join('/');

                // 如果 count 为 0,不添加后缀,如果 count 大于 0,后缀从 _2 开始
                var fileNameSuffix = count > 0 ? '_' + (count + 1) : '';
                GM_download({
                    url: cleanUrl,
                    name: modelName + fileNameSuffix + '.png', // 添加 fileNameSuffix 以区分下载的图片
                    saveAs: true
                });
                count++; // 增加 count
                await new Promise(resolve => setTimeout(resolve, 1000)); // 等待1秒钟以避免服务器过载
            }
        }
    }
}



})();