#!/usr/bin/env python3
"""重新制作新闻播报视频 - 用原有成功素材"""
import subprocess
import os
import asyncio
import edge_tts

os.chdir("/root/videos")

# 素材列表 - 和之前一样
clips = [
    ("mixkit_tech.mp4", "科技改变世界", "AI人工智能正在改变我们的生活，未来已来！"),
    ("mixkit_city.mp4", "城市夜景", "现代都市的繁华与活力，霓虹灯下的故事"),
    ("mixkit_people.mp4", "人们的故事", "每个人都有自己的精彩，平凡中的不凡"),
    ("mixkit_sports.mp4", "运动激情", "挑战自我，超越极限，永不放弃！"),
    ("mixkit_animals.mp4", "动物世界", "大自然的可爱生灵，让人心情愉悦"),
    ("mixkit_food.mp4", "美食诱惑", "舌尖上的美味享受，吃货的天堂"),
    ("mixkit_nature.mp4", "自然风光", "美丽的日出与海洋，心旷神怡"),
    ("mixkit_business.mp4", "商业时代", "创业者的奋斗之路，梦想与坚持"),
    ("mixkit_music.mp4", "音乐人生", "用音乐传递情感，旋律中的故事"),
]

SEG_LEN = 8

async def generate_tts(text, outfile):
    """生成中文TTS - 用之前成功的语音"""
    communicate = edge_tts.Communicate(text, "zh-CN-XiaoxiaoNeural", rate="+10%")
    await communicate.save(outfile)

async def main():
    # Step 1: 生成TTS（用新的文件名，不覆盖旧的）
    print("Step 1: TTS...")
    tts_files = []
    for i, (src, title, desc) in enumerate(clips):
        tts_file = f"tts_{i:02d}.mp3"
        if os.path.exists(tts_file) and os.path.getsize(tts_file) > 10000:
            print(f"  SKIP {tts_file} (exists, {os.path.getsize(tts_file)} bytes)")
            tts_files.append(tts_file)
            continue
        await generate_tts(desc, tts_file)
        tts_files.append(tts_file)
        print(f"  {tts_file}: {desc[:20]}...")

    # Step 2: 裁剪视频 + 合并TTS音频
    print("\nStep 2: 裁剪视频...")
    combined = []
    for i, (src, title, desc) in enumerate(clips):
        out = f"clip_{i:02d}.mp4"
        tts = tts_files[i]
        
        # 如果clip文件已经存在且正常，跳过
        if os.path.exists(out) and os.path.getsize(out) > 100000:
            print(f"  SKIP {out} (exists, {os.path.getsize(out)} bytes)")
            combined.append(out)
            continue
        
        r = subprocess.run(
            ["ffprobe", "-v", "quiet", "-show_entries", "format=duration", "-of", "csv=p=0", tts],
            capture_output=True, text=True
        )
        tts_dur = float(r.stdout.strip()) if r.returncode == 0 else SEG_LEN
        dur = min(SEG_LEN, tts_dur + 0.5)

        cmd = [
            "ffmpeg", "-y", "-i", src, "-i", tts,
            "-t", str(dur),
            "-vf", "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-hh)/2",
            "-c:v", "libx264", "-preset", "fast", "-crf", "23",
            "-c:a", "aac", "-b:a", "128k",
            "-map", "0:v:0", "-map", "1:a:0",
            "-shortest", "-movflags", "+faststart", out
        ]
        r = subprocess.run(cmd, capture_output=True, text=True)
        if r.returncode != 0:
            print(f"  ERROR clip {i}: {r.stderr[-100:]}")
            cmd2 = [
                "ffmpeg", "-y", "-i", src, "-t", str(dur),
                "-vf", "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-hh)/2",
                "-c:v", "libx264", "-preset", "fast", "-crf", "23", "-an", out
            ]
            subprocess.run(cmd2, capture_output=True)
        
        combined.append(out)
        print(f"  {src} + {tts} -> {out}")

    # Step 3: 拼接
    print("\nStep 3: 拼接...")
    with open("concat_list.txt", "w") as f:
        for c in combined:
            f.write(f"file '{c}'\n")
    
    cmd = [
        "ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", "concat_list.txt",
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-c:a", "aac", "-b:a", "128k", "-movflags", "+faststart",
        "merged.mp4"
    ]
    r = subprocess.run(cmd, capture_output=True, text=True)
    if r.returncode != 0:
        print(f"  ERROR merging: {r.stderr[-200:]}")
        return
    print(f"  -> merged.mp4 ({os.path.getsize('merged.mp4')//1024//1024}MB)")

    # Step 4: 字幕
    print("\nStep 4: 字幕...")
    srt_lines = []
    current_time = 0
    for i, (src, title, desc) in enumerate(clips):
        tts = tts_files[i]
        r = subprocess.run(
            ["ffprobe", "-v", "quiet", "-show_entries", "format=duration", "-of", "csv=p=0", tts],
            capture_output=True, text=True
        )
        tts_dur = float(r.stdout.strip()) if r.returncode == 0 else SEG_LEN
        dur = min(SEG_LEN, tts_dur + 0.5)
        start = current_time
        end = current_time + dur
        def fmt_time(t):
            h = int(t // 3600)
            m = int((t % 3600) // 60)
            s = int(t % 60)
            ms = int((t % 1) * 1000)
            return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
        srt_lines.extend([
            str(i+1), f"{fmt_time(start)} --> {fmt_time(end)}",
            title, desc, ""
        ])
        current_time = end
    with open("subtitles.srt", "w") as f:
        f.write("\n".join(srt_lines))
    print("  -> subtitles.srt")

    # Step 5: 烧录字幕
    print("\nStep 5: 烧录字幕...")
    cmd = [
        "ffmpeg", "-y", "-i", "merged.mp4",
        "-vf", "subtitles=subtitles.srt:force_style='FontSize=22,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=2,MarginV=40'",
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-c:a", "copy", "-movflags", "+faststart",
        "final_video.mp4"
    ]
    r = subprocess.run(cmd, capture_output=True, text=True)
    if r.returncode != 0:
        print(f"  ERROR: {r.stderr[-200:]}")
        os.rename("merged.mp4", "final_video.mp4")
        print("  -> 跳过字幕，用merged.mp4")
    else:
        print(f"  -> final_video.mp4 ({os.path.getsize('final_video.mp4')//1024//1024}MB)")

    # 复制到webchat目录
    subprocess.run(["cp", "final_video.mp4", "/root/.hermes/webchat/static/news-broadcast.mp4"])
    print(f"\n✅ 完成！")
    print(f"   观看: http://157.173.212.215:8080/news-broadcast.mp4")

asyncio.run(main())
