《新闻联播》每日抓取入库:全链路 + 可移植化 + 定时任务
从 CCTV 主页抓取《新闻联播》,下载 → 转 MP3/WAV → 静音切分 → ASR 识别 → LLM 校对 → 切分为单条新闻 → 入库 MySQL。 主要内容: - 全链路:getVideo5 抓取下载、audioRead 转写、deepseek 校对与切分、newsProcess 入库 - 可移植化:配置分层,.env 只放密钥、config.yml 放模型/接入点/路由/参数 - 可换供应商:endpoints(kind/base_url/api_key_env/extra_body)+ routes 按环节选路 - 数据保真:数值事实守卫,校对改动数字/年份/届次则整片回退 ASR 原文; 识别不完整不发布该日精编,避免半天内容被当成完整一天 - 定时任务:systemd 每天 21:00,失败 21:30 / 22:00 重试; 只缺切分时只重跑切分(省掉全部 ASR),用 state/.asr_complete_* 标记判定阶段 - 隧道自愈:13306 不通时自动执行 autossh.sh(所有入口共用,systemd 托管时只等待) - 中间产物每日清理;97 项离线自检(配置/清理/事实守卫/解析/隧道)
This commit is contained in:
Executable
+52
@@ -0,0 +1,52 @@
|
||||
"""查询某天数据完成度,供重试逻辑判断"该重跑哪个阶段"
|
||||
|
||||
.venv/bin/python scripts/day_status.py 2026-09-24
|
||||
|
||||
退出码:
|
||||
0 已有精编(xwlb_daily_ext 有数据)→ 视为完成
|
||||
1 识别已全部完成(存在 .asr_complete_<日期> 标记)但有分片无精编 → 只缺切分环节
|
||||
2 其余情况(分片未入库 / 识别只跑了一半)→ 必须重跑全链路
|
||||
|
||||
注意:只有 daily 有数据**不足以**说明识别跑完了。识别中途卡死时也会留下一部分分片,
|
||||
此时若无条件走"只重跑切分",会把半天内容当成完整一天切分入库——所以用标记文件区分。
|
||||
|
||||
同时在 stdout 打印 daily=<分片数> ext=<精编条数>,便于日志排查。
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
||||
|
||||
from mysqlHandle import MySQLDB # noqa: E402
|
||||
from audioRead import asr_marker_path # noqa: E402
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print('用法: day_status.py <YYYY-MM-DD|YYYYMMDD>')
|
||||
return 3
|
||||
raw = sys.argv[1]
|
||||
date10 = f"{raw[:4]}-{raw[4:6]}-{raw[6:]}" if len(raw) == 8 else raw
|
||||
|
||||
db = MySQLDB()
|
||||
try:
|
||||
daily = db.query_one('xwlb_daily', 'COUNT(*) n', 'news_days = %s', (date10,))
|
||||
ext = db.query_one('xwlb_daily_ext', 'COUNT(*) n', 'news_date = %s', (date10,))
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
n_daily = (daily or {}).get('n', 0) or 0
|
||||
n_ext = (ext or {}).get('n', 0) or 0
|
||||
marker = asr_marker_path(date10)
|
||||
asr_done = os.path.exists(marker)
|
||||
print(f"daily={n_daily} ext={n_ext} asr_complete={int(asr_done)}")
|
||||
if n_ext > 0:
|
||||
return 0
|
||||
if n_daily > 0 and asr_done:
|
||||
return 1
|
||||
return 2
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user