Add support for 20+ platforms and UI overhaul
Expanded download acceleration support to over 20 platforms including npm, PyPI, Maven, RubyGems, CRAN, SourceForge, arXiv, F-Droid, and more. Refactored platform configuration into a dedicated file, updated content/background scripts for broader detection and redirection, and redesigned the popup UI for categorized platform toggles. Updated manifest, package metadata, and documentation to reflect the new capabilities and version 2.0.0.
This commit is contained in:
1 parent
d37b67c320
commit
09e87db44a
9 files changed
+995
-136
No files matched your search
+181
-12
@@ -1,33 +1,202 @@
|
||||
// 与 worker.js 匹配的平台配置
|
||||
// 平台配置
|
||||
const PLATFORMS = {
|
||||
// 代码托管平台
|
||||
gh: {
|
||||
base: "https://github.com",
|
||||
name: "GitHub",
|
||||
transform: (path) => path.replace(/^\/gh\//, "/"),
|
||||
pattern: /^https:\/\/github\.com\//,
|
||||
},
|
||||
gl: {
|
||||
base: "https://gitlab.com",
|
||||
name: "GitLab",
|
||||
transform: (path) => path.replace(/^\/gl\//, "/"),
|
||||
pattern: /^https:\/\/gitlab\.com\//,
|
||||
},
|
||||
gitea: {
|
||||
base: "https://gitea.com",
|
||||
name: "Gitea",
|
||||
pattern: /^https:\/\/gitea\.com\//,
|
||||
},
|
||||
codeberg: {
|
||||
base: "https://codeberg.org",
|
||||
name: "Codeberg",
|
||||
pattern: /^https:\/\/codeberg\.org\//,
|
||||
},
|
||||
sf: {
|
||||
base: "https://sourceforge.net",
|
||||
name: "SourceForge",
|
||||
pattern: /^https:\/\/sourceforge\.net\//,
|
||||
},
|
||||
aosp: {
|
||||
base: "https://android.googlesource.com",
|
||||
name: "AOSP",
|
||||
pattern: /^https:\/\/android\.googlesource\.com\//,
|
||||
},
|
||||
|
||||
// AI/ML 平台
|
||||
hf: {
|
||||
base: "https://huggingface.co",
|
||||
name: "Hugging Face",
|
||||
transform: (path) => path.replace(/^\/hf\//, "/"),
|
||||
pattern: /^https:\/\/huggingface\.co\//,
|
||||
},
|
||||
|
||||
// 包管理平台
|
||||
npm: {
|
||||
base: "https://registry.npmjs.org",
|
||||
name: "npm",
|
||||
pattern: /^https:\/\/registry\.npmjs\.org\//,
|
||||
},
|
||||
pypi: {
|
||||
base: "https://pypi.org",
|
||||
name: "PyPI",
|
||||
pattern: /^https:\/\/pypi\.org\//,
|
||||
},
|
||||
"pypi-files": {
|
||||
base: "https://files.pythonhosted.org",
|
||||
name: "PyPI Files",
|
||||
pattern: /^https:\/\/files\.pythonhosted\.org\//,
|
||||
},
|
||||
conda: {
|
||||
base: "https://repo.anaconda.com",
|
||||
name: "Conda",
|
||||
pattern: /^https:\/\/repo\.anaconda\.com\//,
|
||||
},
|
||||
"conda-community": {
|
||||
base: "https://conda.anaconda.org",
|
||||
name: "Conda Community",
|
||||
pattern: /^https:\/\/conda\.anaconda\.org\//,
|
||||
},
|
||||
maven: {
|
||||
base: "https://repo1.maven.org",
|
||||
name: "Maven",
|
||||
pattern: /^https:\/\/repo1\.maven\.org\//,
|
||||
},
|
||||
apache: {
|
||||
base: "https://downloads.apache.org",
|
||||
name: "Apache",
|
||||
pattern: /^https:\/\/downloads\.apache\.org\//,
|
||||
},
|
||||
gradle: {
|
||||
base: "https://plugins.gradle.org",
|
||||
name: "Gradle",
|
||||
pattern: /^https:\/\/plugins\.gradle\.org\//,
|
||||
},
|
||||
rubygems: {
|
||||
base: "https://rubygems.org",
|
||||
name: "RubyGems",
|
||||
pattern: /^https:\/\/rubygems\.org\//,
|
||||
},
|
||||
cran: {
|
||||
base: "https://cran.r-project.org",
|
||||
name: "CRAN",
|
||||
pattern: /^https:\/\/cran\.r-project\.org\//,
|
||||
},
|
||||
cpan: {
|
||||
base: "https://www.cpan.org",
|
||||
name: "CPAN",
|
||||
pattern: /^https:\/\/www\.cpan\.org\//,
|
||||
},
|
||||
ctan: {
|
||||
base: "https://tug.ctan.org",
|
||||
name: "CTAN",
|
||||
pattern: /^https:\/\/tug\.ctan\.org\//,
|
||||
},
|
||||
golang: {
|
||||
base: "https://proxy.golang.org",
|
||||
name: "Go Modules",
|
||||
pattern: /^https:\/\/proxy\.golang\.org\//,
|
||||
},
|
||||
nuget: {
|
||||
base: "https://api.nuget.org",
|
||||
name: "NuGet",
|
||||
pattern: /^https:\/\/api\.nuget\.org\//,
|
||||
},
|
||||
crates: {
|
||||
base: "https://crates.io",
|
||||
name: "Crates.io",
|
||||
pattern: /^https:\/\/crates\.io\//,
|
||||
},
|
||||
packagist: {
|
||||
base: "https://repo.packagist.org",
|
||||
name: "Packagist",
|
||||
pattern: /^https:\/\/repo\.packagist\.org\//,
|
||||
},
|
||||
|
||||
// 其他平台
|
||||
arxiv: {
|
||||
base: "https://arxiv.org",
|
||||
name: "arXiv",
|
||||
pattern: /^https:\/\/arxiv\.org\//,
|
||||
},
|
||||
fdroid: {
|
||||
base: "https://f-droid.org",
|
||||
name: "F-Droid",
|
||||
pattern: /^https:\/\/f-droid\.org\//,
|
||||
},
|
||||
};
|
||||
|
||||
// 默认设置
|
||||
// 转换URL为Xget格式
|
||||
function transformUrl(url, xgetDomain, enabledPlatforms) {
|
||||
try {
|
||||
const platform = detectPlatform(url);
|
||||
if (!platform || !enabledPlatforms[platform]) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const urlObj = new URL(url);
|
||||
const path = urlObj.pathname + urlObj.search + urlObj.hash;
|
||||
|
||||
return `https://${xgetDomain}/${platform}${path}`;
|
||||
} catch (error) {
|
||||
console.error("转换 URL 时出错:", error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 检测平台
|
||||
function detectPlatform(url) {
|
||||
for (const [key, platform] of Object.entries(PLATFORMS)) {
|
||||
if (platform.pattern.test(url)) {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
const DEFAULT_SETTINGS = {
|
||||
enabled: true,
|
||||
xgetDomain: "xget.xi-xu.me",
|
||||
enabledPlatforms: {
|
||||
// 代码托管平台
|
||||
gh: true,
|
||||
gl: true,
|
||||
gitea: true,
|
||||
codeberg: true,
|
||||
sf: true,
|
||||
aosp: true,
|
||||
|
||||
// AI/ML 平台
|
||||
hf: true,
|
||||
|
||||
// 包管理平台
|
||||
npm: true,
|
||||
pypi: true,
|
||||
"pypi-files": true,
|
||||
conda: true,
|
||||
"conda-community": true,
|
||||
maven: true,
|
||||
apache: true,
|
||||
gradle: true,
|
||||
rubygems: true,
|
||||
cran: true,
|
||||
cpan: true,
|
||||
ctan: true,
|
||||
golang: true,
|
||||
nuget: true,
|
||||
crates: true,
|
||||
packagist: true,
|
||||
|
||||
// 其他平台
|
||||
arxiv: true,
|
||||
fdroid: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -56,7 +225,11 @@ async function handleDownload(downloadItem, suggest) {
|
||||
}
|
||||
|
||||
const url = downloadItem.url;
|
||||
const redirectedUrl = transformUrl(url, settings);
|
||||
const redirectedUrl = transformUrl(
|
||||
url,
|
||||
settings.xgetDomain,
|
||||
settings.enabledPlatforms
|
||||
);
|
||||
|
||||
if (redirectedUrl && redirectedUrl !== url) {
|
||||
console.log("重定向下载:", url, "->", redirectedUrl);
|
||||
@@ -89,7 +262,7 @@ async function handleDownload(downloadItem, suggest) {
|
||||
}
|
||||
}
|
||||
|
||||
function transformUrl(url, settings) {
|
||||
function transformUrlLegacy(url, settings) {
|
||||
try {
|
||||
// 找到匹配的平台
|
||||
for (const [platformKey, platform] of Object.entries(PLATFORMS)) {
|
||||
@@ -122,11 +295,7 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||
// 通知相关标签页刷新
|
||||
try {
|
||||
const tabs = await chrome.tabs.query({
|
||||
url: [
|
||||
"https://github.com/*",
|
||||
"https://gitlab.com/*",
|
||||
"https://huggingface.co/*",
|
||||
],
|
||||
url: Object.values(PLATFORMS).map((platform) => platform.base + "/*"),
|
||||
});
|
||||
|
||||
for (const tab of tabs) {
|
||||
|
||||
Reference in new issue
Block a user