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

165 lines
4.9 KiB
Bash
Executable File

#!/bin/bash
# Loyal Books Scraper - Start Script
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
LOG_DIR="$SCRIPT_DIR/logs"
mkdir -p "$LOG_DIR"
show_help() {
echo "📚 Loyal Books Scraper - Children Category"
echo ""
echo "Usage:"
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/loyalbooks_children_index.json"
echo " 存储: /home/ubuntu/media/loyalbooks/Children/"
echo " 日志: logs/"
echo ""
echo "存储结构:"
echo " /home/ubuntu/media/loyalbooks/Children/"
echo " └── Book-Name/"
echo " ├── Book-Name.txt"
echo " └── mp3_64kb.zip"
}
case "${1:-help}" in
fetch|index)
echo "🔍 Phase 1: 获取书籍列表..."
echo "抓取 6 页 Children 分类,约 585 本书"
python3 "$SCRIPT_DIR/scripts/fetch_books.py"
;;
download)
echo "📥 Phase 2: 开始下载(前台模式)..."
python3 "$SCRIPT_DIR/scripts/download_books.py"
;;
download-bg|bg)
echo "📥 Phase 2: 开始后台下载..."
# 检查是否已在运行
if pgrep -f "download_books.py" > /dev/null; then
echo "⚠️ 下载进程已在运行"
echo "查看日志: tail -f $LOG_DIR/download.log"
exit 1
fi
# 后台运行
nohup python3 "$SCRIPT_DIR/scripts/download_books.py" \
> "$LOG_DIR/download.log" 2>&1 &
PID=$!
echo "✅ 后台进程已启动 (PID: $PID)"
echo ""
echo "查看状态:"
echo " 实时日志: tail -f $LOG_DIR/download.log"
echo " 停止下载: ./start.sh stop"
;;
status)
echo "📊 下载状态"
echo ""
# 检查进程
if pgrep -f "download_books.py" > /dev/null; then
echo "✅ 后台下载正在运行"
pgrep -f "download_books.py" | xargs ps -o pid,etime,%cpu,%mem,command -p
else
echo "⏹️ 后台下载未运行"
fi
echo ""
# 显示索引统计
if [ -f "$SCRIPT_DIR/config/loyalbooks_children_index.json" ]; then
python3 -c "
import json
import os
with open('$SCRIPT_DIR/config/loyalbooks_children_index.json') as f:
data = json.load(f)
books = data.get('books', [])
pending = len([b for b in books if b['status'] == 'pending'])
downloaded = len([b for b in books if b['status'] == 'downloaded'])
failed = len([b for b in books if b['status'] == 'failed'])
with_txt = sum(1 for b in books if b.get('txt_url'))
with_mp3 = sum(1 for b in books if b.get('mp3_zip_url'))
# 实际目录统计
media_dir = '/home/ubuntu/media/loyalbooks/children'
if os.path.exists(media_dir):
book_dirs = [d for d in os.listdir(media_dir) if os.path.isdir(os.path.join(media_dir, d))]
else:
book_dirs = []
print(f'📚 书籍统计:')
print(f' 总计: {len(books)}')
print(f' 待下载: {pending}')
print(f' 已完成: {downloaded}')
print(f' 失败: {failed}')
print(f'')
print(f'📋 资源可用性:')
print(f' 有 TXT: {with_txt}')
print(f' 有 MP3 ZIP: {with_mp3}')
print(f'')
print(f'📁 存储统计:')
print(f' 书籍目录: {len(book_dirs)}')
print(f'')
print(f'上次索引更新: {data.get(\"fetch_date\", \"unknown\")[:19]}')
"
else
echo "⏳ 索引文件不存在,请先运行: ./start.sh fetch"
fi
echo ""
echo "📁 存储位置: /home/ubuntu/media/loyalbooks/children/"
;;
stop)
echo "⏹️ 停止后台下载..."
if pgrep -f "download_books.py" > /dev/null; then
pkill -f "download_books.py"
echo "✅ 已停止"
else
echo "⚠️ 没有运行的下载进程"
fi
;;
reset)
echo "⚠️ 这将重置索引"
read -p "确定继续? (y/N): " confirm
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
rm -f "$SCRIPT_DIR/config/loyalbooks_children_index.json"
echo "✅ 索引已重置"
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