// ==UserScript==
// @name Github 极速
// @version 0.0.0
// @author Lxtyr
// @description 高速下载 Clone、Release、Raw、Code(ZIP) 等文件、项目列表单文件快捷下载 (☁)
// @include *://github.com/*
// @include *://github*
// @include *://hub.fastgit.org/*
// @icon https://github.githubassets.com/favicon.ico
// @require https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js
// @license GPL-3.0 License
// @run-at document-end
// @namespace https://gf.qytechs.cn/scripts/412245
// ==/UserScript==
function log() {
console.log("=== [github-ultra] ===", ...arguments);
}
(function () {
("use strict");
var removeGithubDesktop = true;
var cloneUrl = [
"https://hub.fastgit.org/",
"https://gitclone.com/github.com/",
"https://github.com.cnpmjs.org/",
"https://g.ioiox.com/https://github.com/",
],
downloadUrl = [
["https://gh.con.sh/https://github.com", "美国"],
["https://gh.api.99988866.xyz/https://github.com", "美国"],
["https://download.fastgit.org", "日本东京"],
["https://pd.zwc365.com/seturl/https://github.com", "中国香港"],
["https://g.ioiox.com/https://github.com", "中国香港"],
["https://git.yumenaka.net/https://github.com", "美国洛杉矶"],
["https://github.wuyanzheshui.workers.dev", "CF加速 1"],
["https://github.rc1844.ml", "CF加速 2"],
],
mirrorUrl = [
["https://hub.fastgit.org/", "FastGit"],
["https://github.com.cnpmjs.org/", "Cnpmjs"],
["https://github.wuyanzheshui.workers.dev/", "CF加速 1"],
["https://github.rc1844.ml/", "CF加速 2"],
["https://github.bajins.com/", "Bajins"],
["https://cdn.jsdelivr.net/gh/", "jsDelivr"],
],
rawUrl = [
["https://cdn.jsdelivr.net/gh/", "中国国内", "@"],
["https://raw.fastgit.org", "中国香港", "/"],
[
"https://git.yumenaka.net/https://raw.githubusercontent.com",
"美国洛杉矶",
"/",
],
["https://github.bajins.com", "Bajins"],
["https://github.wuyanzheshui.workers.dev", "CF加速 1"],
["https://github.rc1844.ml", "CF加速 2"],
["https://cdn.staticaly.com/gh", "staticaly"],
],
svg = [
'<svg class="octicon octicon-file-zip mr-3" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M3.5 1.75a.25.25 0 01.25-.25h3a.75.75 0 000 1.5h.5a.75.75 0 000-1.5h2.086a.25.25 0 01.177.073l2.914 2.914a.25.25 0 01.073.177v8.586a.25.25 0 01-.25.25h-.5a.75.75 0 000 1.5h.5A1.75 1.75 0 0014 13.25V4.664c0-.464-.184-.909-.513-1.237L10.573.513A1.75 1.75 0 009.336 0H3.75A1.75 1.75 0 002 1.75v11.5c0 .649.353 1.214.874 1.515a.75.75 0 10.752-1.298.25.25 0 01-.126-.217V1.75zM8.75 3a.75.75 0 000 1.5h.5a.75.75 0 000-1.5h-.5zM6 5.25a.75.75 0 01.75-.75h.5a.75.75 0 010 1.5h-.5A.75.75 0 016 5.25zm2 1.5A.75.75 0 018.75 6h.5a.75.75 0 010 1.5h-.5A.75.75 0 018 6.75zm-1.25.75a.75.75 0 000 1.5h.5a.75.75 0 000-1.5h-.5zM8 9.75A.75.75 0 018.75 9h.5a.75.75 0 010 1.5h-.5A.75.75 0 018 9.75zm-.75.75a1.75 1.75 0 00-1.75 1.75v3c0 .414.336.75.75.75h2.5a.75.75 0 00.75-.75v-3a1.75 1.75 0 00-1.75-1.75h-.5zM7 12.25a.25.25 0 01.25-.25h.5a.25.25 0 01.25.25v2.25H7v-2.25z"></path></svg>',
'<svg class="octicon octicon-clippy" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></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: #ffffff;border-color: rgba(27, 31, 35, 0.1);font-size: 11px;color: #888888;",
];
var hrefs = location.href.split("/"),
namespace = hrefs[3] + "/" + hrefs[4];
addGitClone(); // Download ZIP/Code(ZIP) 加速
addDownloadZIP();
addMirror();
addRelease();
addRawFile();
document.addEventListener("pjax:success", function () {
// pjax 事件发生后
addGitClone(); // Download ZIP/Code(ZIP) 加速
addDownloadZIP();
addMirror();
addRelease();
addRawFile();
});
// Git Clone
function addGitClone() {
$("[role='tabpanel'] div.input-group")
.first()
.each(function () {
var url = cloneUrl.map(function (url) {
return url + namespace + ".git";
}),
html = url
.map(function (u) {
return `<div class="input-group" style="margin-top: 4px;"><input value="${u}" aria-label="${u}" type="text" class="form-control input-monospace input-sm bg-gray-light" data-autoselect="" readonly=""><div class="input-group-button"><clipboard-copy value="${u}" aria-label="Copy to clipboard" class="btn btn-sm" tabindex="0" role="button">${svg[1]}</clipboard-copy></div></div>`;
})
.concat("");
$(this).after(html);
});
}
// Download ZIP
function addDownloadZIP() {
if (removeGithubDesktop) {
$(".dropdown-menu.dropdown-menu-sw.p-0 ul li:first-child").remove();
}
var $link = $(".dropdown-menu.dropdown-menu-sw.p-0 ul li:last-child");
var href = $link.children("a").attr("href"),
html = downloadUrl
.map(function (set) {
return `<li class="Box-row Box-row--hover-gray p-0"><a class="d-flex flex-items-center text-gray-dark text-bold no-underline p-3" rel="noreferrer noopener nofollow" href="${
set[0] + href
}">${svg[0]}Download ZIP (${set[1]})</a></li>`;
})
.join("");
$link.after(html);
}
function addMirror() {
var start = `<details class="details-overlay details-reset position-relative d-block">
<summary role="button" type="button" class="btn ml-2">
<span class="d-none d-md-flex flex-items-center">
镜像浏览
<span class="dropdown-caret ml-1"></span>
</span>
<span class="d-inline-block d-md-none">
<svg aria-label="More options" class="octicon octicon-kebab-horizontal" height="16" viewBox="0 0 16 16" version="1.1" width="16" role="img"><path d="M8 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM1.5 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm13 0a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path></svg>
</span>
</summary>
<div>
<ul class="dropdown-menu dropdown-menu-sw">
`;
mirrorUrl.forEach((element, idx) => {
if (idx < 5) {
start += `<li><a href="${
element[0] + namespace
}" class="dropdown-item">镜像浏览(${element[1]})</a></li>`;
}
});
if (
hrefs.length == 5 ||
namespace.includes("/tree/") ||
namespace.includes("/blob/")
) {
var Html =
mirrorUrl[5][0] +
namespace.replace("/tree/", "@").replace("/blob/", "@");
if (!namespace.includes("/blob/")) {
Html += "/";
}
start += `<li><a href="${Html}" class="dropdown-item">镜像浏览(${mirrorUrl[5][1]})</a></li>`;
}
if (location.hostname != "github.com") {
start += `<li><a href="https://github.com/${namespace}" class="dropdown-item">返回GitHub</a></li>`;
}
start += "</ul></div></details>";
$(".file-navigation").append($(start));
}
// Release
function addRelease() {
var addBtn = function () {
var href = $(this).attr("href"),
html = `<div style="display: flex;justify-content: flex-end;">
${downloadUrl
.map(function (u) {
return `<div><a style="${
style[0]
}" class="btn" href="${u[0] + href}" rel="noreferrer noopener nofollow">${u[1]}</a></div>`;
})
.join("")}
</div>`;
if ($(this).next().length > 0) {
$(this).next().after(html);
} else {
$(this).after(html);
}
};
$(".Box.Box--condensed").each(function () {
$(this).find(".d-flex.Box-body>a").each(addBtn);
$(this)
.find(".d-block.Box-body")
.css({
"justify-content": "space-between",
})
.removeClass("d-block")
.addClass("d-flex")
.children("a")
.each(addBtn);
// 修改[文件大小]元素样式
$("small.pl-2.text-gray.flex-shrink-0").css({
display: "flex",
"justify-content": "flex-end",
"flex-grow": 1,
"margin-right": "8px",
});
});
}
// Raw
function addRawFile() {
$("#raw-url").each(function () {
var href = $(this).attr("href").replace("https://github.com", "");
var html = rawUrl
.map(function (u) {
var url;
if (u[2]) {
url = u[0] + href.replace("/raw/", u[2]);
} else {
url = u[0] + href;
}
return `<a href="${url}" title="${u[1]}" role="button" rel="noreferrer noopener nofollow" class="btn btn-sm BtnGroup-item">${u[1]}</a>`;
})
.join("");
$(this).after(html);
});
}
})();