diff --git a/GithubEnhanced-High-Speed-Download.user.js b/GithubEnhanced-High-Speed-Download.user.js index 57d2c50..220b8c1 100644 --- a/GithubEnhanced-High-Speed-Download.user.js +++ b/GithubEnhanced-High-Speed-Download.user.js @@ -3,7 +3,7 @@ // @name:zh-CN Github 增强 - 高速下载 // @name:zh-TW Github 增強 - 高速下載 // @name:en Github Enhancement - High Speed Download -// @version 2.4.13 +// @version 2.5.0 // @author X.I.U // @description 高速下载 Git Clone/SSH、Release、Raw、Code(ZIP) 等文件 (基于公益加速)、项目列表单文件快捷下载 (☁)、添加 git clone 命令 // @description:zh-CN 高速下载 Git Clone/SSH、Release、Raw、Code(ZIP) 等文件 (基于公益加速)、项目列表单文件快捷下载 (☁) @@ -49,9 +49,9 @@ ['https://hub.gitmirror.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供'], //['https://cdn.githubjs.cf', '美国', '[美国 Cloudflare CDN]'], // 域名无解析 ['https://download.fgit.cf', '美国', '[美国 洛杉矶] - 该公益加速源由 [FastGit 群组成员] 提供'], + ['https://download.nuaa.cf', '美国', '[美国 洛杉矶] - 该公益加速源由 [LibraryCloud] 提供'], ['https://download.njuu.cf', '美国', '[美国 拉斯维加斯] - 该公益加速源由 [LibraryCloud] 提供'], - ['https://download.yzuu.cf', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [LibraryCloud] 提供'], - ['https://download.nuaa.cf', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [LibraryCloud] 提供'] + ['https://download.yzuu.cf', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [LibraryCloud] 提供'] ], download_url = [ //['https://download.fastgit.org', '德国', '[德国] - 该公益加速源由 [FastGit] 提供 提示:希望大家尽量多使用前面的美国节点(每次随机 4 个来负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~', 'https://archive.fastgit.org'], // 证书过期 ['https://mirror.ghproxy.com/https://github.com', '韩国', '[日本、韩国、德国等](CDN 不固定) - 该公益加速源由 [ghproxy] 提供 提示:希望大家尽量多使用前面的美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], @@ -63,13 +63,13 @@ ['https://mirror.ghproxy.com/https://github.com', '韩国', '[日本、韩国、德国等](CDN 不固定) - 该公益加速源由 [ghproxy] 提供 - 缓存:无(或时间很短)'], ['https://gh-proxy.com/https://github.com', '韩国', '[韩国] - 该公益加速源由 [ghproxy] 提供 - 缓存:无(或时间很短)'], ['https://ghproxy.net/https://github.com', '日本', '[日本 大阪] - 该公益加速源由 [ghproxy] 提供 - 缓存:无(或时间很短)'], - ['https://githubfast.com', '韩国', '[韩国] - 该公益加速源由 [Github Fast] 提供 - 缓存:无(或时间很短)'], + ['https://githubfast.com', '韩国', '[韩国] - 该公益加速源由 [Github Fast] 提供 - 缓存:无(或时间很短)'] //['https://slink.ltd/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [知了小站] 提供'] // 暂无必要 //['https://hub.gitmirror.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供'], // 暂无必要 - ['https://hub.fgit.cf', '美国', '[美国 洛杉矶] - 该公益加速源由 [FastGit 群组成员] 提供'], - ['https://hub.njuu.cf', '美国', '[美国 拉斯维加斯] - 该公益加速源由 [LibraryCloud] 提供'] + //['https://hub.fgit.cf', '美国', '[美国 洛杉矶] - 该公益加速源由 [FastGit 群组成员] 提供'], + //['https://hub.nuaa.cf', '美国', '[美国 洛杉矶] - 该公益加速源由 [LibraryCloud] 提供'], + //['https://hub.njuu.cf', '美国', '[美国 拉斯维加斯] - 该公益加速源由 [LibraryCloud] 提供'] //['https://hub.yzuu.cf', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [LibraryCloud] 提供'], // 暂无必要 - //['https://hub.nuaa.cf', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [LibraryCloud] 提供'] // 暂无必要 //['https://hub.0z.gs', '美国', '[美国 Cloudflare CDN]'], // 域名无解析 //['https://hub.shutcm.cf', '美国', '[美国 Cloudflare CDN]'] // 连接超时 ], clone_ssh_url = [ @@ -88,6 +88,7 @@ ['https://jsdelivr.b-cdn.net/gh', '其他 2', '[香港、台湾、日本、新加坡等](CDN 不固定) - 该公益加速源由 [rttwyjz] 提供 - 缓存:有'], // 500 ['https://github.moeyy.xyz/https://raw.githubusercontent.com', '其他 3', '[新加坡、香港、日本等](CDN 不固定) - 缓存:无(或时间很短)'], ['https://raw.fgit.cf', '美国', '[美国 洛杉矶] - 该公益加速源由 [FastGit 群组成员] 提供 - 缓存:无(或时间很短)'] + //['https://hub.nuaa.cf', '美国', '[美国 洛杉矶] - 该公益加速源由 [LibraryCloud] 提供'], //['https://raw.fastgit.org', '德国', '[德国] - 该公益加速源由 [FastGit] 提供 - 缓存:无(或时间很短)'], // 挂了 //['https://raw.njuu.cf', '美国', '[美国 拉斯维加斯] - 该公益加速源由 [LibraryCloud] 提供 - 缓存:无(或时间很短)'], // 暂无必要 //['https://raw.gitmirror.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供 - 缓存:有'], // 暂无必要 @@ -127,11 +128,7 @@ }; colorMode(); // 适配白天/夜间主题模式 - //if (location.pathname.indexOf('/releases')) addRelease(); // Release 加速 - setTimeout(addDownloadZIP, 2000); // Download ZIP 加速 - setTimeout(addGitClone, 2000); // Git Clone 加速 - setTimeout(addGitCloneSSH, 2000); // Git Clone SSH 加速 - if (GM_info.scriptHandler === 'Tampermonkey') {addRawFile();} else {setTimeout(addRawFile, 1000);} // Raw 加速 + setTimeout(addRawFile, 1000); // Raw 加速 setTimeout(addRawDownLink, 2000); // Raw 单文件快捷下载(☁),延迟 2 秒执行,避免被 pjax 刷掉 // Tampermonkey v4.11 版本添加的 onurlchange 事件 grant,可以监控 pjax 等网页的 URL 变化 @@ -139,22 +136,39 @@ window.addEventListener('urlchange', function() { colorMode(); // 适配白天/夜间主题模式 if (location.pathname.indexOf('/releases')) addRelease(); // Release 加速 - setTimeout(addDownloadZIP, 2000); // Download ZIP 加速 - setTimeout(addGitClone, 2000); // Git Clone 加速 - setTimeout(addGitCloneSSH, 2000); // Git Clone SSH 加速 - if (GM_info.scriptHandler === 'Tampermonkey') {addRawFile();} else {setTimeout(addRawFile, 1000);} // Raw 加速 + setTimeout(addRawFile, 1000); // Raw 加速 setTimeout(addRawDownLink, 2000); // Raw 单文件快捷下载(☁),延迟 2 秒执行,避免被 pjax 刷掉 setTimeout(addRawDownLink_, 1000); // 在浏览器返回/前进时重新添加 Raw 下载链接(☁)鼠标事件 }); - // Github Release 改版为动态加载文件列表,因此需要监控网页元素变化 + // Github Git Clone/SSH、Release、Download ZIP 改版为动态加载文件列表,因此需要监控网页元素变化 const callback = (mutationsList, observer) => { - if (location.pathname.indexOf('/releases') === -1) return - 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(); + 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])')) { // 项目首页 + 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'); + } + } + } } } }; @@ -197,67 +211,77 @@ // Download ZIP - function addDownloadZIP() { - if (document.querySelector('.XIU2-DZ')) return - let html = document.querySelector('#local-panel ul li:last-child');if (!html) return - let href = html.firstElementChild.href, + 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(); for (let i=0;i${svg[0]}Download ZIP ${new_download_url[i][1]}` + let html_outer = html.outerHTML.slice(0, html.outerHTML.indexOf('Download ZIP ${new_download_url[i][1]}` } html.insertAdjacentHTML('afterend', _html); } + // Git Clone 切换清理 + function addGitCloneClear(css) { + document.querySelectorAll(css).forEach((e)=>{e.remove()}) + } // Git Clone - function addGitClone() { - if (document.querySelector('.XIU2-GC')) return - let html = document.querySelector('[role="tabpanel"]:nth-child(2) div.input-group');if (!html) return - let href_split = html.firstElementChild.value.split(location.host), + function addGitClone(target) { + let html = target.querySelector('input[value^="https:"]');if (!html) return + let href_split = html.value.split(location.host)[1], + html_parent = '
', url = '', _html = '', _gitClone = ''; - - if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.firstElementChild.value = html.querySelector('clipboard-copy').value = _gitClone + html.firstElementChild.value;} + html.nextElementSibling.hidden = true; // 隐藏右侧复制按钮 + if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.value = _gitClone + html.value; html.setAttribute('value', html.value);} for (let i=0;i
${svg[1]}
` + let html_clone = html.cloneNode(true); + html_clone.title = `加速源:${clone_url[i][1]} (点击可直接复制)` + html_clone.setAttribute('value', url) + _html += html_parent + html_clone.outerHTML + '' } - html.insertAdjacentHTML('afterend', _html); + html.parentElement.insertAdjacentHTML('afterend', _html); } // Git Clone SSH - function addGitCloneSSH() { - if (document.querySelector('.XIU2-GCS')) return - let html = document.querySelector('[role="tabpanel"]:nth-child(3) div.input-group');if (!html) return - let href_split = html.firstElementChild.value.split(':'), - _html = '', _gitClone = ''; - - if (href_split[0] != 'git@github.com') return - - if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.firstElementChild.value = html.querySelector('clipboard-copy').value = _gitClone + html.firstElementChild.value;} + function addGitCloneSSH(target) { + let html = target.querySelector('input[value^="git@"]');if (!html) return + let href_split = html.value.split(':')[1], + html_parent = '
', + url = '', _html = '', _gitClone = ''; + html.nextElementSibling.hidden = true; // 隐藏右侧复制按钮 + if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.value = _gitClone + html.value; html.setAttribute('value', html.value);} for (let i=0;i
${svg[1]}
` + url = _gitClone + clone_ssh_url[i][0] + href_split + let html_clone = html.cloneNode(true); + html_clone.title = `加速源:${clone_ssh_url[i][1]} (点击可直接复制)` + html_clone.setAttribute('value', url) + _html += html_parent + html_clone.outerHTML + '' } - html.insertAdjacentHTML('afterend', _html); + html.parentElement.insertAdjacentHTML('afterend', _html); } // Raw function addRawFile() { - if (document.querySelector('.XIU2-RF')) document.querySelectorAll('.XIU2-RF').forEach((e)=>{e.remove()}) - let html = document.querySelector('#raw-url, a[data-testid="raw-button"]');if (!html) return + 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 = ''; @@ -270,6 +294,7 @@ } _html += `${raw_url[i][1].replace(/ \d/,'')}` } + if (document.querySelector('.XIU2-RF')) document.querySelectorAll('.XIU2-RF').forEach((e)=>{e.remove()}) html.insertAdjacentHTML('afterend', _html); }