339 lines
9.5 KiB
Bash
Executable File
339 lines
9.5 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# 《末日重生:开局囤货十亿物资》自动同步管理器
|
||
# 作者:番茄小说创作助手
|
||
# 版本:1.0.0
|
||
|
||
set -e
|
||
|
||
# 配置参数
|
||
NOVEL_DIR="/root/.openclaw/workspace/tomato-novel/books/末日重生-开局囤货十亿物资"
|
||
SUMMARY_DIR="${NOVEL_DIR}/consolidated_summaries"
|
||
GITEA_REPO="gitea"
|
||
LOGFILE="${NOVEL_DIR}/sync_manager.log"
|
||
QC_THRESHOLD=10 # 每10章同步一次
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 日志函数
|
||
log() {
|
||
local level=$1
|
||
local message=$2
|
||
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||
echo -e "${timestamp} [${level}] ${message}" | tee -a "${LOGFILE}"
|
||
if [[ "${level}" == "ERROR" ]]; then
|
||
echo -e "${RED}${message}${NC}"
|
||
elif [[ "${level}" == "WARN" ]]; then
|
||
echo -e "${YELLOW}${message}${NC}"
|
||
elif [[ "${level}" == "INFO" ]]; then
|
||
echo -e "${GREEN}${message}${NC}"
|
||
fi
|
||
}
|
||
|
||
# 检查章节数量
|
||
check_chapter_count() {
|
||
local total_chapters=$(ls -1 "${NOVEL_DIR}/chapters"/*.md | wc -l)
|
||
local last_chapter=$(ls -1 "${NOVEL_DIR}/chapters"/*.md | tail -1 | grep -o '[0-9][0-9][0-9][0-9]' | head -1)
|
||
|
||
echo "章节统计:"
|
||
echo " - 总章节数: ${total_chapters} 章"
|
||
echo " - 最新章节: 第${last_chapter}章"
|
||
|
||
# 计算是否需要同步(每10章)
|
||
local sync_needed=$(( (${total_chapters} % ${QC_THRESHOLD}) == 0 ? 1 : 0 ))
|
||
|
||
if [[ ${sync_needed} -eq 1 ]]; then
|
||
log "INFO" "检测到章节数量为10的倍数,需要同步摘要报告"
|
||
return 0
|
||
else
|
||
log "INFO" "章节数量正常,未达到同步阈值"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 监控修复章节完整性
|
||
monitor_fixed_chapters() {
|
||
local fixed_chapters="0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014"
|
||
local damaged_count=0
|
||
|
||
log "INFO" "开始监控修复章节完整性..."
|
||
|
||
for chap in ${fixed_chapters}; do
|
||
local chapter_file="${NOVEL_DIR}/chapters/${chap}_*.md"
|
||
if [ -f "${chapter_file}" ]; then
|
||
local file_size=$(stat -c%s "${chapter_file}" 2>/dev/null || stat -f%z "${chapter_file}")
|
||
|
||
if [[ ${file_size} -lt 1024 ]]; then # 小于1KB
|
||
log "WARN" "章节 ${chap} 文件过小: ${file_size} 字节"
|
||
damaged_count=$((damaged_count+1))
|
||
elif [[ ${file_size} -eq 0 ]]; then
|
||
log "ERROR" "章节 ${chap} 文件为空!"
|
||
damaged_count=$((damaged_count+1))
|
||
fi
|
||
else
|
||
log "ERROR" "章节 ${chap} 文件丢失!"
|
||
damaged_count=$((damaged_count+1))
|
||
fi
|
||
done
|
||
|
||
if [[ ${damaged_count} -eq 0 ]]; then
|
||
log "INFO" "所有修复章节完整性检查通过!"
|
||
return 0
|
||
else
|
||
log "ERROR" "发现 ${damaged_count} 个修复章节存在问题!"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 生成摘要报告
|
||
generate_summary_report() {
|
||
log "INFO" "开始生成完整摘要报告..."
|
||
|
||
# 检查章节数量
|
||
local total_chapters=$(ls -1 "${NOVEL_DIR}/chapters"/*.md | wc -l)
|
||
local last_chapter=$(ls -1 "${NOVEL_DIR}/chapters"/*.md | tail -1 | grep -o '[0-9][0-9][0-9][0-9]' | head -1)
|
||
|
||
# 创建最新的摘要报告
|
||
local summary_file="${SUMMARY_DIR}/complete_chapter_summaries.md"
|
||
|
||
cat > "${summary_file}" << EOF
|
||
# 《末日重生:开局囤货十亿物资》完整章节剧情摘要
|
||
## 整合时间:$(date '+%Y-%m-%d %H:%M:%S')
|
||
## 总章节数:${total_chapters}章
|
||
|
||
## 📊 故事概述
|
||
|
||
**末世重生题材**:主角陈末重生回到末日降临前30天,利用先知先觉疯狂囤积十亿物资,建立顶级安全屋,在冰河末世中生存并崛起。
|
||
|
||
## 📚 章节详细摘要(基于最新快照)
|
||
|
||
**当前章节数量**: ${total_chapters}章
|
||
**最新章节**: 第${last_chapter}章
|
||
**统计时间**: $(date '+%Y-%m-%d %H:%M:%S')
|
||
|
||
### 章节状态总结
|
||
- **总章节数**: ${total_chapters}章
|
||
- **已修复章节**: 2-14章
|
||
- **后续章节**: ${last_chapter}章
|
||
- **总行数**: 章节正在统计中
|
||
- **同步状态: 待同步**
|
||
|
||
---
|
||
|
||
*摘要报告由番茄小说创作助手自动生成*
|
||
*同步时间: $(date '+%Y-%m-%d %H:%M:%S')*
|
||
EOF
|
||
|
||
log "INFO" "摘要报告生成完成:${summary_file}"
|
||
}
|
||
|
||
# 执行同步到Gitea
|
||
sync_to_gitea() {
|
||
log "INFO" "开始同步到Gitea仓库..."
|
||
|
||
# 切换到小说目录
|
||
cd "${NOVEL_DIR}"
|
||
|
||
# 检查git状态
|
||
if ! git status &>/dev/null; then
|
||
log "ERROR" "Git仓库未初始化"
|
||
return 1
|
||
fi
|
||
|
||
# 检查远程仓库
|
||
if ! git remote | grep -q "${GITEA_REPO}"; then
|
||
log "ERROR" "Gitea远程仓库未配置"
|
||
return 1
|
||
fi
|
||
|
||
# 添加所有更改
|
||
git add . 2>/dev/null || true
|
||
|
||
# 检查是否有更改
|
||
if git diff --cached --quiet; then
|
||
log "INFO" "没有更改需要提交"
|
||
return 0
|
||
fi
|
||
|
||
# 提交更改
|
||
local commit_message="自动同步:章节完整性检查和摘要报告更新
|
||
|
||
- 章节总数: $(ls -1 "chapters"/*.md | wc -l) 章
|
||
- 修复章节检查完成
|
||
- 摘要报告更新完成
|
||
- 同步时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
||
|
||
git commit -m "${commit_message}" || {
|
||
log "ERROR" "提交失败"
|
||
return 1
|
||
}
|
||
|
||
# 推送到远程仓库
|
||
log "INFO" "正在推送到 Gitea 仓库..."
|
||
if git push "${GITEA_REPO}" master; then
|
||
log "INFO" "同步到Gitea仓库成功!"
|
||
return 0
|
||
else
|
||
log "ERROR" "推送到Gitea仓库失败!"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 创建本地备份
|
||
create_local_backup() {
|
||
local backup_dir="${NOVEL_DIR}/backups/$(date '+%Y%m%d_%H%M%S')"
|
||
|
||
log "INFO" "创建本地备份到: ${backup_dir}"
|
||
|
||
mkdir -p "${backup_dir}"
|
||
|
||
# 备份章节文件
|
||
cp -r "${NOVEL_DIR}/chapters" "${backup_dir}/"
|
||
|
||
# 备份摘要报告
|
||
cp -r "${SUMMARY_DIR}" "${backup_dir}/"
|
||
|
||
# 备份状态文件
|
||
cp "${NOVEL_DIR}/story/"*.md "${backup_dir}/" 2>/dev/null || true
|
||
|
||
# 创建备份报告
|
||
cat > "${backup_dir}/backup_report.md" << EOF
|
||
# 本地备份报告
|
||
|
||
## 备份信息
|
||
- **备份时间**: $(date '+%Y-%m-%d %H:%M:%S')
|
||
- **备份目录**: $(basename ${backup_dir})
|
||
- **备份类型**: 本地完整备份
|
||
|
||
## 备份内容
|
||
### 章节文件
|
||
- 数量: $(ls -1 "chapters"/*.md 2>/dev/null | wc -l) 章
|
||
- 路径: ${NOVEL_DIR}/chapters/
|
||
|
||
### 摘要报告
|
||
- 文件: complete_chapter_summaries.md
|
||
- 路径: ${SUMMARY_DIR}/
|
||
|
||
### 状态文件
|
||
- 路径: ${NOVEL_DIR}/story/
|
||
|
||
|
||
## 小说状态
|
||
- 总章节数: $(ls -1 "chapters"/*.md 2>/dev/null | wc -l) 章
|
||
- 最新章节: 第$(ls -1 "chapters"/*.md 2>/dev/null | tail -1 | grep -o '[0-9][0-9][0-9][0-9]' | head -1)章
|
||
- 数据量: 章节文件总计
|
||
|
||
## 恢复指南
|
||
如需恢复备份,请执行:
|
||
\`\`\`bash
|
||
# 停止正在运行的小说相关进程
|
||
# 复制备份文件
|
||
cp -r ${backup_dir}/chapters ${NOVEL_DIR}/
|
||
cp -r ${backup_dir}/consolidated_summaries ${NOVEL_DIR}/
|
||
cp ${backup_dir}/story/*.md ${NOVEL_DIR}/story/ 2>/dev/null || true
|
||
\`\`\`
|
||
|
||
|
||
---
|
||
|
||
*备份时间: $(date '+%Y-%m-%d %H:%M:%S')*
|
||
*番茄小说创作助手*
|
||
EOF
|
||
|
||
# 压缩备份
|
||
tar -czf "${backup_dir}.tar.gz" -C "${NOVEL_DIR}/backups" "$(basename ${backup_dir})"
|
||
|
||
log "INFO" "本地备份完成:${backup_dir}.tar.gz"
|
||
}
|
||
|
||
# 主执行函数
|
||
main() {
|
||
log "INFO" "《末日重生:开局囤货十亿物资》同步管理器启动"
|
||
log "INFO" "=============================================="
|
||
|
||
# 创建日志目录
|
||
mkdir -p "$(dirname "${LOGFILE}")"
|
||
|
||
# 步骤1:监控章节完整性
|
||
if check_chapter_count; then
|
||
log "INFO" "检测到需要同步,继续执行..."
|
||
|
||
# 步骤2:监控修复章节
|
||
if monitor_fixed_chapters; then
|
||
log "INFO" "修复章节检查通过,继续执行..."
|
||
else
|
||
log "ERROR" "修复章节存在问题,需要检查!"
|
||
exit 1
|
||
fi
|
||
|
||
# 步骤3:生成摘要报告
|
||
generate_summary_report
|
||
|
||
# 步骤4:同步到Gitea
|
||
if sync_to_gitea; then
|
||
log "INFO" "Gitea同步成功!"
|
||
else
|
||
log "ERROR" "Gitea同步失败"
|
||
exit 1
|
||
fi
|
||
|
||
# 步骤5:创建本地备份(每周执行一次)
|
||
if [[ $(date '+%u') -eq 7 ]]; then # 周日执行
|
||
log "INFO" "周日自动创建本地备份..."
|
||
create_local_backup
|
||
fi
|
||
|
||
log "INFO" "所有同步任务完成!"
|
||
log "INFO" "访问 Gitea 仓库: https://gitea.nevadalice.top:226/liyuchen/novel-doomsday-resurgence"
|
||
|
||
else
|
||
log "INFO" "当前不需要同步,跳过主要同步任务"
|
||
|
||
# 只监控修复章节完整性
|
||
monitor_fixed_chapters
|
||
|
||
log "INFO" "快速完整性检查完成"
|
||
fi
|
||
|
||
log "INFO" "同步管理器执行完毕"
|
||
log "INFO" "=============================================="
|
||
}
|
||
|
||
# 检查执行模式
|
||
if [[ "$1" == "--manual" ]]; then
|
||
# 手动模式
|
||
log "INFO" "手动模式启动"
|
||
shift
|
||
case "$1" in
|
||
"sync")
|
||
generate_summary_report
|
||
sync_to_gitea
|
||
;;
|
||
"backup")
|
||
create_local_backup
|
||
;;
|
||
"check")
|
||
check_chapter_count
|
||
monitor_fixed_chapters
|
||
;;
|
||
"all")
|
||
generate_summary_report
|
||
sync_to_gitea
|
||
create_local_backup
|
||
;;
|
||
*)
|
||
echo "用法: $0 --manual {sync|backup|check|all}"
|
||
exit 1
|
||
;;
|
||
esac
|
||
else
|
||
# 自动模式
|
||
main
|
||
fi
|
||
|
||
exit 0 |