#!/usr/bin/env python3
"""重新制作新闻播报视频 - 用mixkit素材 + 新解说"""
import subprocess
import os
import asyncio
import edge_tts

os.chdir("/root/videos")

# 新素材列表 - 换顺序，换解说词
clips = [
    ("mixkit_tech.mp4", "科技前沿", "人工智能正在重塑我们的生活方式，从自动驾驶到智能医疗，科技的脚步从未停歇。"),
    ("mixkit_city.mp4", "城市脉动", "全球城市化进程加速，智慧城市成为未来发展方向，科技与人文在这里交汇。"),
    ("mixkit_nature.mp4", "地球之声", "气候变化影响着每一个角落，保护环境已成为全人类的共同使命。"),
    ("mixkit_sports.mp4", "体育精神", "运动不分国界，每一次拼搏都是对自我的超越，体育让世界更加团结。"),
    ("mixkit_people.mp4", "人间温暖", "在世界各地，普通人用善良和勇气书写着不平凡的故事。"),
    ("mixkit_food.mp4", "美食文化", "食物是文化的载体，每一道菜背后都有一个民族的历史与记忆。"),
    ("mixkit_music.mp4", "音乐无界", "音乐是世界的语言，它能跨越文化和地域的隔阂，触动每一颗心。"),
    ("mixkit_business.mp4", "经济风云", "全球经济格局正在重塑，新兴市场崛起，数字经济成为增长新引擎。"),
    ("mixkit_animals.mp4", "生命之美", "地球上的每一个生命都值得被尊重，保护生物多样性就是保护我们自己。"),
]

SEG_LEN = 8

async def generate_tts(text, outfile):
    communicate = edge_tts.Communicate(text, "zh-CN-YunxiNeural", rate="+5%")
    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_new_{i:02d}.mp3"
        await generate_tts(desc, tts_file)
        tts_files.append(tts_file)
        print(f"  {tts_file}: {desc[:20]}...")

    # Step 2: 裁剪+合并
    print("Step 2: 裁剪视频...")
    combined = []
    for i, (src, title, desc) in enumerate(clips):
        out = f"clip_new_{i:02d}.mp4"
        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)

        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:
            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} -> {out} ({dur:.1f}s)")

    # Step 3: 拼接
    print("Step 3: 拼接...")
    with open("concat_new.txt", "w") as f:
        for c in combined:
            f.write(f"file '{c}'\n")
    subprocess.run([
        "ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", "concat_new.txt",
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-c:a", "aac", "-b:a", "128k", "-movflags", "+faststart",
        "merged_new.mp4"
    ], capture_output=True)
    print("  -> merged_new.mp4")

    # Step 4: 字幕
    print("Step 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_new.srt", "w") as f:
        f.write("\n".join(srt_lines))
    print("  -> subtitles_new.srt")

    # Step 5: 烧录字幕
    print("Step 5: 烧录字幕...")
    r = subprocess.run([
        "ffmpeg", "-y", "-i", "merged_new.mp4",
        "-vf", "subtitles=subtitles_new.srt:force_style='FontSize=24,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=2,MarginV=50'",
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-c:a", "copy", "-movflags", "+faststart",
        "news_broadcast_v2.mp4"
    ], capture_output=True, text=True)
    if r.returncode != 0:
        os.rename("merged_new.mp4", "news_broadcast_v2.mp4")
        print("  -> 跳过字幕")
    else:
        print("  -> news_broadcast_v2.mp4")

    size = os.path.getsize("news_broadcast_v2.mp4")
    dur_total = float(subprocess.run(
        ["ffprobe", "-v", "quiet", "-show_entries", "format=duration", "-of", "csv=p=0", "news_broadcast_v2.mp4"],
        capture_output=True, text=True
    ).stdout.strip())
    print(f"\n完成！时长: {dur_total:.0f}秒, 大小: {size//1024//1024}MB")
    print(f"观看: http://157.173.212.215:8080/news_broadcast_v2.mp4")

asyncio.run(main())
