ಯೋಜನೆಯ ವಿಳಾಸ: fthux/GitZipPro.
上一个 ವಿಶ್ಲೇಷಣೆ了 content.js GitHub ಪುಟವನ್ನು ಹೇಗೆ ನಮೂದಿಸುವುದು, ಫೈಲ್ ಪಟ್ಟಿಯನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುವುದು ಮತ್ತು ಆಯ್ಕೆಮಾಡಿದ ಐಟಂಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು ಹೇಗೆ selectedItems 传经下载器。 ಇದು selectedItems 里电影的GitHub ಫೈಲ್ ಅಥವಾ ಡೈರೆಕ್ಟರಿ ಲಿಂಕ್.
ಈ ಲೇಖನದ ಆರಂಭದಿಂದ, ಮೂಲ ಕೋಡ್ ನಾಯಕನಾಗುತ್ತಾನೆ source/downloader.js.
downloader.js 名半段可以分成两半:前半段电影电影“今轑下上号电影。本篇先讲前半段
ಡೌನ್ಲೋಡರ್ನ ಇನ್ಪುಟ್
在 content.js 中,电影长了体了了 Map 里:
selectedItems.set(row, getPathFromRow(row));
ಅಂದರೆ, ಡೌನ್ಲೋಡ್ ಮಾಡಲಾದ ವಸ್ತುವು ಈಗಾಗಲೇ ರಚನೆಯಾಗಿರುವ ಏಕೈಕ ವಸ್ತುವಲ್ಲ, ಆದರೆ GitHub hrefs ಗುಂಪು: ಉದಾಹರಣೆಗಳು
/fthux/GitZipPro/tree/main/source
/fthux/GitZipPro/blob/main/README.md
下载器第一步要做了的, 抯把这些设计技术技术技术最好API ವಿನಂತಿ
{
owner,
repo,
branch,
path,
type: 'file' | 'dir'
}
ಅನುಗುಣವಾದ ಕಾರ್ಯವಾಗಿದೆ parseGitHubUrl().
parseGitHubUrl: 从GitHub ಲಿಂಕ್ 中电影 ಡೌನ್ಲೋಡ್ ಗುರಿ
parseGitHubUrl(href) ಮೊದಲು, ಪ್ರಮಾಣಿತ href URL:
url = new URL(href, 'https://github.com');
ಇಲ್ಲಿ ಎರಡನೇ ನಿಯತಾಂಕವು ಪ್ರಮುಖವಾಗಿದೆ. ಏಕೆಂದರೆ GitHub ಪುಟ DOM ನಿಂದ ಪಡೆದ href ಸಂಪೂರ್ಣ URL ಆಗಿರಬಹುದು, ಇದು ಕೇವಲ ಸಂಬಂಧಿತ ಮಾರ್ಗವಾಗಿರಬಹುದು. new URL(href, 'https://github.com') ನೀವು ಈ ಎರಡು ಸಂದರ್ಭಗಳನ್ನು ಏಕೀಕರಿಸಬಹುದು.
下载电视会会ಆನಿಮೇಟರ್ ನಿರ್ಬಂಧ:
if (url.hostname !== 'github.com') return null;
ಇದು GitHub ಲಿಂಕ್ಗಳನ್ನು ಮಾತ್ರ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಖಾತರಿಪಡಿಸುತ್ತದೆ.
ನಂತರ ಮಾರ್ಗದ ಹೆಸರನ್ನು ಹೊಂದಿಸಿ:
const parts = url.pathname.replace(/^\//, '').split('/').filter(Boolean);
ವಿಶಿಷ್ಟವಾದ ಫೈಲ್ ಮಾರ್ಗವು ಹೀಗಾಗುತ್ತದೆ:
fthux/GitZipPro/blob/main/README.md
ತೆರೆದ ನಂತರ:
parts[0] = owner
parts[1] = repo
parts[2] = blob 或 tree
parts[3] = branch
parts[4...] = path
ಮೂರನೇ ಹಂತವಾಗಿದ್ದರೆ tree,设计设计设计;ಮೂರನೇ ವ್ಯಕ್ತಿ 段是 blobಈ ವಿವರಣೆಯು ಡಾಕ್ಯುಮೆಂಟ್ ಆಗಿದೆ. ಕೋಡ್ ಅನ್ನು ಅಂತಿಮವಾಗಿ ಹಿಂತಿರುಗಿಸಲಾಗಿದೆ:
return { owner, repo, branch, path, type: 'dir' };
ಅಥವಾ:
return { owner, repo, branch, path, type: 'file' };
ಈ ಕಾರ್ಯವು ಡೌನ್ಲೋಡ್ ಮಾಡಬಹುದಾದ ಪ್ರವೇಶ ಪರಿವರ್ತಕವಾಗಿದೆ
ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ ಮತ್ತು ಓದಿ
ಡೌನ್ಲೋಡ್ ಪ್ರವೇಶ start(selectedItems, callbacks) ಮೊದಲಿಗೆ, ಕರೆ ಮಾಡಿ getSettings()。 ಈ ಕಾರ್ಯವು chrome.storage.local ಡೌನ್ಲೋಡ್ ಸಂಬಂಧಿತ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಿ
chrome.storage.local.get(
[
STORAGE.NAMING_PRESET,
STORAGE.NAMING_CUSTOM,
STORAGE.NOTIFY_SHOW,
STORAGE.NOTIFY_SOUND,
STORAGE.NOTIFY_OPEN,
STORAGE.IGNORE_LABELS,
STORAGE.IGNORE_CUSTOM_VARS,
STORAGE.GITHUB_TOKEN,
STORAGE.TOKEN_ACCESS_MODE
],
...
)
ಇಲ್ಲಿ ಓದಿದ ಸೆಟ್ಟಿಂಗ್ಗಳು ಈ ಕೆಳಗಿನ ಪ್ರಕ್ರಿಯೆಯ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತವೆ:
- ಹೆಸರಿಸುವ ನಿಯಮಗಳು zip ಫೈಲ್ ಹೆಸರನ್ನು ನಿರ್ಧರಿಸುತ್ತವೆ.
- ಡೌನ್ಲೋಡ್ ಪೂರ್ಣಗೊಂಡಾಗ ನನಗೆ ಸೂಚಿಸಿ.
- ಯಾವ ಫೈಲ್ಗಳು ಜಿಪ್ ಅನ್ನು ನಮೂದಿಸುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸುವ ನಿಯಮಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ.
- GitHub ಟೋಕನ್ 和设计方法电影 API ವಿನಂತಿ 头。
ಅಂದರೆ,downloader.js ಇದು ಶುದ್ಧ ನೆಟ್ವರ್ಕ್ ವಿನಂತಿ ಮಾಡ್ಯೂಲ್ ಅಲ್ಲ, ಇದು ಡೌನ್ಲೋಡ್ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ಬಳಕೆದಾರರ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಸಂಯೋಜಿಸುತ್ತದೆ.
GitHub API ಅನ್ನು ಅನಾಮಧೇಯವಾಗಿ ಪ್ರವೇಶಿಸಬಹುದು, ಆದರೆ ಅನಾಮಧೇಯ ಪ್ರವೇಶವು ಕಟ್ಟುನಿಟ್ಟಾದ ದರ ಮಿತಿಯನ್ನು ಹೊಂದಿದೆ. GitZip Pro ಬಳಕೆದಾರರ ಕಾನ್ಫಿಗರೇಶನ್ ಟೋಕನ್ಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ವಿನಂತಿಯ ರಚನೆಯು ಸುತ್ತುವರಿಯಲ್ಪಟ್ಟಿದೆ. buildHeaders()(
function buildHeaders(githubToken = '', tokenAccessMode="anonymous") {
const headers = {
'Accept': 'application/vnd.github.v3+json'
};
if (githubToken && tokenAccessMode === 'custom') {
headers['Authorization'] = `token ${githubToken}`;
}
return headers;
}
ಇಲ್ಲಿ ತರ್ಕ ಸ್ಪಷ್ಟವಾಗಿದೆ:
- ಎಲ್ಲಾ ವಿನಂತಿಗಳು
Accept: application/vnd.github.v3+json. - ಮಾತ್ರ
custom手机且ಟೋಕನ್ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ 时,才添加Authorization. - ಅನಾಮಧೇಯ ಮೋಡ್ ಟೋಕನ್ ವಿನಂತಿಯಾಗಿರುವುದಿಲ್ಲ.
ಇದು ಡೌನ್ಲೋಡರ್ಗೆ GitHub API ಅನ್ನು ಏಕೀಕೃತ ರೀತಿಯಲ್ಲಿ ಕರೆ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ ಮತ್ತು ಪ್ರತಿ ವಿನಂತಿಯ ಮೇರೆಗೆ ಟೋಕನ್ ಅನ್ನು ಪದೇ ಪದೇ ನಿರ್ಧರಿಸಬೇಕಾಗಿಲ್ಲ.
githubFetch: ಏಕೀಕೃತ API ವಿನಂತಿ
ನಿಜವಾದ GitHub API ವಿನಂತಿ githubFetch(apiPath, signal, githubToken, tokenAccessMode, attempt).
ಇದು GitHub API ಮೂಲ URL ಗೆ ಸಂಬಂಧಿಸಿದ API ಮಾರ್ಗವಾಗಿದೆ:
const fullUrl = `${GITHUB_API_BASE}${apiPath}`;
ನಂತರ ಕರೆ ಮಾಡಿ fetch(
resp = await fetch(fullUrl, { headers, signal });
ಇಲ್ಲಿ signal ನಿಂದ AbortControllerಡೌನ್ಲೋಡ್ ಕಾರ್ಯಗಳನ್ನು ರದ್ದುಗೊಳಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಬಳಕೆದಾರರು ಡೌನ್ಲೋಡ್ಗಳನ್ನು ರದ್ದುಗೊಳಿಸಿದಾಗ, ನಂತರದ ವಿನಂತಿಗಳನ್ನು ಅಡ್ಡಿಪಡಿಸಬಹುದು.
githubFetch 还电影了限流重试。 ಹಿಂತಿರುಗಿಸುವ ಸ್ಥಿತಿ ಇದ್ದರೆ 429, ಅಥವಾ 带问题流语义的 403ಮತ್ತು ಪುನರಾವರ್ತಿತ ಪರೀಕ್ಷೆಗಳ ಸಂಖ್ಯೆ 3 ಬಾರಿ ಮೀರಿಲ್ಲ.
const retryAfter = resp.headers.get('Retry-After');
const wait = retryAfter ? parseInt(retryAfter) * 1000 : (attempt + 1) * 2000;
ಪ್ರತಿ ವಿನಂತಿಯ ದೋಷ ನಿರ್ವಹಣೆ ವಿವರಗಳ ಬಗ್ಗೆ ಕಾಳಜಿ ವಹಿಸದಿರಲು ಈ ಪ್ಯಾಕೇಜ್ ಮೇಲಿನ ಪದರದ ಕಾರ್ಯವನ್ನು ಅನುಮತಿಸುತ್ತದೆ. ಅವರನ್ನು ಮಾತ್ರ ಕರೆಯಬೇಕಾಗಿದೆ githubFetch()ನೀವು JSON ಡೇಟಾವನ್ನು ಪಡೆಯಬಹುದು.
listDir: ವಿನಂತಿ ಕ್ಯಾಟಲಾಗ್ ವಿಷಯ
ಪರಿವಿಡಿ listDir() ಪೂರ್ಣಗೊಳಿಸುವಿಕೆ:
const apiPath = `/repos/${owner}/${repo}/contents/${encodeURIFilePath(path)}?ref=${branch}`;
const data = await githubFetch(apiPath, signal, githubToken, tokenAccessMode);
GitHub ವಿಷಯಗಳ API 对设计安全电影,对安全设计公司。 ಆದ್ದರಿಂದ listDir() 会电影图像图像ಅರೇ ಮಾಡಬೇಕು:
if (!Array.isArray(data)) {
throw new Error(`Expected directory listing for: ${path}`);
}
ಈ ವಿವರಣೆ listDir() ದೃಶ್ಯ ಕ್ಯಾಟಲಾಗ್ಗೆ ಮಾತ್ರ ಜವಾಬ್ದಾರರು fetchFile().
fetchFile: ಡಾಕ್ಯುಮೆಂಟ್ ವಿಷಯವನ್ನು ವಿನಂತಿಸಿ
fetchFile() ಮಾಲೀಕರ ಪ್ರಕಾರ, ರೆಪೊ, ಶಾಖೆ, ಮಾರ್ಗ, ಒಂದೇ ಫೈಲ್ನ ವಿಷಯವನ್ನು ಪಡೆಯಿರಿ. ಇದು GitHub ವಿಷಯಗಳ API ಅನ್ನು ಅವಲಂಬಿಸಿರುತ್ತದೆ.
本篇不可以base64 ಪರಿವರ್ತನೆ 和symlink ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತಿದೆ,先把主线看成:
TD A ಯ ಸಾಂಸ್ಥಿಕ ಚಾರ್ಟ್[“selectedItems 中的 GitHub href”] –> ಬಿ[“parseGitHubUrl()”]
ಬಿ –> ಸಿ[“owner / repo / branch / path / type”]
C –> D{“type”} D –>|”dir”| ಇ[“listDir()”]
D –>|”ಫೈಲ್”| ಎಫ್[“fetchFile()”]
ಇ –> ಜಿ[“githubFetch()”]
ಎಫ್ –> ಜಿಜಿ –> ಎಚ್[“buildHeaders()”]
ಎಚ್ –> ನಾನು[“GitHub API”]
ಈ ಪ್ರಕ್ರಿಯೆಯು ಡೌನ್ಲೋಡರ್ನ ಕೇಂದ್ರವಾಗಿದೆ.
URL 解析与 API ವಿನಂತಿ 的分工
ಈ ಲೇಖನವು ತುಂಬಾ ಅಚ್ಚುಕಟ್ಟಾದ ಹಲವಾರು ಕಾರ್ಯದ ಗಡಿಗಳನ್ನು ನೋಡಿದೆ:
parseGitHubUrl()GitHub ಪುಟದ URL ವಿಶ್ಲೇಷಣೆಗೆ ಮಾತ್ರ ಜವಾಬ್ದಾರರು.buildHeaders()ಟೋಕನ್ ಹೊಂದಿಸುವ ಜವಾಬ್ದಾರಿ ಮಾತ್ರ.githubFetch()ಏಕೀಕೃತ ವಿನಂತಿಗಳು, ದೋಷ ನಿರ್ವಹಣೆ ಮತ್ತು ಸೀಮಿತ ಹರಿವಿಗೆ ಮಾತ್ರ ಜವಾಬ್ದಾರರು.listDir()ಕ್ಯಾಟಲಾಗ್ ಪಟ್ಟಿಗೆ ಮಾತ್ರ ಜವಾಬ್ದಾರರು.fetchFile()ಒಂದೇ ಡಾಕ್ಯುಮೆಂಟ್ ವಿಷಯಕ್ಕೆ ಮಾತ್ರ ಜವಾಬ್ದಾರರು.
ಈ ಕಾರ್ಯಗಳನ್ನು ಒಟ್ಟಿಗೆ ಸಂಯೋಜಿಸಲಾಗಿದೆ ಮತ್ತು “ಪುಟ ಲಿಂಕ್” ನಿಂದ “GitHub API ಡೇಟಾ” ಗೆ ಪರಿವರ್ತನೆ ಪೂರ್ಣಗೊಂಡಿದೆ.
本篇小结
downloader.js 前十段手机手机剧前的名种实方法。 ಇದು href ಗೆ ರವಾನಿಸಲಾದ ಸ್ಕ್ರಿಪ್ಟ್ನ ವಿಷಯದಿಂದ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ, ಗೋದಾಮು, ಶಾಖೆ, ಮಾರ್ಗ ಮತ್ತು ಪ್ರಕಾರವನ್ನು ವಿಶ್ಲೇಷಿಸುತ್ತದೆ ಮತ್ತು ನಂತರ ಫೈಲ್ ಅಥವಾ ಡೈರೆಕ್ಟರಿಯನ್ನು ಪಡೆಯಲು GitHub API ಅನ್ನು ಬಳಸುತ್ತದೆ.
ಓದುವುದನ್ನು ಮುಂದುವರಿಸಿ downloader.js 往后走: ಕ್ಯಾಟಲಾಗ್ ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸಿದಾಗ, GitZip Pro ಎಲ್ಲಾ ಫೈಲ್ಗಳನ್ನು ಹೇಗೆ ಸಂಗ್ರಹಿಸುವುದು, JSZip ಅನ್ನು ನಿಯಂತ್ರಿಸುವುದು ಮತ್ತು ಅಂತಿಮವಾಗಿ ಬ್ರೌಸರ್ ಡೌನ್ಲೋಡ್ ಅನ್ನು ಪ್ರಚೋದಿಸಲು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಜಿಪ್ ಅನ್ನು ಹಾಕುವುದು ಹೇಗೆ.
ನೀವು ftux/GitZipPro ಅನ್ನು ಬಳಸಬಹುದು ಸಂಪೂರ್ಣ ಪ್ರಾಜೆಕ್ಟ್ ಮೂಲ ಕೋಡ್ ಅನ್ನು ವೀಕ್ಷಿಸಿ, ಈ GitHub ಫೈಲ್/ಫೋಲ್ಡರ್ ಅನ್ನು ಬೆಂಬಲಿಸಲು ಸ್ಟಾರ್ ಅನ್ನು ಸಹ ಸ್ವಾಗತಿಸಿ
ಈ ಪ್ರೊ ಆವೃತ್ತಿಯ ಬಗ್ಗೆ ನಿಮಗೂ ಕುತೂಹಲವಿದ್ದರೆ, ಇದು ಪ್ರೊ ಆವೃತ್ತಿಯಾಗಬೇಕೆಂದು ನೀವು ಏಕೆ ಬಯಸುತ್ತೀರಿ?