#!/usr/bin/env bash
# ============================================================
# 下载 Civitai 模型: Qwen-Image NSFW (model 1896397)
# 版本: META4 - Helm (version 2166441) / 文件 2059728
# 文件: Qwen-Image-Helm_v0.1.safetensors (576322.71875 KB = 590,154,464 B)
# 模型页: https://civitai.red/models/1896397/qwen-image-nsfw
# 网络: b2.civitai.com 本地 DNS 被污染，必须走 v2ray 代理 127.0.0.1:10809
# ============================================================
set -uo pipefail

OUT_DIR="/home/zyw/Downloads/xunlei-downloads"
OUT="$OUT_DIR/Qwen-Image-Helm_v0.1.safetensors"
LOG="$OUT_DIR/qwen-image-nsfw-helm-download.log"
KEY_FILE="/home/zyw/Downloads/civitai_api_key.txt"
VERSION_URL="https://civitai.red/api/download/models/2166441?fileId=2059728"
PROXY="http://127.0.0.1:10809"
EXPECTED_SIZE=590154464
EXPECTED_SHA256="0989FA5CD12A02B77A46DD749F5B0F5B3AFEBCC57B63BF46BE6845AD81BE6F5F"

log() { echo "[$(date '+%F %T %z')] $*" >> "$LOG"; }

log "=== 任务启动 pid=$$ ==="

# 幂等：已完整下载则退出
if [ -f "$OUT" ]; then
  S=$(sha256sum "$OUT" | awk '{print $1}')
  if [ "${S,,}" = "${EXPECTED_SHA256,,}" ]; then
    log "文件已存在且校验通过，跳过: $OUT"
    exit 0
  fi
fi

[ -f "$KEY_FILE" ] || { log "!!! 找不到 API key: $KEY_FILE"; exit 1; }
KEY=$(cat "$KEY_FILE")

ok=0
for i in $(seq 1 6); do
  log "第 $i/6 次尝试：获取签名 URL"
  HDR=$(curl -s --noproxy '*' -m 90 -D - -o /dev/null -H "Authorization: Bearer $KEY" "$VERSION_URL")
  LOC=$(echo "$HDR" | tr -d '\r' | grep -i '^location:' | sed 's/^[Ll]ocation: //' | tail -1)
  if [ -z "$LOC" ]; then
    log "拿不到签名 URL，响应码: $(echo "$HDR" | head -1)"
    sleep 15
    continue
  fi

  # 断点续传下载（经 v2ray 代理）
  curl -x "$PROXY" -sL -m 3600 -C - -o "$OUT.part" "$LOC"
  RC=$?
  SIZE=$(stat -c %s "$OUT.part" 2>/dev/null || echo 0)
  log "curl rc=$RC, size=$SIZE / 期望 $EXPECTED_SIZE"

  if [ "$SIZE" -eq "$EXPECTED_SIZE" ]; then
    ok=1
    break
  fi
  log "大小不符，15 秒后重试（断点续传）"
  sleep 15
done

if [ "$ok" != "1" ]; then
  log "!!! 下载失败（6 次尝试后仍未完成）"
  exit 1
fi

SHA=$(sha256sum "$OUT.part" | awk '{print $1}')
log "SHA256=$SHA"
# 注意：sha256sum 输出小写，API 返回大写 → 必须忽略大小写比较
if [ "${SHA,,}" = "${EXPECTED_SHA256,,}" ]; then
  mv "$OUT.part" "$OUT"
  log "=== ✅ 下载完成且校验通过: $OUT ($EXPECTED_SIZE bytes) ==="
  exit 0
else
  log "!!! SHA256 不匹配！期望 $EXPECTED_SHA256"
  exit 1
fi
