Greasy Fork is available in English.

LiblibAI Helper

Download model, preview, model description by one-click

// ==UserScript==
// @name         LiblibAI Helper
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  Download model, preview, model description by one-click
// @author       Sleepy & NewBing
// @license      MIT
// @match        https://www.liblib.art/modelinfo/*
// @grant        GM_download
// ==/UserScript==

(function() {
    'use strict';

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

        // 遍历所有的tab
        for (var i = 0; i < tabs.length; i++) {
            // 检查tab是否被选中
            if (tabs[i].classList.contains('ant-tabs-tab-active')) {
                // 获取tab的标题
                var title = tabs[i].textContent;
                return title;  // 返回标题
            }
        }
    }

    function getModelName() {
        var version = getSelectedTabName();
        var modelName = document.querySelector('.ModelInfoHead_title__p5txd').innerText;
        modelName += "_" + version;
        // 使用正则表达式替换特殊字符
        modelName = modelName.replace(/[\/\\:*?"<>|]/g, "_");
        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 = 'one-click-download';
					downloadButton.onclick = autoDownload;

					var modelName = getModelName();

					// 创建"仅下载图片"按钮
					var downloadImageButton = document.createElement('button');
					downloadImageButton.innerHTML = '仅下载图片';
					downloadImageButton.className = 'download-images-only';
					downloadImageButton.style = 'margin-left: 10px; display: inline-block;';
					downloadImageButton.onclick = function() {
						var imageCount = document.querySelector('.image-count-selector').value;
						downloadImages(modelName, imageCount);
					};

					// 创建"仅下载文档"按钮
					var downloadDocButton = document.createElement('button');
					downloadDocButton.innerHTML = '仅下载文档';
					downloadDocButton.className = 'download-doc-only';
					downloadDocButton.style = 'margin-left: 10px; display: inline-block;';
					downloadDocButton.onclick = function() {
						recordURL(modelName);
						saveAsHTML(modelName);
						// saveAsMarkdown(modelName);
						saveAsPlainText(modelName);
					};

					// 创建图片数量选择器
					var imageCountSelector = document.createElement('input');
					imageCountSelector.type = 'number';
					imageCountSelector.min = '1';
					imageCountSelector.value = '10';  // 默认值为10
					imageCountSelector.className = 'image-count-selector';
					imageCountSelector.style = 'margin-left: 10px; display: inline-block;';

					// 将新的按钮和选择器添加到页面上
					generateButton.parentNode.insertBefore(downloadButton, generateButton.nextSibling);
					generateButton.parentNode.insertBefore(downloadImageButton, downloadButton.nextSibling);
					generateButton.parentNode.insertBefore(downloadDocButton, downloadImageButton.nextSibling);
					generateButton.parentNode.insertBefore(imageCountSelector, downloadImageButton.nextSibling);

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

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

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

        downloadModel();

		recordURL(modelName);
        saveAsHTML(modelName);
        // saveAsMarkdown(modelName);
        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();
        }
    }

    async function downloadImages(modelName, maxImages) {
        var containers = document.querySelectorAll('.flex.flex-nowrap.w-full');
        console.log('找到的容器数量:' + containers.length);
        var count = 0;
        for (var j = 0; j < containers.length; j++) {
            var images = containers[j].querySelectorAll('img');
            console.log('在容器' + (j+1) + '中找到的图片数量:' + images.length);
            for (var i = 0; i < images.length && count < maxImages; i++) {
                if (images[i].src.startsWith('https://liblibai-online.vibrou.com/')) {
                    var url = new URL(images[i].src);
                    var cleanUrl = url.protocol + "//" + url.hostname + url.pathname;
                    console.log('下载图片:' + cleanUrl);
                    GM_download({
                        url: cleanUrl,
                        name: modelName + (count === 0 ? '' : '_preview_' + count) + '.png',
                        saveAs: true
                    });
                    count++;
                    console.log('已下载图片数量:' + count);
                    await new Promise(resolve => setTimeout(resolve, 1000));
                }
            }
        }
    }


/*
	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/')) {
					var url = new URL(images[i].src);
					var cleanUrl = url.protocol + "//" + url.hostname + url.pathname;
					GM_download({
						url: cleanUrl,
						name: modelName + (count === 0 ? '' : '_preview_' + count) + '.png',
						saveAs: true
					});
					count++;
					await new Promise(resolve => setTimeout(resolve, 1000));
				}
			}
		}
	}*/

    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 saveAsMarkdown(modelName) {
        var descriptionElement = selectReadme();
        if (descriptionElement) {
            var markdownText = convertHtmlToMarkdown(descriptionElement.innerHTML);
            var blob = new Blob([markdownText], {type: 'text/markdown'});
            var url = window.URL.createObjectURL(blob);
            var link = document.createElement('a');
            link.href = url;
            link.download = modelName + '.md';
            link.style.display = 'none';
            document.body.appendChild(link);
            console.log('Attempting to download markdown 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;
            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.');
        }
    }

    function convertHtmlToMarkdown(html) {
        // This is a very basic implementation and might not work for all HTML.
        // Consider using a library like Turndown for a more robust solution.
        var tempDiv = document.createElement('div');
        tempDiv.innerHTML = html;
        return tempDiv.innerText;
    }


})();