LiblibAI Helper

Download model, preview, model description by one-click

  1. // ==UserScript==
  2. // @name LiblibAI Helper
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.4
  5. // @description Download model, preview, model description by one-click
  6. // @author Sleepy & NewBing
  7. // @license MIT
  8. // @match https://www.liblib.art/modelinfo/*
  9. // @grant GM_download
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. function getSelectedTabName() {
  16. // 获取所有的tab
  17. var tabs = document.querySelectorAll('.ant-tabs-tab');
  18.  
  19. // 遍历所有的tab
  20. for (var i = 0; i < tabs.length; i++) {
  21. // 检查tab是否被选中
  22. if (tabs[i].classList.contains('ant-tabs-tab-active')) {
  23. // 获取tab的标题
  24. var title = tabs[i].textContent;
  25. return title; // 返回标题
  26. }
  27. }
  28. }
  29.  
  30. function getModelName() {
  31. var version = getSelectedTabName();
  32. var modelName = document.querySelector('.ModelInfoHead_title__p5txd').innerText;
  33. modelName += "_" + version;
  34. // 使用正则表达式替换特殊字符
  35. modelName = modelName.replace(/[\/\\:*?"<>|]/g, "_");
  36. return modelName;
  37. }
  38.  
  39. // Create a MutationObserver to monitor DOM changes
  40. var observer = new MutationObserver(function(mutations) {
  41. mutations.forEach(function(mutation) {
  42. if (mutation.type === 'childList') {
  43. var generateButton = document.querySelector('.ModelActionCard_runPic__0I9wi');
  44. if (generateButton && !document.querySelector('.one-click-download')) {
  45.  
  46. var downloadButton = document.createElement('button');
  47. downloadButton.innerHTML = '一键下载';
  48. downloadButton.className = 'one-click-download';
  49. downloadButton.onclick = autoDownload;
  50.  
  51. var modelName = getModelName();
  52.  
  53. // 创建"仅下载图片"按钮
  54. var downloadImageButton = document.createElement('button');
  55. downloadImageButton.innerHTML = '仅下载图片';
  56. downloadImageButton.className = 'download-images-only';
  57. downloadImageButton.style = 'margin-left: 10px; display: inline-block;';
  58. downloadImageButton.onclick = function() {
  59. var imageCount = document.querySelector('.image-count-selector').value;
  60. downloadImages(modelName, imageCount);
  61. };
  62.  
  63. // 创建"仅下载文档"按钮
  64. var downloadDocButton = document.createElement('button');
  65. downloadDocButton.innerHTML = '仅下载文档';
  66. downloadDocButton.className = 'download-doc-only';
  67. downloadDocButton.style = 'margin-left: 10px; display: inline-block;';
  68. downloadDocButton.onclick = function() {
  69. recordURL(modelName);
  70. saveAsHTML(modelName);
  71. // saveAsMarkdown(modelName);
  72. saveAsPlainText(modelName);
  73. };
  74.  
  75. // 创建图片数量选择器
  76. var imageCountSelector = document.createElement('input');
  77. imageCountSelector.type = 'number';
  78. imageCountSelector.min = '1';
  79. imageCountSelector.value = '10'; // 默认值为10
  80. imageCountSelector.className = 'image-count-selector';
  81. imageCountSelector.style = 'margin-left: 10px; display: inline-block;';
  82.  
  83. // 将新的按钮和选择器添加到页面上
  84. generateButton.parentNode.insertBefore(downloadButton, generateButton.nextSibling);
  85. generateButton.parentNode.insertBefore(downloadImageButton, downloadButton.nextSibling);
  86. generateButton.parentNode.insertBefore(downloadDocButton, downloadImageButton.nextSibling);
  87. generateButton.parentNode.insertBefore(imageCountSelector, downloadImageButton.nextSibling);
  88.  
  89. observer.disconnect();
  90. }
  91. }
  92. });
  93. });
  94.  
  95. observer.observe(document.body, { childList: true, subtree: true });
  96.  
  97. function autoDownload() {
  98. var modelName = getModelName();
  99.  
  100. downloadModel();
  101.  
  102. recordURL(modelName);
  103. saveAsHTML(modelName);
  104. // saveAsMarkdown(modelName);
  105. saveAsPlainText(modelName);
  106.  
  107. var imageCount = document.querySelector('.image-count-selector').value;
  108. downloadImages(modelName, imageCount);
  109. }
  110.  
  111. function downloadModel() {
  112. var downloadButton = document.querySelector('.ModelActionCard_inner__XBdzk');
  113. if (downloadButton) {
  114. downloadButton.click();
  115. }
  116. }
  117.  
  118. async function downloadImages(modelName, maxImages) {
  119. var containers = document.querySelectorAll('.flex.flex-nowrap.w-full');
  120. console.log('找到的容器数量:' + containers.length);
  121. var count = 0;
  122. for (var j = 0; j < containers.length; j++) {
  123. var images = containers[j].querySelectorAll('img');
  124. console.log('在容器' + (j+1) + '中找到的图片数量:' + images.length);
  125. for (var i = 0; i < images.length && count < maxImages; i++) {
  126. if (images[i].src.startsWith('https://liblibai-online.vibrou.com/')) {
  127. var url = new URL(images[i].src);
  128. var cleanUrl = url.protocol + "//" + url.hostname + url.pathname;
  129. console.log('下载图片:' + cleanUrl);
  130. GM_download({
  131. url: cleanUrl,
  132. name: modelName + (count === 0 ? '' : '_preview_' + count) + '.png',
  133. saveAs: true
  134. });
  135. count++;
  136. console.log('已下载图片数量:' + count);
  137. await new Promise(resolve => setTimeout(resolve, 1000));
  138. }
  139. }
  140. }
  141. }
  142.  
  143.  
  144. /*
  145. async function downloadImages(modelName, maxImages) {
  146. var images = document.querySelectorAll('img');
  147. var count = 0;
  148. if (images.length > 0) {
  149. for (var i = 0; i < images.length && count < maxImages; i++) {
  150. if (images[i].src.startsWith('https://liblibai-online.vibrou.com/img/')) {
  151. var url = new URL(images[i].src);
  152. var cleanUrl = url.protocol + "//" + url.hostname + url.pathname;
  153. GM_download({
  154. url: cleanUrl,
  155. name: modelName + (count === 0 ? '' : '_preview_' + count) + '.png',
  156. saveAs: true
  157. });
  158. count++;
  159. await new Promise(resolve => setTimeout(resolve, 1000));
  160. }
  161. }
  162. }
  163. }*/
  164.  
  165. function selectReadme() {
  166. var mainElement = document.querySelector('.mantine-AppShell-main');
  167. return mainElement.querySelector('[class^="ModelDescription_desc"]');
  168. }
  169.  
  170. function recordURL(modelName) {
  171. var url = window.location.href;
  172. var blob = new Blob([url], {type: 'text/plain'});
  173. var urlObject = window.URL.createObjectURL(blob);
  174. var downloadLink = document.createElement('a');
  175. downloadLink.href = urlObject;
  176. downloadLink.download = modelName + '_URL.txt';
  177. downloadLink.click();
  178. window.URL.revokeObjectURL(urlObject);
  179. }
  180.  
  181. function saveAsHTML(modelName) {
  182. var descriptionElement = selectReadme();
  183. if (descriptionElement) {
  184. var htmlText = descriptionElement.innerHTML;
  185. var blob = new Blob([htmlText], {type: 'text/html'});
  186. var url = window.URL.createObjectURL(blob);
  187. var link = document.createElement('a');
  188. link.href = url;
  189. link.download = modelName + '.html';
  190. link.style.display = 'none';
  191. document.body.appendChild(link);
  192. console.log('Attempting to download HTML file:', link.download);
  193. link.click();
  194. document.body.removeChild(link);
  195. } else {
  196. console.log('Description element not found.');
  197. }
  198. }
  199.  
  200. function saveAsMarkdown(modelName) {
  201. var descriptionElement = selectReadme();
  202. if (descriptionElement) {
  203. var markdownText = convertHtmlToMarkdown(descriptionElement.innerHTML);
  204. var blob = new Blob([markdownText], {type: 'text/markdown'});
  205. var url = window.URL.createObjectURL(blob);
  206. var link = document.createElement('a');
  207. link.href = url;
  208. link.download = modelName + '.md';
  209. link.style.display = 'none';
  210. document.body.appendChild(link);
  211. console.log('Attempting to download markdown file:', link.download);
  212. link.click();
  213. document.body.removeChild(link);
  214. } else {
  215. console.log('Description element not found.');
  216. }
  217. }
  218.  
  219. function saveAsPlainText(modelName) {
  220. var descriptionElement = selectReadme();
  221. if (descriptionElement) {
  222. var plainText = descriptionElement.innerText;
  223. var blob = new Blob([plainText], {type: 'text/plain'});
  224. var url = window.URL.createObjectURL(blob);
  225. var link = document.createElement('a');
  226. link.href = url;
  227. link.download = modelName + '.txt';
  228. link.style.display = 'none';
  229. document.body.appendChild(link);
  230. console.log('Attempting to download text file:', link.download);
  231. link.click();
  232. document.body.removeChild(link);
  233. } else {
  234. console.log('Description element not found.');
  235. }
  236. }
  237.  
  238. function convertHtmlToMarkdown(html) {
  239. // This is a very basic implementation and might not work for all HTML.
  240. // Consider using a library like Turndown for a more robust solution.
  241. var tempDiv = document.createElement('div');
  242. tempDiv.innerHTML = html;
  243. return tempDiv.innerText;
  244. }
  245.  
  246.  
  247. })();