从 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 项离线自检(配置/清理/事实守卫/解析/隧道)
76 lines
2.9 KiB
Python
76 lines
2.9 KiB
Python
"""
|
|
xwlb_daily 表结构如下:
|
|
+--------------+---------+------+-----+---------+----------------+
|
|
| Field | Type | Null | Key | Default | Extra |
|
|
+--------------+---------+------+-----+---------+----------------+
|
|
| nid | int(11) | NO | PRI | NULL | auto_increment |
|
|
| news_days | date | NO | | NULL | |
|
|
| daily_sub_id | int(11) | NO | | NULL | |
|
|
| news_raw | text | NO | | NULL | |
|
|
| news_improve | text | NO | | NULL | |
|
|
| news_title | text | NO | | NULL | |
|
|
+--------------+---------+------+-----+---------+----------------+
|
|
"""
|
|
|
|
from mysqlHandle import MySQLDB
|
|
from getVideo5 import process_videos
|
|
from datetime import datetime, timedelta
|
|
import logging
|
|
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def get_missing_dates(start_date, end_date):
|
|
"""
|
|
给定日期范围,查询xwlb_daily表中缺失的日期
|
|
"""
|
|
try:
|
|
# 连接数据库
|
|
db = MySQLDB()
|
|
|
|
# 查询指定日期范围内存在的所有日期
|
|
result = db.query_data(
|
|
table="xwlb_daily",
|
|
columns="DISTINCT(news_days) as news_days",
|
|
where="news_days BETWEEN %s AND %s order by news_days",
|
|
params=(start_date, end_date)
|
|
)
|
|
# 获取所有存在的日期
|
|
existing_dates = [row['news_days'] for row in result]
|
|
|
|
# 生成完整的日期范围
|
|
start = datetime.strptime(start_date, '%Y-%m-%d').date()
|
|
end = datetime.strptime(end_date, '%Y-%m-%d').date()
|
|
|
|
all_dates = []
|
|
current_date = start
|
|
while current_date <= end:
|
|
all_dates.append(current_date)
|
|
current_date = current_date + timedelta(days=1)
|
|
|
|
# 找出缺失的日期
|
|
existing_set = set(existing_dates)
|
|
missing_dates = [date.strftime('%Y%m%d') for date in all_dates if date not in existing_set]
|
|
|
|
logger.info(f"查询日期范围 {start_date} 到 {end_date}")
|
|
logger.info(f"存在 {len(existing_dates)} 天数据,缺失 {len(missing_dates)} 天数据")
|
|
logger.info(f"缺失日期: {missing_dates}")
|
|
return missing_dates
|
|
|
|
except Exception as e:
|
|
logger.error(f"查询缺失日期时出错: {str(e)}")
|
|
return []
|
|
|
|
if __name__ == "__main__":
|
|
# 测试代码
|
|
start_date = "2025-01-01"
|
|
end_date = "2025-10-25"
|
|
missing_dates=get_missing_dates(start_date, end_date)
|
|
for date_str in missing_dates:
|
|
logger.info(f"正在处理缺失日期: {date_str}")
|
|
try:
|
|
process_videos(date_str,date_str)
|
|
logger.info(f"成功处理日期: {date_str}")
|
|
except Exception as e:
|
|
logger.error(f"处理日期 {date_str} 时出错: {str(e)}")
|