// ==UserScript== // @name HF model downloader // @namespace http://tampermonkey.net/ // @version 0.1 // @description Extract urls to model of Huggingface. Make your life easier when downloading the weights manually. // @author Desjajja and ChatGPT // @match https://huggingface.co/*/tree/main // @icon https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // Your code here... // Get all elements on the page const links = document.getElementsByTagName("a"); // Create an array to store the URLs of downloadable files const downloadUrls = []; // Loop through each element and extract its href attribute value for (let i = 0; i < links.length; i++) { const link = links[i]; const url = link.href; // Check if the URL ends with a .postfix extension (change "postfix" to the actual file extension) if (url && url.match(/\.[0-9a-z]+$/i) && !url.match(/\/$/) && !url.includes("blob")) { let url_parts = url.split(/[\\/]/); downloadUrls.push({ 'url': url, 'name': url_parts.pop() }); } } // Create a button to download the array of downloadable file URLs to a text file const button = document.createElement('button'); button.innerHTML = 'Download URLs'; button.style.position = 'fixed'; button.style.top = '10px'; button.style.right = '10px'; button.style.zIndex = '9999'; const toggleButton = document.createElement('button'); toggleButton.innerHTML = 'Hide URLs'; toggleButton.style.position = 'fixed'; toggleButton.style.top = '30px'; toggleButton.style.right = '10px'; toggleButton.style.zIndex = '9999'; // Create checkboxes for each downloadable file URL const checkboxes = []; const checkboxContainer = document.createElement('div'); checkboxContainer.style.position = 'fixed'; checkboxContainer.style.top = '50px'; checkboxContainer.style.right = '10px'; checkboxContainer.style.zIndex = '9999'; for (let i = 0; i < downloadUrls.length; i++) { const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.name = 'url_checkbox'; checkbox.value = downloadUrls[i].url; const label = document.createElement('label'); label.innerHTML = downloadUrls[i].name; checkboxContainer.appendChild(checkbox); checkboxContainer.appendChild(label); checkboxContainer.appendChild(document.createElement('br')); checkboxes.push(checkbox); } // Create a "Select All" checkbox const selectAll = document.createElement('input'); selectAll.type = 'checkbox'; selectAll.name = 'select_all_checkbox'; selectAll.value = 'Select All'; const selectAllLabel = document.createElement('label'); selectAllLabel.innerHTML = 'Select All'; checkboxContainer.prepend(selectAllLabel); checkboxContainer.prepend(selectAll); checkboxContainer.prepend(document.createElement('br')); // Add the button and checkboxes to the page document.body.appendChild(button); document.body.appendChild(checkboxContainer); document.body.appendChild(toggleButton); // Download the selected URLs when the button is clicked button.onclick = function() { const selectedUrls = []; for (let i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { selectedUrls.push(checkboxes[i].value); } } if (selectedUrls.length === 0) { alert("No files to download!"); return; } const blob = new Blob([selectedUrls.join('\n')], {type: 'text/plain'}); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = 'download_urls.txt'; link.click(); }; // Select or deselect all checkboxes when the "Select All" checkbox is clicked selectAll.onclick = function() { for (let i = 0; i < checkboxes.length; i++) { checkboxes[i].checked = selectAll.checked; } }; // Toggle the visibility of the checkbox container when the toggle button is clicked toggleButton.onclick = function() { if (checkboxContainer.style.display === 'none') { checkboxContainer.style.display = 'block'; toggleButton.innerHTML = 'Hide URLs'; } else { checkboxContainer.style.display = 'none'; toggleButton.innerHTML = 'Show URLs'; } }; function updateSelectAll() { let allChecked = true; for (let i = 0; i < checkboxes.length; i++) { if (!checkboxes[i].checked) { allChecked = false; break; } } selectAll.checked = allChecked; }; // Add event listeners to update the "Select All" checkbox state whenever a checkbox is clicked for (let i = 0; i < checkboxes.length; i++) { checkboxes[i].addEventListener('click', function() { updateSelectAll(); }); } // Update the "Select All" checkbox state initially updateSelectAll(); })();