165 lines
4.9 KiB
Bash
Executable File
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
|