#!/usr/bin/env python3
"""剪辑素材视频 + TTS配音 + 字幕"""
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  # 每个片段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"
        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]
        
        # 获取TTS时长
        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
        
        # 视频时长取 min(SEG_LEN, tts_dur + 0.5)
        dur = min(SEG_LEN, tts_dur + 0.5)
        
        # 裁剪视频 + 添加TTS音频
        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 on clip {i}: {r.stderr[-200:]}")
            # 备用：只用视频
            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} ({dur:.1f}s)")
    
    # 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[-300:]}")
        return
    print("  -> merged.mp4")
    
    # 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.append(f"{i+1}")
        srt_lines.append(f"{fmt_time(start)} --> {fmt_time(end)}")
        srt_lines.append(f"{title}")
        srt_lines.append(f"{desc}")
        srt_lines.append("")
        
        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("  -> 跳过字幕")
    else:
        print("  -> final_video.mp4")
    
    # 完成
    size = os.path.getsize("final_video.mp4")
    dur_total = float(subprocess.run(
        ["ffprobe", "-v", "quiet", "-show_entries", "format=duration", "-of", "csv=p=0", "final_video.mp4"],
        capture_output=True, text=True
    ).stdout.strip())
    
    print(f"\n✅ 完成！")
    print(f"   时长: {dur_total:.0f}秒 ({dur_total/60:.1f}分钟)")
    print(f"   大小: {size//1024//1024}MB")
    print(f"   观看: http://157.173.212.215:8080/final_video.mp4")

asyncio.run(main())
