e2edce2e29
- Rename kb-workflow to kb_workflow for Python package compatibility - Move bilibili_extractor.py and bilibili_metadata.py to kb_workflow/metadata/ - Create metadata/__init__.py with BilibiliExporter export Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
322 lines
11 KiB
Bash
322 lines
11 KiB
Bash
#!/bin/bash
|
|
# =============================================================================
|
|
# KB Workflow 环境一键安装脚本
|
|
# =============================================================================
|
|
# 功能: 检查并安装 kb-workflow 技能所需的全部环境依赖
|
|
# 支持: Ubuntu/Debian 系统
|
|
#
|
|
# 使用方法:
|
|
# ./install-env.sh # 检查环境并提示安装命令(检查模式)
|
|
# ./install-env.sh --auto # 自动安装所有缺失依赖(自动模式)
|
|
# =============================================================================
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# 日志函数
|
|
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
|
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
log_section() {
|
|
echo ""
|
|
echo -e "${BLUE}========================================${NC}"
|
|
echo -e "${BLUE}$1${NC}"
|
|
echo -e "${BLUE}========================================${NC}"
|
|
}
|
|
|
|
# 获取脚本目录
|
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
DEFAULT_KB_PATH="${HOME}/work/knowledge-base"
|
|
|
|
# 解析参数
|
|
AUTO_MODE=false
|
|
if [ "$1" = "--auto" ]; then
|
|
AUTO_MODE=true
|
|
log_info "自动安装模式"
|
|
fi
|
|
|
|
# 检测 Linux 发行版
|
|
detect_distro() {
|
|
if [ -f /etc/os-release ]; then
|
|
. /etc/os-release
|
|
echo "$ID"
|
|
elif [ -f /etc/debian_version ]; then
|
|
echo "debian"
|
|
elif [ -f /etc/redhat-release ]; then
|
|
echo "rhel"
|
|
fi
|
|
}
|
|
DISTRO=$(detect_distro)
|
|
|
|
# 检查命令是否存在
|
|
command_exists() {
|
|
command -v "$1" > /dev/null 2>&1
|
|
}
|
|
|
|
# 检查 Python 包
|
|
check_python_package() {
|
|
python3 -c "import $1" 2>/dev/null
|
|
}
|
|
|
|
# =============================================================================
|
|
# 1. 检查系统依赖
|
|
# =============================================================================
|
|
log_section "第一步: 检查系统依赖"
|
|
|
|
MISSING_DEPS=()
|
|
|
|
# 检查 Python3
|
|
if command_exists python3; then
|
|
PYTHON_VERSION=$(python3 --version | cut -d' ' -f2)
|
|
log_success "Python3 已安装: $PYTHON_VERSION"
|
|
else
|
|
log_warn "Python3 未安装"
|
|
MISSING_DEPS+=("python3")
|
|
fi
|
|
|
|
# 检查 pip3
|
|
if python3 -m pip --version > /dev/null 2>&1 || command_exists pip3; then
|
|
log_success "pip3 已安装"
|
|
else
|
|
log_warn "pip3 未安装"
|
|
MISSING_DEPS+=("python3-pip")
|
|
fi
|
|
|
|
# 检查 ffmpeg
|
|
if command_exists ffmpeg; then
|
|
log_success "ffmpeg 已安装"
|
|
else
|
|
log_warn "ffmpeg 未安装"
|
|
MISSING_DEPS+=("ffmpeg")
|
|
fi
|
|
|
|
# 检查 tesseract
|
|
if command_exists tesseract; then
|
|
log_success "Tesseract OCR 已安装"
|
|
else
|
|
log_warn "Tesseract OCR 未安装"
|
|
MISSING_DEPS+=("tesseract-ocr")
|
|
fi
|
|
|
|
# 检查 git
|
|
if command_exists git; then
|
|
log_success "Git 已安装"
|
|
else
|
|
log_warn "Git 未安装"
|
|
MISSING_DEPS+=("git")
|
|
fi
|
|
|
|
# =============================================================================
|
|
# 2. 自动安装系统依赖(自动模式)
|
|
# =============================================================================
|
|
if [ ${#MISSING_DEPS[@]} -gt 0 ]; then
|
|
if [ "$AUTO_MODE" = true ]; then
|
|
log_section "自动安装系统依赖"
|
|
log_info "检测到系统: $DISTRO"
|
|
|
|
case "$DISTRO" in
|
|
ubuntu|debian)
|
|
log_info "更新包列表..."
|
|
sudo apt-get update -qq
|
|
|
|
log_info "安装依赖: ${MISSING_DEPS[*]}"
|
|
sudo apt-get install -y -qq "${MISSING_DEPS[@]}" tesseract-ocr-chi-sim tesseract-ocr-eng
|
|
;;
|
|
fedora|rhel|centos)
|
|
log_info "更新包列表..."
|
|
sudo dnf check-update -y || true
|
|
|
|
log_info "安装依赖: ${MISSING_DEPS[*]}"
|
|
sudo dnf install -y "${MISSING_DEPS[@]}" tesseract-langpack-chi_sim tesseract-langpack-eng
|
|
;;
|
|
arch)
|
|
log_info "安装依赖: ${MISSING_DEPS[*]}"
|
|
sudo pacman -S --noconfirm "${MISSING_DEPS[@]}" tesseract-data-chi_sim tesseract-data-eng
|
|
;;
|
|
*)
|
|
log_error "不支持的系统: $DISTRO"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
log_success "系统依赖安装完成"
|
|
MISSING_DEPS=()
|
|
else
|
|
log_section "需要安装的系统依赖"
|
|
echo ""
|
|
echo "检测到以下依赖未安装:"
|
|
for dep in "${MISSING_DEPS[@]}"; do
|
|
echo " - $dep"
|
|
done
|
|
|
|
echo ""
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "请运行以下命令安装:"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
echo -e "${YELLOW}sudo apt-get update${NC}"
|
|
echo -e "${YELLOW}sudo apt-get install -y ${MISSING_DEPS[*]} tesseract-ocr-chi-sim tesseract-ocr-eng${NC}"
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
# =============================================================================
|
|
# 3. 检查 Python 依赖
|
|
# =============================================================================
|
|
log_section "第二步: 检查 Python 依赖"
|
|
|
|
PYTHON_PACKAGES=(
|
|
"httpx:httpx"
|
|
"aiohttp:aiohttp"
|
|
"requests:requests"
|
|
"Pillow:PIL"
|
|
)
|
|
|
|
MISSING_PY_PKGS=()
|
|
|
|
for pkg_info in "${PYTHON_PACKAGES[@]}"; do
|
|
pkg_name=$(echo "$pkg_info" | cut -d':' -f1)
|
|
import_name=$(echo "$pkg_info" | cut -d':' -f2)
|
|
if check_python_package "$import_name" 2>/dev/null; then
|
|
log_success "$pkg_name 已安装"
|
|
else
|
|
log_warn "$pkg_name 未安装"
|
|
MISSING_PY_PKGS+=("$pkg_name")
|
|
fi
|
|
done
|
|
|
|
# 检查特殊包
|
|
check_python_package "playwright" 2>/dev/null && log_success "playwright 已安装" || MISSING_PY_PKGS+=("playwright")
|
|
check_python_package "easyocr" 2>/dev/null && log_success "easyocr 已安装" || MISSING_PY_PKGS+=("easyocr")
|
|
check_python_package "pytesseract" 2>/dev/null && log_success "pytesseract 已安装" || MISSING_PY_PKGS+=("pytesseract")
|
|
|
|
# =============================================================================
|
|
# 4. 自动安装 Python 依赖(自动模式)
|
|
# =============================================================================
|
|
if [ ${#MISSING_PY_PKGS[@]} -gt 0 ]; then
|
|
if [ "$AUTO_MODE" = true ]; then
|
|
log_section "自动安装 Python 包"
|
|
|
|
log_info "安装: ${MISSING_PY_PKGS[*]}"
|
|
pip3 install --user "${MISSING_PY_PKGS[@]}" -q
|
|
|
|
log_success "Python 包安装完成"
|
|
|
|
# 安装 Playwright 浏览器
|
|
if [[ " ${MISSING_PY_PKGS[*]} " =~ " playwright " ]]; then
|
|
log_info "安装 Playwright Chromium 浏览器..."
|
|
python3 -m playwright install chromium
|
|
log_success "Chromium 浏览器安装完成"
|
|
fi
|
|
|
|
MISSING_PY_PKGS=()
|
|
else
|
|
echo ""
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "需要安装以下 Python 包:"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
for pkg in "${MISSING_PY_PKGS[@]}"; do
|
|
echo " - $pkg"
|
|
done
|
|
|
|
echo ""
|
|
echo "请运行以下命令安装:"
|
|
echo ""
|
|
echo -e "${YELLOW}pip3 install --user ${MISSING_PY_PKGS[*]}${NC}"
|
|
|
|
if [[ " ${MISSING_PY_PKGS[*]} " =~ " playwright " ]]; then
|
|
echo ""
|
|
echo -e "${YELLOW}安装完 playwright 后,还需要运行:${NC}"
|
|
echo -e "${YELLOW} python3 -m playwright install chromium${NC}"
|
|
fi
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
# =============================================================================
|
|
# 5. 创建知识库目录结构
|
|
# =============================================================================
|
|
log_section "第三步: 创建知识库目录结构"
|
|
|
|
KB_BASE_PATH="${KB_BASE_PATH:-$DEFAULT_KB_PATH}"
|
|
log_info "知识库路径: $KB_BASE_PATH"
|
|
|
|
mkdir -p "$KB_BASE_PATH"/{archive/{subscriptions,pending},metadata,content/{downloads,subtitles},analyzed}
|
|
log_success "目录结构创建完成"
|
|
|
|
# =============================================================================
|
|
# 6. 环境变量配置提示
|
|
# =============================================================================
|
|
log_section "第四步: 环境变量配置"
|
|
|
|
if [ -z "$KB_BASE_PATH_SET" ]; then
|
|
log_warn "KB_BASE_PATH 环境变量未设置"
|
|
echo ""
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "建议添加到 ~/.bashrc 或 ~/.zshrc:"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
echo -e "${YELLOW}export KB_BASE_PATH=\"$KB_BASE_PATH\"${NC}"
|
|
echo ""
|
|
else
|
|
log_success "KB_BASE_PATH 已设置: $KB_BASE_PATH"
|
|
fi
|
|
|
|
# 创建环境变量示例文件
|
|
ENV_FILE="${SCRIPT_DIR}/.env.example"
|
|
cat > "$ENV_FILE" << 'EOF'
|
|
# KB Workflow 环境变量配置
|
|
export KB_BASE_PATH="~/work/knowledge-base"
|
|
|
|
# 可选: B站 Cookie(用于下载会员视频)
|
|
# export BILIBILI_COOKIE="SESSDATA=xxx; bili_jct=xxx"
|
|
|
|
# 可选: AI 分析配置
|
|
# export AI_API_KEY="your-api-key"
|
|
# export AI_PROVIDER="openai" # 或 zhipu, minimax
|
|
# export AI_MODEL="gpt-4"
|
|
|
|
# 可选: Git 配置
|
|
# export KB_GIT_USER="Your Name"
|
|
# export KB_GIT_EMAIL="your@email.com"
|
|
EOF
|
|
|
|
log_info "环境变量示例已保存到: $ENV_FILE"
|
|
|
|
# =============================================================================
|
|
# 7. 完成总结
|
|
# =============================================================================
|
|
log_section "安装完成"
|
|
|
|
echo ""
|
|
if [ ${#MISSING_DEPS[@]} -eq 0 ] && [ ${#MISSING_PY_PKGS[@]} -eq 0 ]; then
|
|
echo -e "${GREEN}✅ 所有依赖已安装完成!${NC}"
|
|
else
|
|
echo -e "${YELLOW}⚠️ 部分依赖需要手动安装${NC}"
|
|
echo ""
|
|
|
|
if [ ${#MISSING_DEPS[@]} -gt 0 ]; then
|
|
echo "系统依赖:"
|
|
echo -e "${YELLOW}sudo apt-get install -y ${MISSING_DEPS[*]} tesseract-ocr-chi-sim tesseract-ocr-eng${NC}"
|
|
fi
|
|
|
|
if [ ${#MISSING_PY_PKGS[@]} -gt 0 ]; then
|
|
echo ""
|
|
echo "Python 包:"
|
|
echo -e "${YELLOW}pip3 install --user ${MISSING_PY_PKGS[*]}${NC}"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "使用方法:"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo " export KB_BASE_PATH=\"~/work/knowledge-base\"
|
|
echo " python3 kb_workflow.py --check --url \"[URL]\""
|
|
echo ""
|