NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Github Download Booster // @version 2.5.24 // @author Edhic1 // @description High-speed download of Git Clone/SSH, Release, Raw, Code(ZIP) and other files (Based on public welfare), project list file quick download (☁) // @license MIT // @match *://github.com/* // @match *://hub.incept.pw/* // @match *://hub.nuaa.cf/* // @match *://hub.yzuu.cf/* // @match *://hub.scholar.rr.nu/* // @match *://dgithub.xyz/* // @match *://kkgithub.com/* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACEUExURUxpcRgWFhsYGBgWFhcWFh8WFhoYGBgWFiUlJRcVFRkWFhgVFRgWFhgVFRsWFhgWFigeHhkWFv////////////r6+h4eHv/// xcVFfLx8SMhIUNCQpSTk/r6+jY0NCknJ97e3ru7u+fn51BOTsPCwqGgoISDg6empmpoaK2srNDQ0FhXV3eXcCcAAAAXdFJOUwCBIZXMGP70BuRH2Ze/LpIMUunHkpQR34sfygAAAVpJREFUOMt1U+magjAMDAVb5BDU3W25b9T1/d9vaYpQKDs/rF9nSNJkArDA9ezQZ8wPbc8FE6eAiQUsOO1o19JolFibKCdHGHC0IJezOMD5snx/yE +KOYYr42fPSufSZyazqDoseTPw4lGJNOu6LBXVUPBG3lqYAOv/5ZwnNUfUifzBt8gkgfgINmjxOpgqUA147QWNaocLniqq3QsSVbQHNp45N/BAwoYQz9oUJEiE4GMGfoBSMj5gjeWRIMMqleD/CAzUHFqTLyj OA5zjNnwa4UCEZ2YK3khEcBXHjVBtEFeIZ6+NxYbPqWp1DLKV42t6Ujn2ydyiPi9nX0TTNAkVVZ/gozsl6FbrktkwaVvL2TRK0C8Ca7Hck7f5OBT6FFbLATkL2ugV0tm0RLM9fedDvhWstl8 Wp9AFDjFX7yOY/lJrv8AkYuz7fuP8dv9izCYH+x3/LBnj9fYPBTpJDNzX+7cAAAAASUVORK5CYII= // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_openInTab // @grant GM_getValue // @grant GM_setValue // @grant GM_notification // @grant window.onurlchange // @sandbox JavaScript // @run-at document-end // @supportURL https://github.com/Edhic1/Github-Download-Booster // @homepageURL https://github.com/Edhic1/Github-Download-Booster // @updateURL https://openuserjs.org/meta/Edhic1/Github_Download_Booster.meta.js // @downloadURL https://openuserjs.org/install/Edhic1/Github_Download_Booster.user.js // @copyright 2024, Edhic1 (https://openuserjs.org/users/Edhic1) // ==/UserScript== (function() { 'use strict'; var backColor = '#ffffff', fontColor = '#888888', menu_rawFast = GM_getValue('xiu2_menu_raw_fast'), menu_rawFast_ID, menu_rawDownLink_ID, menu_gitClone_ID, menu_feedBack_ID; const download_url_us = [ ['https://gh.h233.eu.org/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@XIU/XIU2] '], //['https://gh.api.99988866.xyz/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [hunshcn/gh-proxy] '], // Too many people use the official demonstration site ['https://gh.ddlc.top/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@mtr-static-official] '], //['https://gh2.yanqishui.work/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@HongjieCN] '], // Parsing error ['https://dl.ghpig.top/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [feizhuqwq.com] '], //['https://gh.flyinbug.top/gh/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [Mintimate] '], // Error ['https://slink.ltd/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [ Zhiliao Station ] '], //['https://git.xfj0.cn/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [ Anonymous ] '], // No resolution ['https://gh.con.sh/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [ Anonymous ] '], //['https://ghps.cc/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [ Anonymous ] '], // prompt blocked //['https://gh-proxy.com/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [ Anonymous ] '], // 502 ['https://cors.isteed.cc/github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@Lufs\'s] '], ['https://hub.gitmirror.com/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [GitMirror] '], ['https://sciproxy.com/github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [sciproxy.com] '], ['https://ghproxy.cc/https://github.com', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [@yionchiii lau] '], ['https://cf.ghproxy.cc/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], ['https://www.ghproxy.cc/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], ['https://ghproxy.cn/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], ['https://www.ghproxy.cn/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], ['https://gh.jiasu.in/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@0-RTT] '], ['https://dgithub.xyz', ' United States ', '[ United States Seattle ] - This public welfare acceleration source is provided by [dgithub.xyz] '], ['https://download.ixnic.net', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '], ['https://download.nuaa.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '], ['https://download.scholar.rr.nu', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '], ['https://download.yzuu.cf', ' United States ', '[ United States New York ] - This public acceleration source is provided by [FastGit group member ] '] ], download_url = [ //['https://download.fastgit.org', ' Germany ', '[ Germany ] - This public welfare acceleration source is provided by [FastGit] Tip: I hope everyone will use the previous US nodes as much as possible ( 4 random nodes each time for load balancing), avoid traffic concentrating on Asian public welfare nodes, reduce cost pressure, and make public welfare more sustainable ~', 'https://archive.fastgit.org'], // Certificate expired ['https://mirror.ghproxy.com/https://github.com', 'South Korea', '[ Japan, Korea, Germany, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [ghproxy] Tip: I hope everyone will try to use the previous US node as much as possible (randomly each time Load balancing), Avoid all traffic from being concentrated on the Asian charity node, reduce cost pressure, and make charity more sustainable ~'], ['https://ghproxy.net/https://github.com', ' Japan ', '[ Japan Osaka ] - This public welfare acceleration source is provided by [ghproxy] Tip: I hope everyone will use the previous American nodes as much as possible (randomly each time Load balancing), avoid traffic concentration on Asian charity nodes, reduce cost pressure, and charity can be more sustainable ~'], ['https://kkgithub.com', 'Hongkong', '[ Hong Kong, China, Japan, Singapore, etc. ] - This public welfare acceleration source is provided by [help.kkgithub.com] Tip: I hope everyone will use the previous US nodes as much as possible ( 4 random nodes each time for load balancing), avoid traffic concentrating on Asian public welfare nodes, reduce cost pressure, and make public welfare more sustainable ~'], //['https://download.incept.pw', 'Hongkong', '[Hongkong,China] - This public welfare acceleration source is provided by [FastGit group member ] Tip: I hope everyone will use the previous US nodes as much as possible ( 4 random nodes each time for load balancing), avoid traffic concentrating on Asian public welfare nodes, reduce cost pressure, and make public welfare more sustainable ~'] // ERR_SSL_PROTOCOL_ERROR ], clone_url = [ ['https://gitclone.com', ' Domestic ', '[ China Domestic ] - This public welfare acceleration source is provided by [GitClone] - Cache: Yes - Slower for the first time , faster after caching '], ['https://kkgithub.com', 'Hongkong', '[ Hong Kong, China, Japan, Singapore, etc. ] - This public welfare acceleration source is provided by [help.kkgithub.com] - Cache: None (or very short time) '], ['https://hub.incept.pw', 'Hongkong', '[Hongkong,China、USA] - This public welfare acceleration source is provided by [FastGit group members ] '], ['https://mirror.ghproxy.com/https://github.com', ' Korea ', '[ Japan, Korea, Germany, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '], //['https://gh-proxy.com/https://github.com', 'South Korea', '[South Korea] - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '], ['https://githubfast.com', 'South Korea', '[South Korea] - This public welfare acceleration source is provided by [Github Fast] - Cache: None (or very short time) '], ['https://ghproxy.net/https://github.com', ' Japan ', '[ Japan Osaka ] - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '], ['https://github.moeyy.xyz/https://github.com', ' Singapore ', '[ Singapore, Hong Kong, China, Japan, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [Moeyy] - Cache: None (or very short time) '], //['https://slink.ltd/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [ Zhi Liao Xiao Zhan ] '] // Not necessary for now //['https://hub.gitmirror.com/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [GitMirror] '], // Not necessary for now //['https://sciproxy.com/github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [sciproxy.com] '], // Not necessary for now //['https://ghproxy.cc/https://github.com', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary yet //['https://cf.ghproxy.cc/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now //['https://www.ghproxy.cc/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now //['https://ghproxy.cn/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now //['https://www.ghproxy.cn/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now //['https://gh.jiasu.in/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@0-RTT] '], // Not necessary for now //['https://dgithub.xyz', ' United States ', '[ United States Seattle ] - This public welfare acceleration source is provided by [dgithub.xyz] '], // Not necessary yet //['https://hub.fgit.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Being complained about and hung up //['https://hub.nuaa.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now //['https://hub.scholar.rr.nu', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now //['https://hub.njuu.cf', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '], // The domain name is down //['https://hub.yzuu.cf', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now //['https://hub.0z.gs', ' United States ', '[ US Cloudflare CDN]'], // Domain name not resolved //['https://hub.shutcm.cf', ' United States ', '[ US Cloudflare CDN]'] // Connection timed out ], clone_ssh_url = [ ['ssh://git@ssh.github.com:443/', 'Github native ', '[ Japan, Singapore, etc. ] - SSH on port 443 provided by Github (still SSH protocol), suitable for network environments with restricted access to port 22 '], ['git@ssh.fastgit.org:', ' Hong Kong ', '[ China Hong Kong ] - This public welfare acceleration source is provided by [FastGit] '] //['git@git.zhlh6.cn:', ' United States ', '[ United States Los Angeles ]'] // Hang up ], raw_url = [ ['https://raw.githubusercontent.com', 'Github native ', '[ Japan Tokyo ]'], ['https://raw.kkgithub.com', 'Hongkong', '[ Hong Kong, China, Japan, Singapore, etc. ] - This public welfare acceleration source is provided by [help.kkgithub.com] - Cache: None (or very short time) '], ['https://mirror.ghproxy.com/https://raw.githubusercontent.com', ' Korea ', '[ Japan, Korea, Germany, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '], //['https://gh-proxy.com/https://raw.githubusercontent.com', 'South Korea2', '[South Korea] - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '], ['https://ghproxy.net/https://raw.githubusercontent.com', 'Japan1', '[Japan Osaka ] - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '], ['https://fastly.jsdelivr.net/gh', 'Japan2', '[Japan Tokyo ] - This public welfare acceleration source is provided by [JSDelivr CDN] - Cache: Yes - Files larger than 50 MB are not supported - Branch names in version number format (such as v1.2.3 ) are not supported '], ['https://fastraw.ixnic.net', 'Japan3', '[Japan Osaka ] - This public welfare acceleration source is provided by [FastGit group member ] - Cache: None (or very short time) '], // There is also a raw.ixnic.net in Los Angeles, USA //['https://gcore.jsdelivr.net/gh', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [JSDelivr CDN] - Cache: Yes - Does not support files larger than 50 MB - Does not support branch names in version number format (such as v1.2.3 ) '], // becomes Cloudflare CDN in the United States ['https://cdn.jsdelivr.us/gh', ' Other 1', '[ South Korea, the United States, Malaysia, Romania, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [@ayao] - Cache: Yes '], ['https://jsdelivr.b-cdn.net/gh', ' Other 2', '[ Hong Kong, Taiwan, Japan, Singapore, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [@rttwyjz] - Cache: Yes '], ['https://github.moeyy.xyz/https://raw.githubusercontent.com', ' Other 3', '[ Singapore, Hong Kong, China, Japan, etc. ] ( CDN is not fixed) - Cache: None (or very short time) '], ['https://raw.cachefly.998111.xyz', ' Other 4', '[ Singapore, Japan, India, etc. ] ( Anycast CDN is not fixed) - This public welfare acceleration source is provided by [@XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX0] - Cache: Yes (about 12 hours ) '], //['https://raw.incept.pw', 'Hongkong', '[ Hong Kong, China, the United States ] - This public welfare acceleration source is provided by [FastGit group members ] - Cache: None (or very short time) '], // ERR_SSL_PROTOCOL_ERROR //['https://ghproxy.cc/https://raw.githubusercontent.com', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary yet //['https://cf.ghproxy.cc/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now //['https://www.ghproxy.cc/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now //['https://ghproxy.cn/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now //['https://www.ghproxy.cn/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now //['https://gh.jiasu.in/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@0-RTT] '], // Not necessary for now //['https://dgithub.xyz', ' United States ', '[ United States Seattle ] - This public welfare acceleration source is provided by [dgithub.xyz] '], // Not necessary yet //['https://raw.fgit.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] - Cache: None (or very short time) '], // Hanged due to complaint //['https://raw.nuaa.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now //['https://raw.scholar.rr.nu', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now //['https://raw.njuu.cf', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] - Cache: None (or very short time) '], // Domain name is down //['https://raw.yzuu.cf', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] - Cache: None (or very short time) '], // Not necessary yet //['https://raw.gitmirror.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [GitMirror] - Cache: Yes '], // Not necessary for now //['https://cdn.54188.cf/gh', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [PencilNavigator] - Cache: Yes '], // Not necessary for now //['https://raw.fastgit.org', ' Germany ', '[ Germany ] - This public welfare acceleration source is provided by [FastGit] - Cache: None (or very short time) '], // Hang up //['https://git.yumenaka.net/https://raw.githubusercontent.com', ' United States ', '[ United States San Jose ] - Cache: None (or very short time) '], // Connection timed out ], svg = [ '<svg class="octicon octicon-cloud-download" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path d="M9 12h2l-3 3-3-3h2V7h2v5zm3-8c0-.44-.91-3-4.5-3C5.08 1 3 2.92 3 5 1.02 5 0 6.52 0 8c0 1.53 1 3 3 3h3V9.7H3C1.38 9.7 1.3 8.28 1.3 8c0-.17.05-1.7 1.7-1.7h1.3V5c0-1.39 1.56-2.7 3.2-2.7 2.55 0 3.13 1.55 3.2 1.8v1.2H12c.81 0 2.7.22 2.7 2.2 0 2.09-2.25 2.2-2.7 2.2h-2V11h2c2.08 0 4-1.16 4-3.5C16 5.06 14.08 4 12 4z"></path></svg>' ], style = ['padding:0 6px; margin-right: -1px; border-radius: 2px; background-color: var(--XIU2-back-Color); border-color: rgba(27, 31, 35, 0.1); font-size: 11px; color: var(--XIU2-font-Color);']; if (menu_rawFast == null){menu_rawFast = 1; GM_setValue('xiu2_menu_raw_fast', 1)}; if (GM_getValue('menu_rawDownLink') == null){GM_setValue('menu_rawDownLink', true)}; if (GM_getValue('menu_gitClone') == null){GM_setValue('menu_gitClone', true)}; registerMenuCommand(); // Register script menu function registerMenuCommand() { // If the feedback menu ID is not null , delete all script menus if (menu_feedBack_ID) {GM_unregisterMenuCommand(menu_rawFast_ID); GM_unregisterMenuCommand(menu_rawDownLink_ID); GM_unregisterMenuCommand(menu_gitClone_ID); GM_unregisterMenuCommand(menu_feedBack_ID); menu_rawFast = GM_getValue('xiu2_menu_raw_fast');} // Avoid error reporting when the data stored by the user is larger than the array after reducing the raw array if (menu_rawFast > raw_url.length - 1) menu_rawFast = 0 if (GM_getValue('menu_rawDownLink')) menu_rawFast_ID = GM_registerMenuCommand(`${['0️ ⃣ ' ,'1️ ⃣ ','2️ ⃣ ','3️ ⃣ ','4️ ⃣ ','5️ ⃣ ','6️ ⃣ ','7️ ⃣ ','8️ ⃣ ','9️ ⃣ ',' 🔟 '][menu_rawFast]} [ ${raw_url[menu_rawFast][1]} ] acceleration source ( ☁ ) - click to switch` , menu_toggle_raw_fast); menu_rawDownLink_ID = GM_registerMenuCommand(`${GM_getValue('menu_rawDownLink')?' ✅ ':' ❌ '} Project list single file quick download ( ☁ )`, function(){if (GM_getValue('menu_rawDownLink') == true) {GM_setValue('menu_rawDownLink', false); GM_notification({text: `The [ Project list single file quick download ( ☁ )] function has been closed \n ( Click to refresh the page to take effect) `, timeout: 3500, onclick: function(){location.reload();}});} else {GM_setValue('menu_rawDownLink', true); GM_notification({text: `The [ Project list single file quick download ( ☁ )] function has been opened \n ( Click to refresh the page to take effect) `, timeout: 3500, onclick: function(){location.reload();}});}registerMenuCommand();}); menu_gitClone_ID = GM_registerMenuCommand(`${GM_getValue('menu_gitClone')?' ✅ ':' ❌ '} Add git clone command` , function(){if (GM_getValue('menu_gitClone') == true) {GM_setValue('menu_gitClone', false); GM_notification({text: ` The [ Add git clone command ] function has been turned off \n ( Click to refresh the page to take effect) `, timeout: 3500, onclick: function(){location.reload();}});} else {GM_setValue('menu_gitClone', true); GM_notification({text: `The [ Add git clone command ] function has been turned on \n ( Click to refresh the page to take effect) `, timeout: 3500, onclick: function(){location.reload();}});}registerMenuCommand();}); menu_feedBack_ID = GM_registerMenuCommand(' 💬 Feedback & Suggestions [Github]', function () {window.GM_openInTab('https://github.com/XIU2/UserScript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/412245/feedback', {active: true,insert: true,setParent: true});}); } // Switch the acceleration source function menu_toggle_raw_fast() { // If the current acceleration source position is greater than or equal to the total number of acceleration sources, change to the first acceleration source, otherwise increment the next acceleration source if (menu_rawFast >= raw_url.length - 1) {menu_rawFast = 0;} else {menu_rawFast += 1;} GM_setValue('xiu2_menu_raw_fast', menu_rawFast); delRawDownLink(); // Delete the old acceleration source addRawDownLink(); // Add a new acceleration source GM_notification({text: " The acceleration source has been switched to: " + raw_url[menu_rawFast][1], timeout: 3000}); // Prompt message registerMenuCommand(); // Re-register script menu }; colorMode(); // Adapt to daytime / nighttime theme mode setTimeout(addRawFile, 1000); // Raw acceleration setTimeout(addRawDownLink, 2000); // Quick download of a single Raw file ( ☁ ), delay execution by 2 seconds to avoid being deleted by pjax // The onurlchange event grant added in Tampermonkey v4.11 can monitor URL changes of pjax and other web pages if (window.onurlchange === undefined) addUrlChangeEvent(); window.addEventListener('urlchange', function() { colorMode(); // Adapt to daytime / nighttime theme mode if (location.pathname.indexOf('/releases')) addRelease(); // Release acceleration setTimeout(addRawFile, 1000); // Raw acceleration setTimeout(addRawDownLink, 2000); // Quick download of a single Raw file ( ☁ ), delay execution by 2 seconds to avoid being deleted by pjax setTimeout(addRawDownLink_, 1000); // Re-add the Raw download link ( ☁ ) mouse event when the browser goes back / forward }); // Github Git Clone/SSH , Release , Download ZIP are changed to dynamically load file lists, so it is necessary to monitor changes in web page elements const callback = (mutationsList, observer) => { if (location.pathname.indexOf('/releases') > -1) { // Release for (const mutation of mutationsList) { for (const target of mutation.addedNodes) { if (target.nodeType !== 1) return if (target.tagName === 'DIV' && target.dataset.viewComponent === 'true' && target.classList[0] === 'Box') addRelease(); } } } else if (document.querySelector('#repository-container-header:not([hidden])')) { // Project Home for (const mutation of mutationsList) { for (const target of mutation.addedNodes) { if (target.nodeType !== 1) return if (target.tagName === 'DIV' && target.parentElement.id === '__primerPortalRoot__') { addDownloadZIP(target); addGitClone(target); addGitCloneSSH(target); } else if (target.tagName === 'DIV' && target.className.indexOf('Box-sc-') != -1) { if (target.querySelector('input[value^="https:"]')) { addGitCloneClear('.XIU2-GCS'); addGitClone(target); } else if (target.querySelector('input[value^="git@"]')) { addGitCloneClear('.XIU2-GC'); addGitCloneSSH(target); } else if (target.querySelector('input[value^="gh "]')) { addGitCloneClear('.XIU2-GC, .XIU2-GCS'); } } } } } }; const observer = new MutationObserver(callback); observer.observe(document, { childList: true, subtree: true }); // download_url randomly selects 4 US acceleration sources function get_New_download_url() { //return download_url_us.concat(download_url) // full output for debugging let shuffled = download_url_us.slice(0), i = download_url_us.length, min = i - 4, temp, index; while (i-- > min) {index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp;} return shuffled.slice(min).concat(download_url); // Randomly shuffle the download_url_us array and take the first 4 , then merge them into the download_url array } // Release function addRelease() { let html = document.querySelectorAll('.Box-footer'); if (html.length == 0 || location.pathname.indexOf('/releases') == -1) return let divDisplay = 'margin-left: -90px;', new_download_url = get_New_download_url(); if (document.documentElement.clientWidth > 755) {divDisplay = 'margin-top: -3px;margin-left: 8px;display: inherit;';}; // Adjust the style for small screen for (const current of html) { if (current.querySelector('.XIU2-RS')) continue current.querySelectorAll('li.Box-row a').forEach(function (_this) { let href = _this.href.split(location.host), url = '', _html = `<div class="XIU2-RS" style="${divDisplay}">`; for (let i=0;i<new_download_url.length;i++) { if (new_download_url[i][3] !== undefined && url.indexOf('/archive/') !== -1) { url = new_download_url[i][3] + href[1] } else { url = new_download_url[i][0] + href[1] } _html += `<a style="${style[0]}" class="btn" href="${url}" title="${new_download_url[i][2]}" rel="noreferrer noopener nofollow">${new_download_url[i][1]}</a>` } _this.parentElement.nextElementSibling.insertAdjacentHTML('beforeend', _html + '</div>'); }); } } // Download ZIP function addDownloadZIP(target) { let html = target.querySelector('ul[class^=List__ListBox-sc-] ul[class^=List__ListBox-sc-]>li:last-child');if (!html) return let href_script = document.querySelector('react-partial[partial-name=repos-overview]>script[data-target="react-partial.embeddedData"]'), href_slice = href_script.textContent.slice(href_script.textContent.indexOf('"zipballUrl":"')+14), href = href_slice.slice(0, href_slice.indexOf('"')), url = '', _html = '', new_download_url = get_New_download_url(); // Clone the original Download ZIP element and locate the <a> <span> tags let html_clone = html.cloneNode(true), html_clone_a = html_clone.querySelector('a[href$=".zip"]'), html_clone_span = html_clone.querySelector('span[id]'); for (let i=0;i<new_download_url.length;i++) { if (new_download_url[i][3] === '') continue if (new_download_url[i][3] !== undefined) { url = new_download_url[i][3] + href } else { url = new_download_url[i][0] + href } html_clone_a.href = url html_clone_a.setAttribute('title', new_download_url[i][2].replaceAll(' ','\n')) html_clone_span.textContent = 'Download ZIP ' + new_download_url[i][1] _html += html_clone.outerHTML } html.insertAdjacentHTML('afterend', _html); } // Git Clone Switch Cleanup function addGitCloneClear(css) { document.querySelectorAll(css).forEach((e)=>{e.remove()}) } // Git Clone function addGitClone(target) { let html = target.querySelector('input[value^="https:"]');if (!html) return let href_split = html.value.split(location.host)[1], html_parent = '<div style="margin-top: 4px;" class="XIU2-GC ' + html.parentElement.className + '">', url = '', _html = '', _gitClone = ''; html.nextElementSibling.hidden = true; // Hide the copy button on the right (considering that you can click to copy directly, the copy button event will not be implemented repeatedly) if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.value = _gitClone + html.value; html.setAttribute('value', html.value);} // Clone the original Git Clone element let html_clone = html.cloneNode(true); for (let i=0;i<clone_url.length;i++) { if (clone_url[i][0] === 'https://gitclone.com') { url = clone_url[i][0] + '/github.com' + href_split } else { url = clone_url[i][0] + href_split } html_clone.title = `${url}\n\n${clone_url[i][2].replaceAll(' ','\n')}\n\nTip: Click on the text to copy it directly` html_clone.setAttribute('value', _gitClone + url) _html += html_parent + html_clone.outerHTML + '</div>' } html.parentElement.insertAdjacentHTML('afterend', _html); } // Git Clone SSH function addGitCloneSSH(target) { let html = target.querySelector('input[value^="git@"]');if (!html) return let href_split = html.value.split(':')[1], html_parent = '<div style="margin-top: 4px;" class="XIU2-GCS ' + html.parentElement.className + '">', url = '', _html = '', _gitClone = ''; html.nextElementSibling.hidden = true; // Hide the copy button on the right (considering that you can click to copy directly, the copy button event will not be implemented repeatedly) if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.value = _gitClone + html.value; html.setAttribute('value', html.value);} // Clone the original Git Clone SSH element let html_clone = html.cloneNode(true); for (let i=0;i<clone_ssh_url.length;i++) { url = clone_ssh_url[i][0] + href_split html_clone.title = `${url}\n\n${clone_ssh_url[i][2].replaceAll(' ','\n')}\n\nTip: Click on the text to copy it directly` html_clone.setAttribute('value', _gitClone + url) _html += html_parent + html_clone.outerHTML + '</div>' } html.parentElement.insertAdjacentHTML('afterend', _html); } // Raw function addRawFile() { let html = document.querySelector('a[data-testid="raw-button"]');if (!html) return let href = location.href.replace(`https://${location.host}`,''), href2 = href.replace('/blob/','/'), url = '', _html = ''; for (let i=1;i<raw_url.length;i++) { if ((raw_url[i][0].indexOf('/gh') + 3 === raw_url[i][0].length) && raw_url[i][0].indexOf('cdn.staticaly.com') === -1) { url = raw_url[i][0] + href.replace('/blob/','@'); } else { url = raw_url[i][0] + href2; } _html += `<a href="${url}" title="${raw_url[i][2]}" target="_blank" role="button" rel="noreferrer noopener nofollow" data-size="small" class="${html.className} XIU2-RF">${raw_url[i][1].replace(/ \d/,'')}</a>` } if (document.querySelector('.XIU2-RF')) document.querySelectorAll('.XIU2-RF').forEach((e)=>{e.remove()}) html.insertAdjacentHTML('afterend', _html); } // Raw single file quick download (☁) function addRawDownLink() { if (!GM_getValue('menu_rawDownLink')) return // If it is not a project file page, return; if the webpage has a Raw download link ( ☁ ), return let files = document.querySelectorAll('div.Box-row svg.octicon.octicon-file, .react-directory-filename-column>svg.color-fg-muted');if(files.length === 0) return;if (location.pathname.indexOf('/tags') > -1) return let files1 = document.querySelectorAll('a.fileDownLink');if(files1.length > 0) return; // Display when the mouse is pointing var mouseOverHandler = function(evt) { let elem = evt.currentTarget, aElm_new = elem.querySelectorAll('.fileDownLink'), aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted'); aElm_new.forEach(el=>{el.style.cssText = 'display: inline'}); aElm_now.forEach(el=>{el.style.cssText = 'display: none'}); }; // Hide when mouse leaves var mouseOutHandler = function(evt) { let elem = evt.currentTarget, aElm_new = elem.querySelectorAll('.fileDownLink'), aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted'); aElm_new.forEach(el=>{el.style.cssText = 'display: none'}); aElm_now.forEach(el=>{el.style.cssText = 'display: inline'}); }; // Loop Add files.forEach(function(fileElm) { let trElm = fileElm.parentNode.parentNode, cntElm_a = trElm.querySelector('[role="rowheader"] > .css-truncate.css-truncate-target.d-block.width-fit > a, .react-directory-truncate>a'), Name = cntElm_a.innerText, href = cntElm_a.getAttribute('href'), href2 = href.replace('/blob/','/'), url = ''; if ((raw_url[menu_rawFast][0].indexOf('/gh') + 3 === raw_url[menu_rawFast][0].length) && raw_url[menu_rawFast][0].indexOf('cdn.staticaly.com') === -1) { url = raw_url[menu_rawFast][0] + href.replace('/blob/','@'); } else { url = raw_url[menu_rawFast][0] + href2; } fileElm.insertAdjacentHTML('afterend', ` <a href="${url}" download="${Name}" target="_blank" rel="noreferrer noopener nofollow" class="fileDownLink" style="display: none;" title=" 「 ${raw_url[menu_rawFast][1]} 」 [Alt + left button] or [right button - Save as...] to download the file. Note: click the [ ☁ ] icon with your mouse, not the file name on the left! ${raw_url[menu_rawFast][2]} Tip: Click the Tampermonkey extension icon - [ ${raw_url[menu_rawFast][1]} ] acceleration source ( ☁ ) in the upper right corner of the browser to switch. "> ${svg[0]}</a>`); // Bind mouse events trElm.onmouseover = mouseOverHandler; trElm.onmouseout = mouseOutHandler; }); } // Remove Raw single file quick download ( ☁ ) function delRawDownLink() { if (!GM_getValue('menu_rawDownLink')) return let aElm = document.querySelectorAll('.fileDownLink');if(aElm.length === 0) return; aElm.forEach(function(fileElm) {fileElm.remove();}) } // Re-add the Raw single file quick download ( ☁ ) mouse event when the browser returns / forwards function addRawDownLink_() { if (!GM_getValue('menu_rawDownLink')) return // If it is not a project file page, return; if the webpage does not have a Raw download link ( ☁ ), return let files = document.querySelectorAll('div.Box-row svg.octicon.octicon-file, .react-directory-filename-column>svg.color-fg-muted');if(files.length === 0) return; let files1 = document.querySelectorAll('a.fileDownLink');if(files1.length === 0) return; // Display when the mouse is pointing var mouseOverHandler = function(evt) { let elem = evt.currentTarget, aElm_new = elem.querySelectorAll('.fileDownLink'), aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted'); aElm_new.forEach(el=>{el.style.cssText = 'display: inline'}); aElm_now.forEach(el=>{el.style.cssText = 'display: none'}); }; // Hide when mouse leaves var mouseOutHandler = function(evt) { let elem = evt.currentTarget, aElm_new = elem.querySelectorAll('.fileDownLink'), aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted'); aElm_new.forEach(el=>{el.style.cssText = 'display: none'}); aElm_now.forEach(el=>{el.style.cssText = 'display: inline'}); }; // Loop Add files.forEach(function(fileElm) { let trElm = fileElm.parentNode.parentNode; // Binding Mouse Events trElm.onmouseover = mouseOverHandler; trElm.onmouseout = mouseOutHandler; }); } // Adapt to daytime / nighttime theme mode function colorMode() { let style_Add; if (document.getElementById('XIU2-Github')) {style_Add = document.getElementById('XIU2-Github')} else {style_Add = document.createElement('style'); style_Add.id = 'XIU2-Github'; style_Add.type = 'text/css';} backColor = '#ffffff'; fontColor = '#888888'; if (document.lastElementChild.dataset.colorMode === 'dark') { // If it is night mode if (document.lastElementChild.dataset.darkTheme === 'dark_dimmed') { backColor = '#272e37'; fontColor = '#768390'; } else { backColor = '#161a21'; fontColor = '#97a0aa'; } } else if (document.lastElementChild.dataset.colorMode === 'auto') { // If it is automatic mode if (window.matchMedia('(prefers-color-scheme: dark)').matches || document.lastElementChild.dataset.lightTheme.indexOf('dark') > -1) { // If the browser is in night mode or Day mode is dark if (document.lastElementChild.dataset.darkTheme === 'dark_dimmed') { backColor = '#272e37'; fontColor = '#768390'; } else if (document.lastElementChild.dataset.darkTheme.indexOf('light') == -1) { // Exclude the case where night mode is light backColor = '#161a21'; fontColor = '#97a0aa'; } } } document.lastElementChild.appendChild(style_Add).textContent = `.XIU2-RS a {--XIU2-back-Color: ${backColor}; --XIU2-font-Color: ${fontColor};}`; } // Custom urlchange event (used to monitor URL changes) for non- Tampermonkey managers function addUrlChangeEvent() { history.pushState = ( f => function pushState(){ var ret = f.apply(this, arguments); window.dispatchEvent(new Event('pushstate')); window.dispatchEvent(new Event('urlchange')); return ret; })(history.pushState); history.replaceState = ( f => function replaceState(){ var ret = f.apply(this, arguments); window.dispatchEvent(new Event('replacestate')); window.dispatchEvent(new Event('urlchange')); return ret; })(history.replaceState); window.addEventListener('popstate',()=>{ // Trigger the urlchange event when clicking the browser's forward / back button window.dispatchEvent(new Event('urlchange')) }); } })();