novel-doomsday-resurgence/skills/fanfic-writer/scripts/merge_book.py

92 lines
3.5 KiB
Python
Raw Permalink Normal View History

"""Merge Book - Combine all chapters into final book with full book quality check"""
import json
from pathlib import Path
from datetime import datetime
def merge_chapters(book_dir, output_filename=None):
book_dir = Path(book_dir)
chapters_dir = book_dir / "chapters"
final_dir = book_dir / "final"
final_dir.mkdir(exist_ok=True)
with open(book_dir / "0-book-config.json", 'r', encoding='utf-8') as f:
config = json.load(f)
chapter_files = sorted(chapters_dir.glob("第*.txt"))
if not chapter_files:
return None
merged = [f"{config['title']}", "", f"{len(chapter_files)}", "="*60, ""]
total = 0
for cf in chapter_files:
with open(cf, 'r', encoding='utf-8') as f:
c = f.read()
total += len(c)
merged.extend([f"\n{'='*60}\n", c, ""])
merged.extend(["="*60, f"总字数: {total:,}", ""])
out = output_filename or f"{config['title']}_完整版.txt"
out_path = final_dir / out
with open(out_path, 'w', encoding='utf-8') as f:
f.write("\n".join(merged))
config.update({"status": "merged", "completed_words": total, "completed_at": datetime.now().isoformat()})
with open(book_dir / "0-book-config.json", 'w', encoding='utf-8') as f:
json.dump(config, f, indent=2, ensure_ascii=False)
print(f"Merged: {out_path}")
return out_path, total
def full_book_quality_check(book_dir):
"""整书质量检查:设定一致性、大纲符合度、剧情逻辑、人物性格、伏笔回收"""
book_dir = Path(book_dir)
with open(book_dir / "0-book-config.json", 'r', encoding='utf-8') as f:
config = json.load(f)
with open(book_dir / "1-main-outline.md", 'r', encoding='utf-8') as f:
outline = f.read()
with open(book_dir / "3-world-building.md", 'r', encoding='utf-8') as f:
world = f.read()
with open(book_dir / "2-chapter-plan.json", 'r', encoding='utf-8') as f:
plan = json.load(f)
chapters = []
for cf in sorted((book_dir / "chapters").glob("第*.txt")):
with open(cf, 'r', encoding='utf-8') as f:
chapters.append(f"=== {cf.name} ===\n{f.read()}")
prompt = f"""【整书质量检查】书名:《{config['title']}
大纲{outline[:3000]}...
设定{world[:3000]}...
章节{len(plan.get('chapters',[]))}
正文{''.join(chapters)[:5000]}...后续省略
检查1设定一致性 2大纲符合度 3剧情逻辑 4人物性格 5伏笔回收
输出JSON: {{"status": "PASS/NEEDS_REVISION", "issues": []}}"""
check_file = book_dir / "final" / "full_book_check_prompt.txt"
check_file.parent.mkdir(exist_ok=True)
with open(check_file, 'w', encoding='utf-8') as f:
f.write(prompt)
result = {"book_title": config['title'], "status": "pending", "prompt_file": str(check_file),
"dimensions": {k: {"status": "pending", "issues": []} for k in
["setting", "outline", "logic", "character", "foreshadowing"]}}
res_file = book_dir / "final" / "full_book_check.json"
with open(res_file, 'w', encoding='utf-8') as f:
json.dump(result, f, indent=2, ensure_ascii=False)
print(f"整书检查提示词: {check_file}")
return result
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print("Usage: merge_book.py <book_dir> [check]")
sys.exit(1)
merge_chapters(sys.argv[1])
if len(sys.argv) > 2 and sys.argv[2] == "check":
full_book_quality_check(sys.argv[1])