#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
将原声视频片段和TTS视频片段按顺序串接起来，生成双语逐句对照的视频
使用两步法：先转换格式，再拼接
"""

import os
import subprocess
import glob


def get_video_duration(video_file):
    """
    获取视频时长
    """
    cmd = [
        "ffprobe",
        "-v", "error",
        "-show_entries", "format=duration",
        "-of", "default=noprint_wrappers=1:nokey=1",
        video_file
    ]
    
    try:
        result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='ignore')
        return float(result.stdout.strip())
    except:
        return 0


def convert_video_to_standard(input_file, output_file):
    """
    将视频转换为标准格式（确保音频格式一致）
    """
    cmd = [
        "ffmpeg", "-y",
        "-i", input_file,
        "-c:v", "libx264",
        "-c:a", "aac",
        "-b:a", "192k",
        "-ar", "44100",
        "-ac", "2",
        "-pix_fmt", "yuv420p",
        output_file
    ]
    
    try:
        result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='ignore')
        return result.returncode == 0
    except Exception as e:
        print(f"  错误: {e}")
        return False


def concat_videos_to_bilingual(original_dir, tts_dir, output_file):
    """
    将原声视频片段和TTS视频片段按顺序串接起来
    """
    # 获取所有原声视频文件
    original_files = sorted(glob.glob(os.path.join(original_dir, "video_*.mp4")))
    
    print(f"找到 {len(original_files)} 个原声视频片段")
    
    # 创建临时目录
    temp_dir = "temp_standard_videos"
    if not os.path.exists(temp_dir):
        os.makedirs(temp_dir)
    
    # 创建concat文件列表
    concat_list = []
    
    for i, original_file in enumerate(original_files):
        # 提取idx
        basename = os.path.basename(original_file)
        idx_str = basename.replace("video_", "").replace(".mp4", "")
        idx = int(idx_str)
        
        # 查找对应的TTS视频文件
        tts_file = os.path.join(tts_dir, f"video_{idx:03d}.mp4")
        
        if not os.path.exists(tts_file):
            print(f"警告: 未找到idx={idx}的TTS视频文件")
            continue
        
        # 转换原声视频
        original_standard = os.path.join(temp_dir, f"original_{idx:03d}.mp4")
        print(f"转换原声视频 idx={idx}...")
        if not convert_video_to_standard(original_file, original_standard):
            print(f"  错误: 转换失败")
            continue
        
        # 转换TTS视频
        tts_standard = os.path.join(temp_dir, f"tts_{idx:03d}.mp4")
        print(f"转换TTS视频 idx={idx}...")
        if not convert_video_to_standard(tts_file, tts_standard):
            print(f"  错误: 转换失败")
            continue
        
        # 添加到concat列表（原声 -> TTS）
        concat_list.append(original_standard)
        concat_list.append(tts_standard)
    
    print(f"总共需要串接 {len(concat_list)} 个视频片段")
    
    # 创建concat文件
    concat_file = "concat_list.txt"
    with open(concat_file, 'w', encoding='utf-8') as f:
        for video_file in concat_list:
            # 使用绝对路径，并替换反斜杠为正斜杠
            abs_path = os.path.abspath(video_file).replace('\\', '/')
            f.write(f"file '{abs_path}'\n")
    
    # 使用FFmpeg concat拼接视频
    cmd = [
        "ffmpeg", "-y",
        "-f", "concat",
        "-safe", "0",
        "-i", concat_file,
        "-c", "copy",
        output_file
    ]
    
    print(f"开始拼接视频...")
    result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='ignore')
    
    # 删除临时文件
    if os.path.exists(concat_file):
        os.remove(concat_file)
    
    # 删除临时目录
    for file in glob.glob(os.path.join(temp_dir, "*.mp4")):
        os.remove(file)
    if os.path.exists(temp_dir):
        os.rmdir(temp_dir)
    
    if result.returncode == 0:
        # 获取输出文件大小
        file_size = os.path.getsize(output_file) / (1024 * 1024)  # MB
        duration = get_video_duration(output_file)
        print(f"\n完成！输出文件: {output_file}")
        print(f"文件大小: {file_size:.2f} MB")
        print(f"视频时长: {duration:.2f} 秒 ({duration/60:.2f} 分钟)")
    else:
        print(f"错误: 拼接失败 - {result.stderr}")


if __name__ == "__main__":
    # 原声视频目录
    original_dir = "698_罗永浩的十字路口_videos"
    
    # TTS视频目录
    tts_dir = "698_罗永浩的十字路口_tts_videos"
    
    # 输出文件
    output_file = "698_罗永浩的十字路口_bilingual.mp4"
    
    concat_videos_to_bilingual(original_dir, tts_dir, output_file)
