From fae7a75f7da5c20c26735295723ddfb5f867a837 Mon Sep 17 00:00:00 2001 From: wnlen <62139570+wnlen@users.noreply.github.com> Date: Wed, 29 Apr 2026 17:33:26 +0800 Subject: [PATCH] optimize: show fixed progress bar for subscription download --- scripts/core/config.sh | 77 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/scripts/core/config.sh b/scripts/core/config.sh index 14a36b0..6f06bff 100644 --- a/scripts/core/config.sh +++ b/scripts/core/config.sh @@ -576,6 +576,78 @@ download_candidate_fetch() { "$url" } +subscription_fake_progress_bar() { + local pid="$1" + local width=72 + local percent=3 + local filled bar + + while kill -0 "$pid" 2>/dev/null; do + percent=$((percent + 5)) + [ "$percent" -gt 94 ] && percent=94 + + filled=$((percent * width / 100)) + bar="$(printf '%*s' "$filled" '' | tr ' ' '#')" + + printf '\r%-72s %3d.0%%' "$bar" "$percent" + sleep 0.2 + done +} + +subscription_fake_progress_done() { + printf '\r######################################################################## 100.0%%\n' +} + +download_subscription_fetch_quiet() { + local url="$1" + local out="$2" + local ua="${__CLASH_DOWNLOAD_UA:-}" + + curl_download \ + --silent \ + --show-error \ + --fail \ + --location \ + --connect-timeout "$(download_connect_timeout)" \ + --max-time "$(download_max_time)" \ + --retry 1 \ + ${ua:+-A "$ua"} \ + --output "$out" \ + "$url" +} + +download_subscription_file() { + local url="$1" + local out="$2" + local fetch_tmp pid rc + + mkdir -p "$(dirname "$out")" + rm -f "$out" 2>/dev/null || true + + fetch_tmp="$(mktemp)" + rm -f "$fetch_tmp" 2>/dev/null || true + + ui_download "正在下载:subscription" + + download_subscription_fetch_quiet "$url" "$fetch_tmp" & + pid="$!" + + subscription_fake_progress_bar "$pid" + + wait "$pid" + rc="$?" + + if [ "$rc" -eq 0 ]; then + subscription_fake_progress_done + mv -f "$fetch_tmp" "$out" + return 0 + fi + + printf '\n' + rm -f "$fetch_tmp" 2>/dev/null || true + return "$rc" +} + download_subscription_yaml() { local url="$1" local out_file="$2" @@ -596,10 +668,9 @@ download_subscription_yaml() { require_subscription_fetch_allowed "$fetch_reason" "$url" __CLASH_DOWNLOAD_UA="$(subconverter_subscription_user_agent)" \ - download_file \ + download_subscription_file \ "$url" \ - "$out_file" \ - "subscription" + "$out_file" subscription_cache_store "$url" "$fmt" "$out_file" "$url" ;;