Allows you to download subfolders from GitHub repository pages.
// ==UserScript== // @name GitHub Repo Subfolder Downloader // @description Allows you to download subfolders from GitHub repository pages. // @icon https://github.githubassets.com/favicons/favicon-dark.svg // @version 1.0 // @author afkarxyz // @namespace https://github.com/afkarxyz/misc-scripts/ // @supportURL https://github.com/afkarxyz/misc-scripts/issues // @license MIT // @match https://github.com/* // @grant none // ==/UserScript== (function() { 'use strict'; const style = document.createElement('style'); style.textContent = ` .github-subfolder-download-icon { cursor: pointer; transition: transform 0.1s ease; } .github-subfolder-download-icon:hover { transform: scale(1.1); } `; document.head.appendChild(style); function replaceFolderIcons() { const directoryRows = document.querySelectorAll('tr.react-directory-row'); directoryRows.forEach(row => { const svgIcons = row.querySelectorAll('.react-directory-filename-column svg.icon-directory'); svgIcons.forEach(svg => { if (!svg.dataset.replaced) { svg.innerHTML = ` <path d="M14.2,3H7.5C7.4,3,7.3,3,7.3,2.9L6.4,1.7C6.1,1.3,5.5,1,5,1H1.8C0.8,1,0,1.8,0,2.8v10.5c0,1,0.8,1.8,1.8,1.8h12.5 c1,0,1.8-0.8,1.8-1.8V4.8C16,3.8,15.2,3,14.2,3z M10.8,9.8l-2.4,2.4c-0.2,0.2-0.6,0.2-0.8,0L5.2,9.8C5,9.6,5,9.2,5.2,9 C5.3,8.7,5.8,8.7,6,9l1.4,1.3V7c0-0.3,0.3-0.6,0.6-0.6S8.5,6.7,8.5,7v3.3L10,9c0.2-0.2,0.6-0.2,0.8,0C11,9.2,11,9.6,10.8,9.8z"/> `; svg.classList.add('github-subfolder-download-icon'); svg.dataset.replaced = 'true'; const folderLink = row.querySelector('a[href*="/tree/"]'); if (folderLink) { const fullUrl = folderLink.href; const downloadUrl = `https://downgit.evecalm.com/#/home?url=${encodeURIComponent(fullUrl)}`; svg.addEventListener('click', (e) => { e.preventDefault(); e.stopPropagation(); window.open(downloadUrl, '_blank'); }); } } }); }); } const observer = new MutationObserver((mutations) => { for (let mutation of mutations) { if (mutation.type === 'childList') { replaceFolderIcons(); } } }); observer.observe(document.body, { childList: true, subtree: true }); replaceFolderIcons(); })();