#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
生成韩寒创业简史 下集的中文视频片段
"""

import os
import subprocess
import glob


def get_audio_files(audio_dir):
    """
    获取音频文件列表，按序号排序
    """
    pattern = os.path.join(audio_dir, "seg*.mp3")
    files = glob.glob(pattern)
    
    # 提取序号并排序
    audio_files = []
    for file in files:
        filename = os.path.basename(file)
        # 提取序号，格式为 seg{idx:03d}-...
        try:
            idx = int(filename.split('-')[0][3:])
            audio_files.append((idx, file))
        except:
            continue
    
    # 按序号排序
    audio_files.sort(key=lambda x: x[0])
    return audio_files


def get_tts_files(tts_dir):
    """
    获取TTS文件列表，按序号排序
    """
    pattern = os.path.join(tts_dir, "tts_*.mp3")
    files = glob.glob(pattern)
    
    # 提取序号并排序
    tts_files = []
    for file in files:
        filename = os.path.basename(file)
        # 提取序号，格式为 tts_{idx:03d}.mp3
        try:
            idx = int(filename.split('_')[1].split('.')[0])
            tts_files.append((idx, file))
        except:
            continue
    
    # 按序号排序
    tts_files.sort(key=lambda x: x[0])
    return tts_files

def get_image_files(image_dir):
    """
    获取图片文件列表，按序号排序
    """
    pattern = os.path.join(image_dir, "subtitle_*.png")
    files = glob.glob(pattern)
    
    # 提取序号并排序
    image_files = []
    for file in files:
        filename = os.path.basename(file)
        # 提取序号，格式为 subtitle_{idx:03d}.png
        try:
            idx = int(filename.split('_')[1].split('.')[0])
            image_files.append((idx, file))
        except:
            continue
    
    # 按序号排序
    image_files.sort(key=lambda x: x[0])
    return image_files

def combine_chinese_videos():
    """
    生成中文视频片段
    """
    audio_dir = "韩寒创业简史_下集_audio_segments"
    tts_dir = "韩寒创业简史_下集_tts"
    image_dir = "韩寒创业简史_下集_images"
    output_dir = "韩寒创业简史_下集_videos"
    
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"创建输出目录: {output_dir}")
    
    # 获取文件列表
    audio_files = get_audio_files(audio_dir)
    tts_files = get_tts_files(tts_dir)
    image_files = get_image_files(image_dir)
    
    print(f"找到 {len(audio_files)} 个音频文件")
    print(f"找到 {len(tts_files)} 个TTS文件")
    print(f"找到 {len(image_files)} 个图片文件")
    
    # 确保文件数量一致
    if len(audio_files) != len(tts_files) or len(audio_files) != len(image_files):
        print("错误: 文件数量不一致")
        return
    
    # 从指定索引开始
    start_idx = 0
    
    for i, ((audio_idx, audio_path), (tts_idx, tts_path), (image_idx, image_path)) in enumerate(zip(audio_files, tts_files, image_files)):
        # 验证索引是否匹配
        if audio_idx != tts_idx or audio_idx != image_idx:
            print(f"错误: 索引不匹配 - audio:{audio_idx}, tts:{tts_idx}, image:{image_idx}")
            continue
        
        # 跳过指定索引之前的文件
        if audio_idx < start_idx:
            continue
        
        # 输出文件
        output_path = os.path.join(output_dir, f"video_{audio_idx:03d}.mp4")
        
        # 构建FFmpeg命令 - 合成双语音频
        cmd = [
            "ffmpeg", "-y",
            "-loop", "1", "-i", image_path,
            "-i", audio_path,
            "-i", tts_path,
            "-filter_complex", "[1:a][2:a]concat=n=2:v=0:a=1[outa]",
            "-map", "0:v",
            "-map", "[outa]",
            "-c:v", "libx264",
            "-tune", "stillimage",
            "-c:a", "aac",
            "-b:a", "192k",
            "-shortest",
            output_path
        ]
        
        try:
            result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='ignore')
            if result.returncode == 0:
                if (i + 1) % 10 == 0:
                    print(f"生成视频片段 {i + 1}/{len(audio_files)}")
            else:
                print(f"生成视频片段失败 (idx={audio_idx}): {result.stderr}")
        except Exception as e:
            print(f"生成视频片段错误 (idx={audio_idx}): {e}")
    
    print(f"完成！生成了 {len(audio_files)} 个视频片段")


if __name__ == "__main__":
    combine_chinese_videos()