#!/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

async def generate_tts(text, outfile):
    communicate = edge_tts.Communicate(text, "zh-CN-XiaoxiaoNeural", rate="+10%")
    await communicate.save(outfile)

async def main():
    # Step 1: 生成TTS
    print("Step 1: 生成TTS...")
    for i, (_, title, desc) in enumerate(clips):
        await generate_tts(desc, f"tts_{i:02d}.mp3")
        print(f"  tts_{i:02d}.mp3 done")
    
    # Step 2: 裁剪视频（纯视频，无音频）
    print("\nStep 2: 裁剪视频...")
    for i, (src, _, _) in enumerate(clips):
        cmd = [
            "ffmpeg", "-y", "-i", src,
            "-t", str(SEG_LEN),
            "-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",  # 不要音频
            f"clip_{i:02d}.mp4"
        ]
        r = subprocess.run(cmd, capture_output=True, text=True)
        if r.returncode == 0:
            print(f"  clip_{i:02d}.mp4 OK")
        else:
            print(f"  clip_{i:02d}.mp4 ERROR: {r.stderr[-100:]}")
    
    # Step 3: 拼接视频
    print("\nStep 3: 拼接视频...")
    with open("vconcat.txt", "w") as f:
        for i in range(len(clips)):
            f.write(f"file 'clip_{i:02d}.mp4'\n")
    
    subprocess.run([
        "ffmpeg", "-y", "-f", "concat", "-safe", "0",
        "-i", "vconcat.txt",
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-an",
        "video_only.mp4"
    ], capture_output=True)
    print("  -> video_only.mp4")
    
    # Step 4: 拼接TTS音频（加静音间隔）
    print("\nStep 4: 拼接TTS音频...")
    # 先给每个TTS加静音填充到SEG_LEN
    tts_padded = []
    for i in range(len(clips)):
        tts_in = f"tts_{i:02d}.mp3"
        tts_out = f"tts_pad_{i:02d}.wav"
        cmd = [
            "ffmpeg", "-y", "-i", tts_in,
            "-af", "apad=pad_dur={}".format(SEG_LEN),  # 填充到SEG_LEN... 不对
            "-t", str(SEG_LEN),
            "-ar", "44100", "-ac", "2",
            tts_out
        ]
        # 更简单：直接用 apad 填充
        cmd = [
            "ffmpeg", "-y", "-i", tts_in,
            "-af", "apad=whole_dur={}".format(SEG_LEN),
            "-ar", "44100", "-ac", "2",
            tts_out
        ]
        r = subprocess.run(cmd, capture_output=True, text=True)
        if r.returncode != 0:
            # 备用：直接转换
            cmd2 = ["ffmpeg", "-y", "-i", tts_in, "-ar", "44100", "-ac", "2", tts_out]
            subprocess.run(cmd2, capture_output=True)
        tts_padded.append(tts_out)
    
    with open("aconcat.txt", "w") as f:
        for t in tts_padded:
            f.write(f"file '{t}'\n")
    
    subprocess.run([
        "ffmpeg", "-y", "-f", "concat", "-safe", "0",
        "-i", "aconcat.txt",
        "-c:a", "aac", "-b:a", "128k",
        "audio_only.m4a"
    ], capture_output=True)
    print("  -> audio_only.m4a")
    
    # Step 5: 合并视频+音频
    print("\nStep 5: 合并视频+音频...")
    subprocess.run([
        "ffmpeg", "-y",
        "-i", "video_only.mp4",
        "-i", "audio_only.m4a",
        "-c:v", "copy",
        "-c:a", "aac", "-b:a", "128k",
        "-shortest",
        "-movflags", "+faststart",
        "merged.mp4"
    ], capture_output=True)
    print("  -> merged.mp4")
    
    # Step 6: 生成字幕
    print("\nStep 6: 生成字幕...")
    srt_lines = []
    t = 0
    for i, (_, title, desc) in enumerate(clips):
        def fmt(tm):
            h = int(tm // 3600)
            m = int((tm % 3600) // 60)
            s = int(tm % 60)
            ms = int((tm % 1) * 1000)
            return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
        
        srt_lines += [
            str(i+1),
            f"{fmt(t)} --> {fmt(t+SEG_LEN)}",
            title,
            desc,
            ""
        ]
        t += SEG_LEN
    
    with open("subs.srt", "w") as f:
        f.write("\n".join(srt_lines))
    
    # Step 7: 烧录字幕
    print("\nStep 7: 烧录字幕...")
    r = subprocess.run([
        "ffmpeg", "-y", "-i", "merged.mp4",
        "-vf", "subtitles=subs.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"
    ], capture_output=True, text=True)
    
    if r.returncode != 0:
        os.rename("merged.mp4", "final_video.mp4")
        print("  -> 跳过字幕")
    else:
        print("  -> final_video.mp4")
    
    # 完成
    size = os.path.getsize("final_video.mp4")
    dur = 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✅ 完成！时长: {dur:.0f}s | 大小: {size//1024//1024}MB")
    print(f"   观看: http://157.173.212.215:8080/final_video.mp4")

asyncio.run(main())
