-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgithub-download-booster.user.js
More file actions
469 lines (425 loc) · 41.6 KB
/
github-download-booster.user.js
File metadata and controls
469 lines (425 loc) · 41.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
// ==UserScript==
// @name Github Download Booster
// @version 2.5.24
// @author Edhic1
// @description High-speed download of Git Clone/SSH, Release, Raw, Code(ZIP) and other files (Based on public welfare), project list file quick download (☁)
// @license MIT
// @match *://github.com/*
// @match *://hub.incept.pw/*
// @match *://hub.nuaa.cf/*
// @match *://hub.yzuu.cf/*
// @match *://hub.scholar.rr.nu/*
// @match *://dgithub.xyz/*
// @match *://kkgithub.com/*
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACEUExURUxpcRgWFhsYGBgWFhcWFh8WFhoYGBgWFiUlJRcVFRkWFhgVFRgWFhgVFRsWFhgWFigeHhkWFv////////////r6+h4eHv/// xcVFfLx8SMhIUNCQpSTk/r6+jY0NCknJ97e3ru7u+fn51BOTsPCwqGgoISDg6empmpoaK2srNDQ0FhXV3eXcCcAAAAXdFJOUwCBIZXMGP70BuRH2Ze/LpIMUunHkpQR34sfygAAAVpJREFUOMt1U+magjAMDAVb5BDU3W25b9T1/d9vaYpQKDs/rF9nSNJkArDA9ezQZ8wPbc8FE6eAiQUsOO1o19JolFibKCdHGHC0IJezOMD5snx/yE +KOYYr42fPSufSZyazqDoseTPw4lGJNOu6LBXVUPBG3lqYAOv/5ZwnNUfUifzBt8gkgfgINmjxOpgqUA147QWNaocLniqq3QsSVbQHNp45N/BAwoYQz9oUJEiE4GMGfoBSMj5gjeWRIMMqleD/CAzUHFqTLyj OA5zjNnwa4UCEZ2YK3khEcBXHjVBtEFeIZ6+NxYbPqWp1DLKV42t6Ujn2ydyiPi9nX0TTNAkVVZ/gozsl6FbrktkwaVvL2TRK0C8Ca7Hck7f5OBT6FFbLATkL2ugV0tm0RLM9fedDvhWstl8 Wp9AFDjFX7yOY/lJrv8AkYuz7fuP8dv9izCYH+x3/LBnj9fYPBTpJDNzX+7cAAAAASUVORK5CYII=
// @grant GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @grant GM_openInTab
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_notification
// @grant window.onurlchange
// @sandbox JavaScript
// @run-at document-end
// @supportURL https://github.com/Edhic1/Github-Download-Booster
// @homepageURL https://github.com/Edhic1/Github-Download-Booster
// ==/UserScript==
(function() {
'use strict';
var backColor = '#ffffff', fontColor = '#888888', menu_rawFast = GM_getValue('xiu2_menu_raw_fast'), menu_rawFast_ID, menu_rawDownLink_ID, menu_gitClone_ID, menu_feedBack_ID;
const download_url_us = [
['https://gh.h233.eu.org/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@XIU/XIU2] '],
//['https://gh.api.99988866.xyz/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [hunshcn/gh-proxy] '], // Too many people use the official demonstration site
['https://gh.ddlc.top/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@mtr-static-official] '],
//['https://gh2.yanqishui.work/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@HongjieCN] '], // Parsing error
['https://dl.ghpig.top/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [feizhuqwq.com] '],
//['https://gh.flyinbug.top/gh/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [Mintimate] '], // Error
['https://slink.ltd/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [ Zhiliao Station ] '],
//['https://git.xfj0.cn/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [ Anonymous ] '], // No resolution
['https://gh.con.sh/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [ Anonymous ] '],
//['https://ghps.cc/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [ Anonymous ] '], // prompt blocked
//['https://gh-proxy.com/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [ Anonymous ] '], // 502
['https://cors.isteed.cc/github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@Lufs\'s] '],
['https://hub.gitmirror.com/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [GitMirror] '],
['https://sciproxy.com/github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [sciproxy.com] '],
['https://ghproxy.cc/https://github.com', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [@yionchiii lau] '],
['https://cf.ghproxy.cc/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '],
['https://www.ghproxy.cc/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '],
['https://ghproxy.cn/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '],
['https://www.ghproxy.cn/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '],
['https://gh.jiasu.in/https://github.com', ' United States ', '[ US Cloudflare CDN] - This public welfare acceleration source is provided by [@0-RTT] '],
['https://dgithub.xyz', ' United States ', '[ United States Seattle ] - This public welfare acceleration source is provided by [dgithub.xyz] '],
['https://download.ixnic.net', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '],
['https://download.nuaa.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '],
['https://download.scholar.rr.nu', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '],
['https://download.yzuu.cf', ' United States ', '[ United States New York ] - This public acceleration source is provided by [FastGit group member ] ']
], download_url = [
//['https://download.fastgit.org', ' Germany ', '[ Germany ] - This public welfare acceleration source is provided by [FastGit] Tip: I hope everyone will use the previous US nodes as much as possible ( 4 random nodes each time for load balancing), avoid traffic concentrating on Asian public welfare nodes, reduce cost pressure, and make public welfare more sustainable ~', 'https://archive.fastgit.org'], // Certificate expired
['https://mirror.ghproxy.com/https://github.com', 'South Korea', '[ Japan, Korea, Germany, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [ghproxy] Tip: I hope everyone will try to use the previous US node as much as possible (randomly each time Load balancing), Avoid all traffic from being concentrated on the Asian charity node, reduce cost pressure, and make charity more sustainable ~'],
['https://ghproxy.net/https://github.com', ' Japan ', '[ Japan Osaka ] - This public welfare acceleration source is provided by [ghproxy] Tip: I hope everyone will use the previous American nodes as much as possible (randomly each time Load balancing), avoid traffic concentration on Asian charity nodes, reduce cost pressure, and charity can be more sustainable ~'],
['https://kkgithub.com', 'Hongkong', '[ Hong Kong, China, Japan, Singapore, etc. ] - This public welfare acceleration source is provided by [help.kkgithub.com] Tip: I hope everyone will use the previous US nodes as much as possible ( 4 random nodes each time for load balancing), avoid traffic concentrating on Asian public welfare nodes, reduce cost pressure, and make public welfare more sustainable ~'],
//['https://download.incept.pw', 'Hongkong', '[Hongkong,China] - This public welfare acceleration source is provided by [FastGit group member ] Tip: I hope everyone will use the previous US nodes as much as possible ( 4 random nodes each time for load balancing), avoid traffic concentrating on Asian public welfare nodes, reduce cost pressure, and make public welfare more sustainable ~'] // ERR_SSL_PROTOCOL_ERROR
], clone_url = [
['https://gitclone.com', ' Domestic ', '[ China Domestic ] - This public welfare acceleration source is provided by [GitClone] - Cache: Yes - Slower for the first time , faster after caching '],
['https://kkgithub.com', 'Hongkong', '[ Hong Kong, China, Japan, Singapore, etc. ] - This public welfare acceleration source is provided by [help.kkgithub.com] - Cache: None (or very short time) '],
['https://hub.incept.pw', 'Hongkong', '[Hongkong,China、USA] - This public welfare acceleration source is provided by [FastGit group members ] '],
['https://mirror.ghproxy.com/https://github.com', ' Korea ', '[ Japan, Korea, Germany, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '],
//['https://gh-proxy.com/https://github.com', 'South Korea', '[South Korea] - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '],
['https://githubfast.com', 'South Korea', '[South Korea] - This public welfare acceleration source is provided by [Github Fast] - Cache: None (or very short time) '],
['https://ghproxy.net/https://github.com', ' Japan ', '[ Japan Osaka ] - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '],
['https://github.moeyy.xyz/https://github.com', ' Singapore ', '[ Singapore, Hong Kong, China, Japan, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [Moeyy] - Cache: None (or very short time) '],
//['https://slink.ltd/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [ Zhi Liao Xiao Zhan ] '] // Not necessary for now
//['https://hub.gitmirror.com/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [GitMirror] '], // Not necessary for now
//['https://sciproxy.com/github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [sciproxy.com] '], // Not necessary for now
//['https://ghproxy.cc/https://github.com', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary yet
//['https://cf.ghproxy.cc/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now
//['https://www.ghproxy.cc/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now
//['https://ghproxy.cn/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now
//['https://www.ghproxy.cn/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now
//['https://gh.jiasu.in/https://github.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@0-RTT] '], // Not necessary for now
//['https://dgithub.xyz', ' United States ', '[ United States Seattle ] - This public welfare acceleration source is provided by [dgithub.xyz] '], // Not necessary yet
//['https://hub.fgit.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Being complained about and hung up
//['https://hub.nuaa.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now
//['https://hub.scholar.rr.nu', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now
//['https://hub.njuu.cf', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '], // The domain name is down
//['https://hub.yzuu.cf', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now
//['https://hub.0z.gs', ' United States ', '[ US Cloudflare CDN]'], // Domain name not resolved
//['https://hub.shutcm.cf', ' United States ', '[ US Cloudflare CDN]'] // Connection timed out
], clone_ssh_url = [
['ssh://git@ssh.github.com:443/', 'Github native ', '[ Japan, Singapore, etc. ] - SSH on port 443 provided by Github (still SSH protocol), suitable for network environments with restricted access to port 22 '],
['git@ssh.fastgit.org:', ' Hong Kong ', '[ China Hong Kong ] - This public welfare acceleration source is provided by [FastGit] ']
//['git@git.zhlh6.cn:', ' United States ', '[ United States Los Angeles ]'] // Hang up
], raw_url = [
['https://raw.githubusercontent.com', 'Github native ', '[ Japan Tokyo ]'],
['https://raw.kkgithub.com', 'Hongkong', '[ Hong Kong, China, Japan, Singapore, etc. ] - This public welfare acceleration source is provided by [help.kkgithub.com] - Cache: None (or very short time) '],
['https://mirror.ghproxy.com/https://raw.githubusercontent.com', ' Korea ', '[ Japan, Korea, Germany, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '],
//['https://gh-proxy.com/https://raw.githubusercontent.com', 'South Korea2', '[South Korea] - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '],
['https://ghproxy.net/https://raw.githubusercontent.com', 'Japan1', '[Japan Osaka ] - This public welfare acceleration source is provided by [ghproxy] - Cache: None (or very short time) '],
['https://fastly.jsdelivr.net/gh', 'Japan2', '[Japan Tokyo ] - This public welfare acceleration source is provided by [JSDelivr CDN] - Cache: Yes - Files larger than 50 MB are not supported - Branch names in version number format (such as v1.2.3 ) are not supported '],
['https://fastraw.ixnic.net', 'Japan3', '[Japan Osaka ] - This public welfare acceleration source is provided by [FastGit group member ] - Cache: None (or very short time) '], // There is also a raw.ixnic.net in Los Angeles, USA
//['https://gcore.jsdelivr.net/gh', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [JSDelivr CDN] - Cache: Yes - Does not support files larger than 50 MB - Does not support branch names in version number format (such as v1.2.3 ) '], // becomes Cloudflare CDN in the United States
['https://cdn.jsdelivr.us/gh', ' Other 1', '[ South Korea, the United States, Malaysia, Romania, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [@ayao] - Cache: Yes '],
['https://jsdelivr.b-cdn.net/gh', ' Other 2', '[ Hong Kong, Taiwan, Japan, Singapore, etc. ] ( CDN is not fixed) - This public welfare acceleration source is provided by [@rttwyjz] - Cache: Yes '],
['https://github.moeyy.xyz/https://raw.githubusercontent.com', ' Other 3', '[ Singapore, Hong Kong, China, Japan, etc. ] ( CDN is not fixed) - Cache: None (or very short time) '],
['https://raw.cachefly.998111.xyz', ' Other 4', '[ Singapore, Japan, India, etc. ] ( Anycast CDN is not fixed) - This public welfare acceleration source is provided by [@XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX0] - Cache: Yes (about 12 hours ) '],
//['https://raw.incept.pw', 'Hongkong', '[ Hong Kong, China, the United States ] - This public welfare acceleration source is provided by [FastGit group members ] - Cache: None (or very short time) '], // ERR_SSL_PROTOCOL_ERROR
//['https://ghproxy.cc/https://raw.githubusercontent.com', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary yet
//['https://cf.ghproxy.cc/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now
//['https://www.ghproxy.cc/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now
//['https://ghproxy.cn/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now
//['https://www.ghproxy.cn/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@yionchiii lau] '], // Not necessary for now
//['https://gh.jiasu.in/https://raw.githubusercontent.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [@0-RTT] '], // Not necessary for now
//['https://dgithub.xyz', ' United States ', '[ United States Seattle ] - This public welfare acceleration source is provided by [dgithub.xyz] '], // Not necessary yet
//['https://raw.fgit.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] - Cache: None (or very short time) '], // Hanged due to complaint
//['https://raw.nuaa.cf', ' United States ', '[ United States Los Angeles ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now
//['https://raw.scholar.rr.nu', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] '], // Not necessary for now
//['https://raw.njuu.cf', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] - Cache: None (or very short time) '], // Domain name is down
//['https://raw.yzuu.cf', ' United States ', '[ United States New York ] - This public welfare acceleration source is provided by [FastGit group member ] - Cache: None (or very short time) '], // Not necessary yet
//['https://raw.gitmirror.com', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [GitMirror] - Cache: Yes '], // Not necessary for now
//['https://cdn.54188.cf/gh', ' United States ', '[ United States Cloudflare CDN] - This public welfare acceleration source is provided by [PencilNavigator] - Cache: Yes '], // Not necessary for now
//['https://raw.fastgit.org', ' Germany ', '[ Germany ] - This public welfare acceleration source is provided by [FastGit] - Cache: None (or very short time) '], // Hang up
//['https://git.yumenaka.net/https://raw.githubusercontent.com', ' United States ', '[ United States San Jose ] - Cache: None (or very short time) '], // Connection timed out
], 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: var(--XIU2-back-Color); border-color: rgba(27, 31, 35, 0.1); font-size: 11px; color: var(--XIU2-font-Color);'];
if (menu_rawFast == null){menu_rawFast = 1; GM_setValue('xiu2_menu_raw_fast', 1)};
if (GM_getValue('menu_rawDownLink') == null){GM_setValue('menu_rawDownLink', true)};
if (GM_getValue('menu_gitClone') == null){GM_setValue('menu_gitClone', true)};
registerMenuCommand();
// Register script menu
function registerMenuCommand() {
// If the feedback menu ID is not null , delete all script menus
if (menu_feedBack_ID) {GM_unregisterMenuCommand(menu_rawFast_ID); GM_unregisterMenuCommand(menu_rawDownLink_ID); GM_unregisterMenuCommand(menu_gitClone_ID); GM_unregisterMenuCommand(menu_feedBack_ID); menu_rawFast = GM_getValue('xiu2_menu_raw_fast');}
// Avoid error reporting when the data stored by the user is larger than the array after reducing the raw array
if (menu_rawFast > raw_url.length - 1) menu_rawFast = 0
if (GM_getValue('menu_rawDownLink')) menu_rawFast_ID = GM_registerMenuCommand(`${['0️ ⃣ ' ,'1️ ⃣ ','2️ ⃣ ','3️ ⃣ ','4️ ⃣ ','5️ ⃣ ','6️ ⃣ ','7️ ⃣ ','8️ ⃣ ','9️ ⃣ ',' 🔟 '][menu_rawFast]} [ ${raw_url[menu_rawFast][1]} ] acceleration source ( ☁ ) - click to switch` , menu_toggle_raw_fast);
menu_rawDownLink_ID = GM_registerMenuCommand(`${GM_getValue('menu_rawDownLink')?' ✅ ':' ❌ '} Project list single file quick download ( ☁ )`, function(){if (GM_getValue('menu_rawDownLink') == true) {GM_setValue('menu_rawDownLink', false); GM_notification({text: `The [ Project list single file quick download ( ☁ )] function has been closed \n ( Click to refresh the page to take effect) `, timeout: 3500, onclick: function(){location.reload();}});} else {GM_setValue('menu_rawDownLink', true); GM_notification({text: `The [ Project list single file quick download ( ☁ )] function has been opened \n ( Click to refresh the page to take effect) `, timeout: 3500, onclick: function(){location.reload();}});}registerMenuCommand();});
menu_gitClone_ID = GM_registerMenuCommand(`${GM_getValue('menu_gitClone')?' ✅ ':' ❌ '} Add git clone command` , function(){if (GM_getValue('menu_gitClone') == true) {GM_setValue('menu_gitClone', false); GM_notification({text: ` The [ Add git clone command ] function has been turned off \n ( Click to refresh the page to take effect) `, timeout: 3500, onclick: function(){location.reload();}});} else {GM_setValue('menu_gitClone', true); GM_notification({text: `The [ Add git clone command ] function has been turned on \n ( Click to refresh the page to take effect) `, timeout: 3500, onclick: function(){location.reload();}});}registerMenuCommand();});
menu_feedBack_ID = GM_registerMenuCommand(' 💬 Feedback & Suggestions [Github]', function () {window.GM_openInTab('https://github.com/XIU2/UserScript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/412245/feedback', {active: true,insert: true,setParent: true});});
}
// Switch the acceleration source
function menu_toggle_raw_fast() {
// If the current acceleration source position is greater than or equal to the total number of acceleration sources, change to the first acceleration source, otherwise increment the next acceleration source
if (menu_rawFast >= raw_url.length - 1) {menu_rawFast = 0;} else {menu_rawFast += 1;}
GM_setValue('xiu2_menu_raw_fast', menu_rawFast);
delRawDownLink(); // Delete the old acceleration source
addRawDownLink(); // Add a new acceleration source
GM_notification({text: " The acceleration source has been switched to: " + raw_url[menu_rawFast][1], timeout: 3000}); // Prompt message
registerMenuCommand(); // Re-register script menu
};
colorMode(); // Adapt to daytime / nighttime theme mode
setTimeout(addRawFile, 1000); // Raw acceleration
setTimeout(addRawDownLink, 2000); // Quick download of a single Raw file ( ☁ ), delay execution by 2 seconds to avoid being deleted by pjax
// The onurlchange event grant added in Tampermonkey v4.11 can monitor URL changes of pjax and other web pages
if (window.onurlchange === undefined) addUrlChangeEvent();
window.addEventListener('urlchange', function() {
colorMode(); // Adapt to daytime / nighttime theme mode
if (location.pathname.indexOf('/releases')) addRelease(); // Release acceleration
setTimeout(addRawFile, 1000); // Raw acceleration
setTimeout(addRawDownLink, 2000); // Quick download of a single Raw file ( ☁ ), delay execution by 2 seconds to avoid being deleted by pjax
setTimeout(addRawDownLink_, 1000); // Re-add the Raw download link ( ☁ ) mouse event when the browser goes back / forward
});
// Github Git Clone/SSH , Release , Download ZIP are changed to dynamically load file lists, so it is necessary to monitor changes in web page elements
const callback = (mutationsList, observer) => {
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])')) { // Project Home
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');
}
}
}
}
}
};
const observer = new MutationObserver(callback);
observer.observe(document, { childList: true, subtree: true });
// download_url randomly selects 4 US acceleration sources
function get_New_download_url() {
//return download_url_us.concat(download_url) // full output for debugging
let shuffled = download_url_us.slice(0), i = download_url_us.length, min = i - 4, temp, index;
while (i-- > min) {index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp;}
return shuffled.slice(min).concat(download_url); // Randomly shuffle the download_url_us array and take the first 4 , then merge them into the download_url array
}
// Release
function addRelease() {
let html = document.querySelectorAll('.Box-footer'); if (html.length == 0 || location.pathname.indexOf('/releases') == -1) return
let divDisplay = 'margin-left: -90px;', new_download_url = get_New_download_url();
if (document.documentElement.clientWidth > 755) {divDisplay = 'margin-top: -3px;margin-left: 8px;display: inherit;';}; // Adjust the style for small screen
for (const current of html) {
if (current.querySelector('.XIU2-RS')) continue
current.querySelectorAll('li.Box-row a').forEach(function (_this) {
let href = _this.href.split(location.host),
url = '', _html = `<div class="XIU2-RS" style="${divDisplay}">`;
for (let i=0;i<new_download_url.length;i++) {
if (new_download_url[i][3] !== undefined && url.indexOf('/archive/') !== -1) {
url = new_download_url[i][3] + href[1]
} else {
url = new_download_url[i][0] + href[1]
}
_html += `<a style="${style[0]}" class="btn" href="${url}" title="${new_download_url[i][2]}" rel="noreferrer noopener nofollow">${new_download_url[i][1]}</a>`
}
_this.parentElement.nextElementSibling.insertAdjacentHTML('beforeend', _html + '</div>');
});
}
}
// Download ZIP
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();
// Clone the original Download ZIP element and locate the <a> <span> tags
let html_clone = html.cloneNode(true),
html_clone_a = html_clone.querySelector('a[href$=".zip"]'),
html_clone_span = html_clone.querySelector('span[id]');
for (let i=0;i<new_download_url.length;i++) {
if (new_download_url[i][3] === '') continue
if (new_download_url[i][3] !== undefined) {
url = new_download_url[i][3] + href
} else {
url = new_download_url[i][0] + href
}
html_clone_a.href = url
html_clone_a.setAttribute('title', new_download_url[i][2].replaceAll(' ','\n'))
html_clone_span.textContent = 'Download ZIP ' + new_download_url[i][1]
_html += html_clone.outerHTML
}
html.insertAdjacentHTML('afterend', _html);
}
// Git Clone Switch Cleanup
function addGitCloneClear(css) {
document.querySelectorAll(css).forEach((e)=>{e.remove()})
}
// Git Clone
function addGitClone(target) {
let html = target.querySelector('input[value^="https:"]');if (!html) return
let href_split = html.value.split(location.host)[1],
html_parent = '<div style="margin-top: 4px;" class="XIU2-GC ' + html.parentElement.className + '">',
url = '', _html = '', _gitClone = '';
html.nextElementSibling.hidden = true; // Hide the copy button on the right (considering that you can click to copy directly, the copy button event will not be implemented repeatedly)
if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.value = _gitClone + html.value; html.setAttribute('value', html.value);}
// Clone the original Git Clone element
let html_clone = html.cloneNode(true);
for (let i=0;i<clone_url.length;i++) {
if (clone_url[i][0] === 'https://gitclone.com') {
url = clone_url[i][0] + '/github.com' + href_split
} else {
url = clone_url[i][0] + href_split
}
html_clone.title = `${url}\n\n${clone_url[i][2].replaceAll(' ','\n')}\n\nTip: Click on the text to copy it directly`
html_clone.setAttribute('value', _gitClone + url)
_html += html_parent + html_clone.outerHTML + '</div>'
}
html.parentElement.insertAdjacentHTML('afterend', _html);
}
// Git Clone SSH
function addGitCloneSSH(target) {
let html = target.querySelector('input[value^="git@"]');if (!html) return
let href_split = html.value.split(':')[1],
html_parent = '<div style="margin-top: 4px;" class="XIU2-GCS ' + html.parentElement.className + '">',
url = '', _html = '', _gitClone = '';
html.nextElementSibling.hidden = true; // Hide the copy button on the right (considering that you can click to copy directly, the copy button event will not be implemented repeatedly)
if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.value = _gitClone + html.value; html.setAttribute('value', html.value);}
// Clone the original Git Clone SSH element
let html_clone = html.cloneNode(true);
for (let i=0;i<clone_ssh_url.length;i++) {
url = clone_ssh_url[i][0] + href_split
html_clone.title = `${url}\n\n${clone_ssh_url[i][2].replaceAll(' ','\n')}\n\nTip: Click on the text to copy it directly`
html_clone.setAttribute('value', _gitClone + url)
_html += html_parent + html_clone.outerHTML + '</div>'
}
html.parentElement.insertAdjacentHTML('afterend', _html);
}
// Raw
function addRawFile() {
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 = '';
for (let i=1;i<raw_url.length;i++) {
if ((raw_url[i][0].indexOf('/gh') + 3 === raw_url[i][0].length) && raw_url[i][0].indexOf('cdn.staticaly.com') === -1) {
url = raw_url[i][0] + href.replace('/blob/','@');
} else {
url = raw_url[i][0] + href2;
}
_html += `<a href="${url}" title="${raw_url[i][2]}" target="_blank" role="button" rel="noreferrer noopener nofollow" data-size="small" class="${html.className} XIU2-RF">${raw_url[i][1].replace(/ \d/,'')}</a>`
}
if (document.querySelector('.XIU2-RF')) document.querySelectorAll('.XIU2-RF').forEach((e)=>{e.remove()})
html.insertAdjacentHTML('afterend', _html);
}
// Raw single file quick download (☁)
function addRawDownLink() {
if (!GM_getValue('menu_rawDownLink')) return
// If it is not a project file page, return; if the webpage has a Raw download link ( ☁ ), return
let files = document.querySelectorAll('div.Box-row svg.octicon.octicon-file, .react-directory-filename-column>svg.color-fg-muted');if(files.length === 0) return;if (location.pathname.indexOf('/tags') > -1) return
let files1 = document.querySelectorAll('a.fileDownLink');if(files1.length > 0) return;
// Display when the mouse is pointing
var mouseOverHandler = function(evt) {
let elem = evt.currentTarget,
aElm_new = elem.querySelectorAll('.fileDownLink'),
aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted');
aElm_new.forEach(el=>{el.style.cssText = 'display: inline'});
aElm_now.forEach(el=>{el.style.cssText = 'display: none'});
};
// Hide when mouse leaves
var mouseOutHandler = function(evt) {
let elem = evt.currentTarget,
aElm_new = elem.querySelectorAll('.fileDownLink'),
aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted');
aElm_new.forEach(el=>{el.style.cssText = 'display: none'});
aElm_now.forEach(el=>{el.style.cssText = 'display: inline'});
};
// Loop Add
files.forEach(function(fileElm) {
let trElm = fileElm.parentNode.parentNode,
cntElm_a = trElm.querySelector('[role="rowheader"] > .css-truncate.css-truncate-target.d-block.width-fit > a, .react-directory-truncate>a'),
Name = cntElm_a.innerText,
href = cntElm_a.getAttribute('href'),
href2 = href.replace('/blob/','/'), url = '';
if ((raw_url[menu_rawFast][0].indexOf('/gh') + 3 === raw_url[menu_rawFast][0].length) && raw_url[menu_rawFast][0].indexOf('cdn.staticaly.com') === -1) {
url = raw_url[menu_rawFast][0] + href.replace('/blob/','@');
} else {
url = raw_url[menu_rawFast][0] + href2;
}
fileElm.insertAdjacentHTML('afterend', ` <a href="${url}" download="${Name}" target="_blank" rel="noreferrer noopener nofollow" class="fileDownLink" style="display: none;" title=" 「 ${raw_url[menu_rawFast][1]} 」 [Alt + left button] or [right button - Save as...] to download the file. Note: click the [ ☁ ] icon with your mouse, not the file name on the left! ${raw_url[menu_rawFast][2]} Tip: Click the Tampermonkey extension icon - [ ${raw_url[menu_rawFast][1]} ] acceleration source ( ☁ ) in the upper right corner of the browser to switch. "> ${svg[0]}</a>`);
// Bind mouse events
trElm.onmouseover = mouseOverHandler;
trElm.onmouseout = mouseOutHandler;
});
}
// Remove Raw single file quick download ( ☁ )
function delRawDownLink() {
if (!GM_getValue('menu_rawDownLink')) return
let aElm = document.querySelectorAll('.fileDownLink');if(aElm.length === 0) return;
aElm.forEach(function(fileElm) {fileElm.remove();})
}
// Re-add the Raw single file quick download ( ☁ ) mouse event when the browser returns / forwards
function addRawDownLink_() {
if (!GM_getValue('menu_rawDownLink')) return
// If it is not a project file page, return; if the webpage does not have a Raw download link ( ☁ ), return
let files = document.querySelectorAll('div.Box-row svg.octicon.octicon-file, .react-directory-filename-column>svg.color-fg-muted');if(files.length === 0) return;
let files1 = document.querySelectorAll('a.fileDownLink');if(files1.length === 0) return;
// Display when the mouse is pointing
var mouseOverHandler = function(evt) {
let elem = evt.currentTarget,
aElm_new = elem.querySelectorAll('.fileDownLink'),
aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted');
aElm_new.forEach(el=>{el.style.cssText = 'display: inline'});
aElm_now.forEach(el=>{el.style.cssText = 'display: none'});
};
// Hide when mouse leaves
var mouseOutHandler = function(evt) {
let elem = evt.currentTarget,
aElm_new = elem.querySelectorAll('.fileDownLink'),
aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted');
aElm_new.forEach(el=>{el.style.cssText = 'display: none'});
aElm_now.forEach(el=>{el.style.cssText = 'display: inline'});
};
// Loop Add
files.forEach(function(fileElm) {
let trElm = fileElm.parentNode.parentNode;
// Binding Mouse Events
trElm.onmouseover = mouseOverHandler;
trElm.onmouseout = mouseOutHandler;
});
}
// Adapt to daytime / nighttime theme mode
function colorMode() {
let style_Add;
if (document.getElementById('XIU2-Github')) {style_Add = document.getElementById('XIU2-Github')} else {style_Add = document.createElement('style'); style_Add.id = 'XIU2-Github'; style_Add.type = 'text/css';}
backColor = '#ffffff'; fontColor = '#888888';
if (document.lastElementChild.dataset.colorMode === 'dark') { // If it is night mode
if (document.lastElementChild.dataset.darkTheme === 'dark_dimmed') {
backColor = '#272e37'; fontColor = '#768390';
} else {
backColor = '#161a21'; fontColor = '#97a0aa';
}
} else if (document.lastElementChild.dataset.colorMode === 'auto') { // If it is automatic mode
if (window.matchMedia('(prefers-color-scheme: dark)').matches || document.lastElementChild.dataset.lightTheme.indexOf('dark') > -1) { // If the browser is in night mode or Day mode is dark
if (document.lastElementChild.dataset.darkTheme === 'dark_dimmed') {
backColor = '#272e37'; fontColor = '#768390';
} else if (document.lastElementChild.dataset.darkTheme.indexOf('light') == -1) { // Exclude the case where night mode is light
backColor = '#161a21'; fontColor = '#97a0aa';
}
}
}
document.lastElementChild.appendChild(style_Add).textContent = `.XIU2-RS a {--XIU2-back-Color: ${backColor}; --XIU2-font-Color: ${fontColor};}`;
}
// Custom urlchange event (used to monitor URL changes) for non- Tampermonkey managers
function addUrlChangeEvent() {
history.pushState = ( f => function pushState(){
var ret = f.apply(this, arguments);
window.dispatchEvent(new Event('pushstate'));
window.dispatchEvent(new Event('urlchange'));
return ret;
})(history.pushState);
history.replaceState = ( f => function replaceState(){
var ret = f.apply(this, arguments);
window.dispatchEvent(new Event('replacestate'));
window.dispatchEvent(new Event('urlchange'));
return ret;
})(history.replaceState);
window.addEventListener('popstate',()=>{ // Trigger the urlchange event when clicking the browser's forward / back button
window.dispatchEvent(new Event('urlchange'))
});
}
})();