""" newsRedo — 手动重新执行新闻 AI 分割流程。 用法: python newsRedo.py # 默认当天日期 python newsRedo.py 20250601 # yyyymmdd 格式 python newsRedo.py 2025-06-01 # yyyy-mm-dd 格式 python newsRedo.py 2025-06-01 --force # 已有精编记录也重新切分 流程: 1. 检查 xwlb_daily_ext 是否已有记录 → 已处理过则跳过(--force 可强制重跑) 2. 检查 xwlb_daily 是否有当天记录 → 无记录则先跑 getVideo5 全流程 3. 有记录但未处理 → 直接执行 news_to_db() AI 分割 """ import sys import re import logging from datetime import datetime from mysqlHandle import MySQLDB from newsProcess import news_to_db from getVideo5 import process_videos import config logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) def _parse_date(date_str): """解析日期,返回 (yyyymmdd_str, yyyy_mm_dd_str),或报错退出""" if not date_str: today = datetime.now() d8 = today.strftime('%Y%m%d') d10 = today.strftime('%Y-%m-%d') logger.info(f"未指定日期,使用当天: {d10}") return d8, d10 if re.match(r'^\d{4}-\d{2}-\d{2}$', date_str): try: datetime.strptime(date_str, '%Y-%m-%d') except ValueError: print(f"无效日期: {date_str}") sys.exit(1) return date_str.replace('-', ''), date_str if re.match(r'^\d{8}$', date_str): try: datetime.strptime(date_str, '%Y%m%d') except ValueError: print(f"无效日期: {date_str}") sys.exit(1) return date_str, f"{date_str[:4]}-{date_str[4:6]}-{date_str[6:8]}" print("日期格式错误,请使用 yyyymmdd 或 yyyy-mm-dd 格式") sys.exit(1) def main(): args = [a for a in sys.argv[1:] if not a.startswith('-')] force = '--force' in sys.argv[1:] or '-f' in sys.argv[1:] date_str = args[0] if args else None date_d8, date_d10 = _parse_date(date_str) db = MySQLDB() # 1. 检查 xwlb_daily_ext 是否已处理过 # 判据由「>5 条」改为「存在任意记录」(原判据会把只切出 ≤5 条的日期永久判为未处理,B13) try: ext_count = db.query_data( table="xwlb_daily_ext", columns="COUNT(*) as count", where="news_date = %s", params=(date_d10,) ) existing = ext_count[0]['count'] if ext_count else 0 if existing > 0 and not force: logger.info(f"日期 {date_d10} 已有 {existing} 条精编记录,无需重新处理(需重跑请加 --force)。") return if existing > 0 and force: logger.info(f"日期 {date_d10} 已有 {existing} 条精编记录,--force 将重新切分并覆盖。") except Exception as e: logger.error(f"查询 xwlb_daily_ext 失败: {e}") finally: db.close() db = MySQLDB() # 2. 检查 xwlb_daily 是否有当天数据 try: daily_count = db.query_data( table="xwlb_daily", columns="COUNT(*) as count", where="news_days = %s", params=(date_d10,) ) has_daily = daily_count and daily_count[0]['count'] > 0 except Exception as e: logger.error(f"查询 xwlb_daily 失败: {e}") has_daily = False finally: db.close() # 3. 分支处理 if has_daily: logger.info(f"日期 {date_d10} 在 xwlb_daily 中有记录,直接执行 AI 分割。") try: status = news_to_db(date_d10, force=force) logger.info(f"news_to_db 结果: {status}") except Exception as e: logger.error(f"news_to_db 执行出错: {e}") sys.exit(1) else: logger.info(f"日期 {date_d10} 在 xwlb_daily 中无记录,重新执行视频下载全流程。") try: process_videos(date_d8, date_d8) except Exception as e: logger.error(f"process_videos 执行出错: {e}") sys.exit(1) if __name__ == "__main__": config.log_summary() main()