#!/bin/bash # Library of Short Stories 下载器启动脚本 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" LOG_DIR="$SCRIPT_DIR/logs" mkdir -p "$LOG_DIR" show_help() { echo "📚 Library of Short Stories 下载器" echo "" echo "用法:" echo " ./start.sh fetch # Phase 1: 获取故事索引" echo " ./start.sh download # Phase 2: 开始下载(前台)" echo " ./start.sh download-bg # Phase 2: 后台下载" echo " ./start.sh status # 查看下载状态" echo " ./start.sh stop # 停止后台下载" echo " ./start.sh reset # 重置索引(重新获取链接)" echo "" echo "目录:" echo " 索引: config/stories_index.json" echo " 故事: /home/ubuntu/media/libraryofshortstories/" echo " 日志: logs/" } case "${1:-help}" in fetch|index) echo "🔍 Phase 1: 获取故事索引..." python3 "$SCRIPT_DIR/scripts/fetch_index.py" ;; download) echo "📥 Phase 2: 开始下载(前台模式)..." echo "按 Ctrl+C 可以暂停,下次会继续从断点下载" echo "" python3 "$SCRIPT_DIR/scripts/download_stories.py" ;; download-bg|bg) echo "📥 Phase 2: 开始后台下载..." # 检查是否已在运行 if pgrep -f "download_stories.py" > /dev/null; then echo "⚠️ 下载进程已在运行" echo "查看日志: tail -f $LOG_DIR/download.log" exit 1 fi # 后台运行 nohup python3 "$SCRIPT_DIR/scripts/download_stories.py" \ > "$LOG_DIR/download.log" 2>&1 & PID=$! echo "✅ 后台进程已启动 (PID: $PID)" echo "" echo "查看状态:" echo " 实时日志: tail -f $LOG_DIR/download.log" echo " 查看进程: ps aux | grep download_stories" echo " 停止下载: ./start.sh stop" ;; status) echo "📊 下载状态" echo "" # 检查进程 if pgrep -f "download_stories.py" > /dev/null; then echo "✅ 后台下载正在运行" pgrep -f "download_stories.py" | xargs ps -o pid,etime,%cpu,%mem,command -p else echo "⏹️ 后台下载未运行" fi echo "" # 显示索引统计 if [ -f "$SCRIPT_DIR/config/stories_index.json" ]; then python3 -c " import json import os from datetime import datetime with open('$SCRIPT_DIR/config/stories_index.json') as f: data = json.load(f) stories = data.get('stories', []) pending = len([s for s in stories if s['status'] == 'pending']) downloaded = len([s for s in stories if s['status'] == 'downloaded']) failed = len([s for s in stories if s['status'] == 'failed']) # 实际目录数量 media_dir = '/home/ubuntu/media/libraryofshortstories' if os.path.exists(media_dir): actual_count = len([d for d in os.listdir(media_dir) if os.path.isdir(os.path.join(media_dir, d))]) else: actual_count = 0 # 计算进度和预计时间 total = len(stories) progress = (downloaded / total) * 100 if total > 0 else 0 eta_minutes = (pending * 7) // 60 eta_hours = eta_minutes // 60 eta_remain = eta_minutes % 60 print(f'📚 下载统计:') print(f' 总计: {total}') print(f' 已完成: {downloaded} ({progress:.1f}%)') print(f' 待下载: {pending}') print(f' 失败: {failed}') print(f' 实际目录: {actual_count}') print(f'') if pending > 0: if eta_hours > 0: print(f' 预计剩余: ~{eta_hours}小时{eta_remain}分钟') else: print(f' 预计剩余: ~{eta_remain}分钟') print(f' 上次索引更新: {data.get(\"fetch_date\", \"unknown\")[:19]}') " else echo "❌ 索引文件不存在,请先运行: ./start.sh fetch" fi echo "" echo "📁 存储位置: /home/ubuntu/media/libraryofshortstories/" ;; stop) echo "⏹️ 停止后台下载..." if pgrep -f "download_stories.py" > /dev/null; then pkill -f "download_stories.py" echo "✅ 已停止" else echo "⚠️ 没有运行的下载进程" fi ;; reset) echo "⚠️ 这将重置索引,重新获取链接" read -p "确定继续? (y/N): " confirm if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then rm -f "$SCRIPT_DIR/config/stories_index.json" echo "✅ 索引已重置" echo "现在可以重新运行: ./start.sh fetch" else echo "👋 已取消" fi ;; log|logs) if [ -f "$LOG_DIR/download.log" ]; then tail -50 "$LOG_DIR/download.log" else echo "暂无日志文件" fi ;; help|--help|-h) show_help ;; *) echo "❌ 未知命令: $1" show_help exit 1 ;; esac