96 lines
3.8 KiB
Python
96 lines
3.8 KiB
Python
import subprocess
|
||
import time
|
||
import sys
|
||
import os
|
||
from pathlib import Path
|
||
from logger import get_system_logger
|
||
|
||
# ==========================================
|
||
# 配置区:确保脚本文件名与你本地一致
|
||
# ==========================================
|
||
SCRIPTS = [
|
||
"monitor.py", # 1. 监控 stage,触发视频转录 (调用 video2srt.py)
|
||
"monitorSrt.py", # 2. 监控 session,触发 Codex 歌词识别
|
||
"monitorSongs.py", # 3. 监控 session,触发 FFmpeg 视频切片
|
||
"upload.py", # 4. 监控 session,触发 biliup 自动投稿
|
||
"session_top_comment.py", # 5. 监控 session,触发 B 站评论置顶
|
||
"add_to_collection.py", # 5. 新增:监控 session,触发合集归档 <--- 添加这一行
|
||
]
|
||
|
||
# Python 解释器路径 (通常直接用 sys.executable)
|
||
PYTHON_EXE = sys.executable
|
||
|
||
# 初始化日志
|
||
logger = get_system_logger('start_all')
|
||
|
||
# ==========================================
|
||
|
||
def start_pipeline():
|
||
processes = []
|
||
|
||
logger.info("="*50)
|
||
logger.info("直播切片 & 自动投稿全自动流水线")
|
||
logger.info("="*50)
|
||
logger.info(f"启动时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
|
||
logger.info(f"当前路径: {os.getcwd()}")
|
||
logger.info(f"Python: {PYTHON_EXE}")
|
||
|
||
# 检查所有脚本是否存在
|
||
for script in SCRIPTS:
|
||
if not Path(script).exists():
|
||
logger.error(f"找不到脚本 {script},请确保它们在同一目录下")
|
||
print(f"[X] 错误: 找不到脚本 {script},请确保它们在同一目录下。")
|
||
return
|
||
|
||
# 逐一启动
|
||
for script in SCRIPTS:
|
||
logger.info(f"正在启动模块: {script}")
|
||
try:
|
||
# 使用 subprocess.Popen 异步启动
|
||
# creationflags=subprocess.CREATE_NEW_CONSOLE 可以让每个脚本在独立窗口运行(仅限 Windows)
|
||
# 如果你希望所有日志都在这一个窗口显示,去掉 creationflags
|
||
p = subprocess.Popen(
|
||
[PYTHON_EXE, script],
|
||
creationflags=subprocess.CREATE_NEW_CONSOLE if os.name == 'nt' else 0
|
||
)
|
||
processes.append((script, p))
|
||
logger.info(f"模块已启动: {script} (PID: {p.pid})")
|
||
time.sleep(1) # 稍微错开启动时间,防止瞬间抢占 IO
|
||
except Exception as e:
|
||
logger.error(f"启动 {script} 失败: {e}")
|
||
print(f"[X] 启动 {script} 失败: {e}")
|
||
|
||
logger.info("")
|
||
logger.info("="*50)
|
||
logger.info("所有监控模块已启动!")
|
||
logger.info("请勿关闭此主窗口,除非你想停止整个流水线")
|
||
logger.info("="*50)
|
||
|
||
print("\n" + "="*50)
|
||
print("[√] 所有监控模块已启动!")
|
||
print("[!] 请勿关闭此主窗口,除非你想停止整个流水线。")
|
||
print("[!] 详细日志请查看 ./logs/system/ 目录")
|
||
print("="*50)
|
||
|
||
try:
|
||
# 循环检查子进程状态
|
||
while True:
|
||
for name, p in processes:
|
||
if p.poll() is not None:
|
||
logger.warning(f"模块 {name} 已意外停止 (Exit Code: {p.poll()})")
|
||
print(f"\n[⚠️] 警告: 模块 {name} 已意外停止 (Exit Code: {p.poll()})")
|
||
# 这里可以加入自动重启逻辑
|
||
time.sleep(10)
|
||
except KeyboardInterrupt:
|
||
logger.info("接收到停止信号,正在关闭所有监控模块...")
|
||
print("\n[*] 正在关闭所有监控模块...")
|
||
for name, p in processes:
|
||
p.terminate()
|
||
logger.info(f"模块已终止: {name}")
|
||
logger.info("已安全退出")
|
||
print("[√] 已安全退出。")
|
||
|
||
if __name__ == "__main__":
|
||
start_all_dir = Path(__file__).parent
|
||
os.chdir(start_all_dir) # 确保工作路径正确
|
||
start_pipeline() |