Files
nanocode/libraryofshortstories-scraper/start.sh
T
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

166 lines
5.1 KiB
Bash
Executable File

#!/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