automa/minecraft/scripts/automatic/download-mods.sh

128 lines
3.3 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 加载日志模块
source "$(dirname "$0")/logger.sh"
MODS_FILE="./requirements.txt"
MODS_DIR="./data/mods"
# 初始化日志
main init
log_start "Minecraft 1.21.1 Fabric Mods 下载"
START_TIME=$(date +%s)
mkdir -p $MODS_DIR
log_info "开始下载 Minecraft 1.21.1 Fabric mods..."
log_info "Mods 文件: $MODS_FILE"
log_info "目标目录: $MODS_DIR"
# 测试网络连接
log_info "测试 Modrinth API 连接..."
if ! curl -s "https://api.modrinth.com/v2/project/fabric-api" >/dev/null; then
log_error "无法连接到 Modrinth API请检查网络"
exit 1
fi
log_success "API 连接正常"
download_mod() {
local project_slug="$1"
local mod_name="$2"
log_info "正在处理: $mod_name ($project_slug)"
# 获取项目信息
project_info=$(curl -s "https://api.modrinth.com/v2/project/$project_slug")
if [[ $? -ne 0 || -z "$project_info" ]]; then
log_error "无法获取项目信息: $project_slug"
return 1
fi
# 获取版本信息
versions_url="https://api.modrinth.com/v2/project/$project_slug/version?game_versions=%5B%221.21.1%22%5D&loaders=%5B%22fabric%22%5D"
log_info "获取版本信息..."
versions_response=$(curl -s "$versions_url")
if [[ $? -ne 0 || -z "$versions_response" ]]; then
log_error "无法获取版本信息"
return 1
fi
# 检查是否返回空数组
if [[ "$versions_response" == "[]" ]]; then
log_warning "没有找到 1.21.1 Fabric 版本的 $mod_name"
return 1
fi
# 提取最新版本的信息
filename=$(echo "$versions_response" | grep -o '"filename":"[^"]*"' | head -1 | cut -d'"' -f4)
download_url=$(echo "$versions_response" | grep -o '"url":"[^"]*"' | head -1 | cut -d'"' -f4)
if [[ -z "$filename" || -z "$download_url" ]]; then
log_error "无法解析下载信息"
return 1
fi
log_info "文件名: $filename"
log_info "下载链接: $download_url"
# 下载文件
log_info "下载中..."
if curl -L -o "$MODS_DIR/$filename" "$download_url"; then
file_size=$(stat -c%s "$MODS_DIR/$filename" 2>/dev/null || stat -f%z "$MODS_DIR/$filename" 2>/dev/null)
if [[ $file_size -gt 1000 ]]; then
log_success "成功下载: $filename ($(($file_size / 1024)) KB)"
return 0
else
log_error "文件大小异常: $filename (只有 $file_size 字节)"
rm -f "$MODS_DIR/$filename"
return 1
fi
else
log_error "下载失败"
return 1
fi
}
# 读取 mods 文件
success_count=0
fail_count=0
while IFS='|' read -r mod_name project_slug version; do
# 去除空白字符
mod_name=$(echo "$mod_name" | xargs)
project_slug=$(echo "$project_slug" | xargs)
version=$(echo "$version" | xargs)
# 跳过空行和注释
if [[ -z "$mod_name" || "$mod_name" == \#* ]]; then
continue
fi
log_separator
if download_mod "$project_slug" "$mod_name"; then
((success_count++))
else
((fail_count++))
fi
sleep 1
done <"$MODS_FILE"
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
log_separator
log_info "Minecraft 1.21.1 Fabric mods 下载完成!"
log_info "位置: $MODS_DIR"
log_info "统计: 成功 $success_count, 失败 $fail_count"
# 记录最终文件列表
log_info "最终文件列表:"
ls -la "$MODS_DIR" >>"$LOG_FILE" 2>/dev/null
log_command "ls -la \"$MODS_DIR\""
log_end 0 "$DURATION"
show_log_location