166 lines
5.1 KiB
Bash
Executable File
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
|