// ==UserScript==
// @name Github 镜像访问,加速下载
// @icon https://github.githubassets.com/favicon.ico
// @namespace https://github.com/jadezi/github-accelerator/
// @version 2.0.7
// @description GitHub 镜像,github 加速
// @author jadezi、wuyuehui
// @license GPL License
// @match *://github.com/*
// @require https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js
// @resource customStyles https://jadezi.coding.net/p/github-accelerator-css/d/github-accelerator-css/git/raw/master/index.css?download=false
// @grant GM_addStyle
// @grant GM_setClipboard
// @grant GM_getResourceText
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// @grant GM_openInTab
// ==/UserScript==
(function () {
const clone_url_list = [
{
name: '地址1',
url: 'https://hub.fastgit.xyz',
},
{
name: '地址2',
url: 'https://hub.0z.gs',
},
{
name: '地址3',
url: 'https://api.mtr.pub',
},
]
const download_url = [
'https://mirror.ghproxy.com',
'https://gh-proxy.du33169.workers.dev',
]
function init() {
initMirrorUrl()
isProjectUrl()
setTimeout(addDownload, 2000);
addRelease()
}
// Project页面不添加镜像面板
function isProjectUrl(){
const pathnameArr = window.location.pathname.split('/');
if(pathnameArr.length>3&&pathnameArr[3]=="projects"){
return
}else{
addPanel()
}
}
// 初始化镜像地址
function initMirrorUrl() {
const _clone_url_list = clone_url_list.map(mirrorItem => {
const [clone_url, quick_look_url] = joinCloneMirrorUrl(mirrorItem)
return {
clone_url,
quick_look_url,
}
})
console.log('%c [ _clone_url_list ]', 'font-size:13px; background:pink; color:#bf2c9f;', _clone_url_list)
GM_setValue('clone_url_list', _clone_url_list)
}
// 拼接克隆地址
const joinCloneMirrorUrl = (mirrorItem) => {
const { url } = mirrorItem
let commonUrl = ''
commonUrl += "git clone ";
commonUrl += url;
const pathnameArr = window.location.pathname.split('/');
let clone_url = commonUrl + '/' + pathnameArr[1] + '/' + pathnameArr[2] + '.git'
let quick_look_url = url + '/' + pathnameArr[1] + '/' + pathnameArr[2]
return [clone_url, quick_look_url]
}
// 初始化镜像面板
function addPanel() {
const clone_url_list = GM_getValue('clone_url_list')
// 镜像面板模板
const mirror_template = `
<div class="mirror-panel clearfix container-xl px-3 px-md-4 px-lg-5 mt-4">
<div class="mb-1">
<button class="btn btn-primary" type="button" id="mirror-btn">镜像网址</button>
</div>
<div class="collapse multi-collapse" id="collapse">
<div class="user-card user-card-body">
<div class="user-alert user-alert-warning" role="alert">clone、depth命令的插入可手动编辑代码关闭</div>
<div class="user-alert user-alert-danger" role="alert">镜像地址请不要登陆自己的账户,造成损失本人概不负责</div>
<!-- 插入克隆模板列表位置 -->
</div>
</div>
</div>
`
// 获取克隆地址模板
const get_clone_template = (mirrorItem, index) => {
const { clone_url, quick_look_url } = mirrorItem
return `
<div class="mb-3">
<div class="h5 mb-1">克隆地址${index + 1}</div>
<div class="input-group">
<input type="text" class="form-control input-monospace input color-bg-subtle" value="${clone_url}"
aria-label="${clone_url}">
<div class="input-group-button">
<clipboard-copy value="${clone_url}" aria-label="Copy to clipboard"
class="btn js-clipboard-copy ClipboardButton" data-copy-feedback="Copied!" role="button" style="border-left:0;border-radius:0">
复制
</clipboard-copy>
</div>
<div class="input-group-button">
<button class="btn quick_look" type="button" data-url="${quick_look_url}" data class="btn">快速浏览</button>
</div>
</div>
</div>
`
}
// 克隆模板数组
const clone_template_List = clone_url_list.map((mirrorItem, index) => {
return get_clone_template(mirrorItem, index)
})
$(".repository-content").prepend(mirror_template);
clone_template_List.forEach(template => {
$(".user-card-body").append(template);
});
// 隐藏面板
$("#mirror-btn").on("click", () => {
togglePanelVisible()
})
// 快速浏览
$(".quick_look").on("click", (e) => {
const quick_look_url = e.target.dataset.url
window.open(quick_look_url)
});
initPanelVisible()
}
// 初始化镜像面板状态,根据上一次状态显示
function initPanelVisible() {
const currentPanelVisible = GM_getValue('panelVisible')
if (currentPanelVisible === true) {
$("#collapse").show();
} else {
$("#collapse").hide();
}
}
// Download ZIP
function addDownload() {
const clone_url_list = GM_getValue('clone_url_list')
const get_download_template = (mirrorItem, index) => {
const { quick_look_url } = mirrorItem
let download_url = quick_look_url + "/archive/master.zip";
return `
<li class="Box-row Box-row--hover-gray p-3 mt-0">
<a class="d-flex flex-items-center color-fg-default text-bold no-underline" href=${download_url}>
Fast Download ZIP(下载地址${index + 1})
</a>
</li>
`
}
const download_template_list = clone_url_list.map((mirrorItem, index) => {
return get_download_template(mirrorItem, index)
})
download_template_list.forEach(template => {
$("#local-panel ul").append(template)
});
}
// Release
function addRelease() {
$(".Box .Box-footer").each(function () {
$(this).find("li.Box-row").each(function () {
const href = $(this).find("a")[0].href
const li_obj= $(this)
const download_url1 = `${download_url[0]}/${href}`
const download_url2 = `${download_url[1]}/${href}`
let download_template = `
<div class="mt-1" style="display: flex; float: right;position: relative;top: -10px;left: 10px;">
<a class="btn btn-sm mr-1" href="${download_url1}" rel="nofollow">快速下载1</a>
<a class="btn btn-sm" href="${download_url2}" rel="nofollow">快速下载2</a>
</div>
`
li_obj.children('span.float-right').before(download_template);
if(li_obj.children('span.float-right').length<1){
li_obj.children('a').before(download_template);
}
});
});
}
// 切换面板显示隐藏
function togglePanelVisible() {
const currentPanelVisible = GM_getValue('panelVisible')
if (currentPanelVisible === true) {
$("#collapse").hide();
} else {
$("#collapse").show();
}
GM_setValue('panelVisible', !currentPanelVisible)
}
//
function toggleDepthVisible() {
const currentDepthVisible = GM_getValue('depthVisible')
if (currentDepthVisible === true) {
$("#collapse").hide();
} else {
$("#collapse").show();
}
GM_setValue('depthVisible', !currentDepthVisible)
}
// 注册菜单
GM_registerMenuCommand(`【🧲开启 & 关闭 - depth】`, toggleDepthVisible)
GM_registerMenuCommand(`【🔔显示 & 隐藏 - 镜像信息面板】`, togglePanelVisible)
GM_registerMenuCommand(`【📢意见 & 反馈】`, () => { window.GM_openInTab('https://github.com/jadezi/github-accelerator/issues/new', { active: true, insert: true, setParent: true }); })
// 设置自定义样式
GM_addStyle(GM_getResourceText("customStyles"));
// 初始化
init()
})();