Fix ghrel download link, use API directly (#711)

* Fix ghrel download link, use API directly

* Add missing GH token for downloading API
This commit is contained in:
Jerry Ma 2025-04-24 14:21:22 +08:00 committed by GitHub
parent 39953b5223
commit a014294d58
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -121,6 +121,7 @@ class Downloader
retries: self::getRetryAttempts() retries: self::getRetryAttempts()
), true); ), true);
$url = null; $url = null;
$filename = null;
foreach ($data as $release) { foreach ($data as $release) {
if (($source['prefer-stable'] ?? false) === true && $release['prerelease'] === true) { if (($source['prefer-stable'] ?? false) === true && $release['prerelease'] === true) {
continue; continue;
@ -131,16 +132,16 @@ class Downloader
} }
foreach ($release['assets'] as $asset) { foreach ($release['assets'] as $asset) {
if (preg_match('|' . $source['match'] . '|', $asset['name'])) { if (preg_match('|' . $source['match'] . '|', $asset['name'])) {
$url = $asset['browser_download_url']; $url = "https://api.github.com/repos/{$source['repo']}/releases/assets/{$asset['id']}";
$filename = $asset['name'];
break 2; break 2;
} }
} }
} }
if (!$url) { if (!$url || !$filename) {
throw new DownloaderException("failed to find {$name} release metadata"); throw new DownloaderException("failed to find {$name} release metadata");
} }
$filename = basename($url);
return [$url, $filename]; return [$url, $filename];
} }
@ -191,7 +192,7 @@ class Downloader
* @throws RuntimeException * @throws RuntimeException
* @throws WrongUsageException * @throws WrongUsageException
*/ */
public static function downloadFile(string $name, string $url, string $filename, ?string $move_path = null, int $download_as = SPC_DOWNLOAD_SOURCE): void public static function downloadFile(string $name, string $url, string $filename, ?string $move_path = null, int $download_as = SPC_DOWNLOAD_SOURCE, array $headers = [], array $hooks = []): void
{ {
logger()->debug("Downloading {$url}"); logger()->debug("Downloading {$url}");
$cancel_func = function () use ($filename) { $cancel_func = function () use ($filename) {
@ -201,7 +202,7 @@ class Downloader
} }
}; };
self::registerCancelEvent($cancel_func); self::registerCancelEvent($cancel_func);
self::curlDown(url: $url, path: FileSystem::convertPath(DOWNLOAD_PATH . "/{$filename}"), retries: self::getRetryAttempts()); self::curlDown(url: $url, path: FileSystem::convertPath(DOWNLOAD_PATH . "/{$filename}"), headers: $headers, hooks: $hooks, retries: self::getRetryAttempts());
self::unregisterCancelEvent(); self::unregisterCancelEvent();
logger()->debug("Locking {$filename}"); logger()->debug("Locking {$filename}");
if ($download_as === SPC_DOWNLOAD_PRE_BUILT) { if ($download_as === SPC_DOWNLOAD_PRE_BUILT) {
@ -341,15 +342,15 @@ class Downloader
break; break;
case 'ghtar': // GitHub Release (tar) case 'ghtar': // GitHub Release (tar)
[$url, $filename] = self::getLatestGithubTarball($name, $pkg); [$url, $filename] = self::getLatestGithubTarball($name, $pkg);
self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE); self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE, hooks: [[CurlHook::class, 'setupGithubToken']]);
break; break;
case 'ghtagtar': // GitHub Tag (tar) case 'ghtagtar': // GitHub Tag (tar)
[$url, $filename] = self::getLatestGithubTarball($name, $pkg, 'tags'); [$url, $filename] = self::getLatestGithubTarball($name, $pkg, 'tags');
self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE); self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE, hooks: [[CurlHook::class, 'setupGithubToken']]);
break; break;
case 'ghrel': // GitHub Release (uploaded) case 'ghrel': // GitHub Release (uploaded)
[$url, $filename] = self::getLatestGithubRelease($name, $pkg); [$url, $filename] = self::getLatestGithubRelease($name, $pkg);
self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE); self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE, ['Accept: application/octet-stream'], [[CurlHook::class, 'setupGithubToken']]);
break; break;
case 'filelist': // Basic File List (regex based crawler) case 'filelist': // Basic File List (regex based crawler)
[$url, $filename] = self::getFromFileList($name, $pkg); [$url, $filename] = self::getFromFileList($name, $pkg);
@ -447,15 +448,15 @@ class Downloader
break; break;
case 'ghtar': // GitHub Release (tar) case 'ghtar': // GitHub Release (tar)
[$url, $filename] = self::getLatestGithubTarball($name, $source); [$url, $filename] = self::getLatestGithubTarball($name, $source);
self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as); self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as, hooks: [[CurlHook::class, 'setupGithubToken']]);
break; break;
case 'ghtagtar': // GitHub Tag (tar) case 'ghtagtar': // GitHub Tag (tar)
[$url, $filename] = self::getLatestGithubTarball($name, $source, 'tags'); [$url, $filename] = self::getLatestGithubTarball($name, $source, 'tags');
self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as); self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as, hooks: [[CurlHook::class, 'setupGithubToken']]);
break; break;
case 'ghrel': // GitHub Release (uploaded) case 'ghrel': // GitHub Release (uploaded)
[$url, $filename] = self::getLatestGithubRelease($name, $source); [$url, $filename] = self::getLatestGithubRelease($name, $source);
self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as); self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as, ['Accept: application/octet-stream'], [[CurlHook::class, 'setupGithubToken']]);
break; break;
case 'filelist': // Basic File List (regex based crawler) case 'filelist': // Basic File List (regex based crawler)
[$url, $filename] = self::getFromFileList($name, $source); [$url, $filename] = self::getFromFileList($name, $source);