78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
|
|
"""
|
|||
|
|
一次性脚本:将 AI 生成的内容摘要卡写入 episodes 表的 content_digest 字段
|
|||
|
|
数据来源:ai-labeling/experiments/content_digests/_all_digests.json
|
|||
|
|
前置:先手动执行 backend/sql/004_add_content_digest.sql 添加字段
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import sys
|
|||
|
|
import os
|
|||
|
|
import json
|
|||
|
|
from datetime import date
|
|||
|
|
|
|||
|
|
# Windows 终端中文输出
|
|||
|
|
sys.stdout.reconfigure(encoding='utf-8')
|
|||
|
|
sys.stderr.reconfigure(encoding='utf-8')
|
|||
|
|
|
|||
|
|
# 加 backend 到 path
|
|||
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'backend'))
|
|||
|
|
|
|||
|
|
from app.db.session import get_session
|
|||
|
|
from app.models.episode import Episode
|
|||
|
|
from app.models.user import User # FK 解析需要
|
|||
|
|
from sqlmodel import select
|
|||
|
|
|
|||
|
|
# ── 1. 读 digest 数据 ──
|
|||
|
|
project_root = os.path.join(os.path.dirname(__file__), '..')
|
|||
|
|
digest_file = os.path.join(project_root, 'ai-labeling', 'experiments', 'content_digests', '_all_digests.json')
|
|||
|
|
|
|||
|
|
with open(digest_file, 'r', encoding='utf-8') as f:
|
|||
|
|
all_digests = json.load(f)
|
|||
|
|
|
|||
|
|
print(f"读入 {len(all_digests)} 条摘要记录")
|
|||
|
|
|
|||
|
|
# ── 2. 逐条匹配并写入 ──
|
|||
|
|
session = next(get_session())
|
|||
|
|
success = 0
|
|||
|
|
skipped = 0
|
|||
|
|
mismatch = 0
|
|||
|
|
|
|||
|
|
for d in all_digests:
|
|||
|
|
ep_num = d['ep']
|
|||
|
|
digest_date = d['date'] # "2026-04-21" 格式
|
|||
|
|
|
|||
|
|
# 查 episode
|
|||
|
|
ep = session.exec(select(Episode).where(Episode.episode_number == ep_num)).first()
|
|||
|
|
if not ep:
|
|||
|
|
print(f"⚠️ ep{ep_num:02d} 在数据库中不存在,跳过")
|
|||
|
|
skipped += 1
|
|||
|
|
continue
|
|||
|
|
|
|||
|
|
# 校验日期
|
|||
|
|
if str(ep.air_date) != digest_date:
|
|||
|
|
print(f"⚠️ ep{ep_num:02d} 日期不匹配: DB={ep.air_date}, digest={digest_date},跳过")
|
|||
|
|
mismatch += 1
|
|||
|
|
continue
|
|||
|
|
|
|||
|
|
# 写入(只存 digest 字段,不存外壳的 ep/date/title/editor/filename/generated_at)
|
|||
|
|
ep.content_digest = d['digest']
|
|||
|
|
session.add(ep)
|
|||
|
|
success += 1
|
|||
|
|
print(f"✅ ep{ep_num:02d} {ep.program_name} <- digest 已写入")
|
|||
|
|
|
|||
|
|
session.commit()
|
|||
|
|
|
|||
|
|
# ── 3. 打印统计 ──
|
|||
|
|
print()
|
|||
|
|
print(f"=== 统计 ===")
|
|||
|
|
print(f"成功写入: {success}")
|
|||
|
|
print(f"跳过(不存在): {skipped}")
|
|||
|
|
print(f"跳过(日期不匹配): {mismatch}")
|
|||
|
|
print(f"总记录: {len(all_digests)}")
|
|||
|
|
|
|||
|
|
# ── 4. 验证:所有 episodes 的 content_digest 状态 ──
|
|||
|
|
print()
|
|||
|
|
print(f"=== 验证: episodes content_digest 状态 ===")
|
|||
|
|
all_eps = session.exec(select(Episode).order_by(Episode.episode_number)).all()
|
|||
|
|
for e in all_eps:
|
|||
|
|
has_digest = "✅" if e.content_digest is not None else "❌"
|
|||
|
|
print(f"ep{e.episode_number:02d} | {e.program_name} | {e.air_date} | digest: {has_digest}")
|