79 lines
2.9 KiB
Bash
79 lines
2.9 KiB
Bash
#!/bin/bash
|
|
. /usr/share/openclash/log.sh
|
|
|
|
DOWNLOAD_FILE_CURL() {
|
|
[ -z "$1" ] || [ -z "$2" ] && return 1
|
|
DOWNLOAD_URL=$1
|
|
DOWNLOAD_PATH=$2
|
|
DOWNLOAD_UA=$3
|
|
[ -z "$DOWNLOAD_UA" ] && DOWNLOAD_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
|
|
|
|
if [ "$SHOW_DOWNLOAD_PROGRESS" = "1" ] || [ "$SHOW_DOWNLOAD_PROGRESS" = "true" ]; then
|
|
TEMP_LOG="/tmp/curl_log_$$"
|
|
|
|
LOG_OUT "Downloading:【$(basename "$DOWNLOAD_PATH") - 0%】"
|
|
|
|
(
|
|
curl -# -L --connect-timeout 10 -m 60 --speed-time 20 --speed-limit 1 --retry 2 \
|
|
-H "User-Agent: ${DOWNLOAD_UA}" \
|
|
"$DOWNLOAD_URL" -o "$DOWNLOAD_PATH" 2>"$TEMP_LOG"
|
|
echo $? > "${TEMP_LOG}.exit"
|
|
) &
|
|
|
|
CURL_PID=$!
|
|
LAST_PROGRESS=-1
|
|
|
|
while kill -0 $CURL_PID 2>/dev/null; do
|
|
if [ -f "$TEMP_LOG" ]; then
|
|
PROGRESS_LINE=$(tr '\r' '\n' < "$TEMP_LOG" | grep '%' | tail -n 1)
|
|
if [ -n "$PROGRESS_LINE" ]; then
|
|
PROGRESS=$(echo "$PROGRESS_LINE" | grep -oE '[0-9]{1,3}(\.[0-9]+)?' | tail -n 1 | cut -d. -f1)
|
|
fi
|
|
|
|
if [ -n "$PROGRESS" ] && [ "$PROGRESS" -ne "$LAST_PROGRESS" ]; then
|
|
if [ "$PROGRESS" -gt "$LAST_PROGRESS" ]; then
|
|
LOG_OUT "Downloading:【$(basename "$DOWNLOAD_PATH") - ${PROGRESS}%】"
|
|
LAST_PROGRESS="$PROGRESS"
|
|
fi
|
|
fi
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
wait $CURL_PID
|
|
EXIR_CODE=$(cat "${TEMP_LOG}.exit" 2>/dev/null || echo "1")
|
|
|
|
if [ "$EXIR_CODE" -eq 0 ] && [ "$LAST_PROGRESS" -ne 100 ]; then
|
|
LOG_OUT "Downloading:【$(basename "$DOWNLOAD_PATH") - 100%】"
|
|
fi
|
|
|
|
if [ "$EXIR_CODE" -ne 0 ]; then
|
|
OUTPUT=$(tr '\r' '\n' < "$TEMP_LOG" | grep -a 'curl:' | tail -n 1 | sed 's/.*curl:/curl:/')
|
|
fi
|
|
|
|
rm -f "$TEMP_LOG" "${TEMP_LOG}.exit"
|
|
|
|
if [ "$EXIR_CODE" -ne 0 ]; then
|
|
LOG_OUT "【$DOWNLOAD_PATH】Download Failed:【$OUTPUT】"
|
|
rm -rf $DOWNLOAD_PATH
|
|
SLOG_CLEAN
|
|
return 1
|
|
else
|
|
return 0
|
|
fi
|
|
else
|
|
CURL_OUTPUT=$(curl -w "\n%{http_code}" -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 -H "User-Agent: ${DOWNLOAD_UA}" "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH" 2>&1)
|
|
EXIR_CODE=${PIPESTATUS[0]}
|
|
HTTP_CODE=$(echo "$CURL_OUTPUT" | tail -n1)
|
|
|
|
if [ "$EXIR_CODE" -ne 0 ] || [ "$HTTP_CODE" -ne 200 ]; then
|
|
OUTPUT=$(echo "$CURL_OUTPUT" | sed '$d' | grep -a 'curl:' | tail -n 1)
|
|
LOG_OUT "【$DOWNLOAD_PATH】Download Failed:【$OUTPUT】"
|
|
rm -rf $DOWNLOAD_PATH
|
|
SLOG_CLEAN
|
|
return 1
|
|
else
|
|
return 0
|
|
fi
|
|
fi
|
|
} |