#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
合成纯视频流工具
根据srts表的时间信息和字幕图片合成总的纯视频流
用法: python generate_video_stream.py <adid>
"""

import os
import sys
import sqlite3
import subprocess
import shutil
import tempfile


def get_adname(adid, db_path):
    """从数据库获取adname"""
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    cursor.execute("SELECT DISTINCT adname FROM srts WHERE adid = ? LIMIT 1", (adid,))
    result = cursor.fetchone()
    conn.close()
    
    if result:
        return result[0]
    return f"adid_{adid}"


def get_subtitles_with_time(adid, db_path):
    """从数据库获取字幕信息和时间信息"""
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    cursor.execute("""
        SELECT idx, cn, en, start, end, ttsdur FROM srts 
        WHERE adid = ? AND cn IS NOT NULL AND cn != '' 
        ORDER BY idx
    """, (adid,))
    
    subtitles = []
    for row in cursor.fetchall():
        idx, cn, en, start, end, ttsdur = row
        subtitles.append((idx, cn, en, start, end, ttsdur))
    
    conn.close()
    return subtitles


def get_video_title(adname):
    """
    获取视频标题：
    1. 去掉日期前缀
    2. 如果标题太长，只取"鸡蛋最容易被污染的是沙门氏菌"
    """
    import re
    # 匹配日期格式：DD-MM-YY_HH_MM_SS-
    pattern = r'^\d{2}-\d{2}-\d{2}_\d{2}_\d{2}_\d{2}-'
    match = re.match(pattern, adname)
    if match:
        title = adname[match.end():]
    else:
        title = adname
    
    # 如果标题包含"鸡蛋最容易被污染的是沙门氏菌"，则只取这部分
    if "鸡蛋最容易被污染的是沙门氏菌" in title:
        return "鸡蛋最容易被污染的是沙门氏菌"
    
    return title


def generate_video_stream(adid):
    """合成总的纯视频流"""
    # 配置
    db_path = r'\\ll\D\xtrssvjj\db\dpd.db'
    
    # 获取adname
    adname = get_adname(adid, db_path)
    print(f"adname: {adname}")
    
    # 获取视频标题
    video_title = get_video_title(adname)
    print(f"视频标题: {video_title}")
    
    # 输入目录
    images_dir = f"{adname}_images"
    
    # 检查目录是否存在
    if not os.path.exists(images_dir):
        print(f"错误：字幕图片目录不存在: {images_dir}")
        print("请先运行: python generate_subtitles.py", adid)
        return False
    
    # 获取字幕信息
    subtitles = get_subtitles_with_time(adid, db_path)
    print(f"找到 {len(subtitles)} 句字幕")
    
    if not subtitles:
        print("错误：未找到字幕信息")
        return False
    
    # 创建临时目录
    temp_dir = tempfile.mkdtemp()
    print(f"创建临时目录: {temp_dir}")
    
    try:
        # 生成每个字幕的视频片段
        segment_files = []
        total_duration = 0
        
        for i, (idx, cn, en, start, end, ttsdur) in enumerate(subtitles):
            # 计算实际时长（考虑中音两端的修正）
            # 中文时长：end - start
            # 英文时长：ttsdur
            # 总时长：中文时长 + 英文时长
            cn_duration = (end - start) / 1000.0  # 转换为秒
            en_duration = ttsdur / 1000.0  # 转换为秒
            total_segment_duration = cn_duration + en_duration
            
            # 图片文件
            image_file = os.path.join(images_dir, f"vertical_subtitle_{idx:03d}.png")
            
            # 输出文件
            output_file = os.path.join(temp_dir, f"segment_{i:03d}.mp4")
            
            # 检查文件是否存在
            if not os.path.exists(image_file):
                print(f"警告：图片文件不存在: {image_file}")
                continue
            
            # 使用ffmpeg生成视频片段
            cmd = [
                "ffmpeg", "-y",
                "-loop", "1",  # 循环图片
                "-i", image_file,  # 输入图片
                "-c:v", "libx264",  # 视频编码器
                "-tune", "stillimage",  # 静态图片优化
                "-pix_fmt", "yuv420p",  # 像素格式
                "-t", str(total_segment_duration),  # 时长
                output_file
            ]
            
            # 执行命令
            result = subprocess.run(cmd, capture_output=True)
            
            if result.returncode != 0:
                print(f"错误：生成视频片段失败: {output_file}")
                print(result.stderr.decode('utf-8', errors='ignore'))
                continue
            
            segment_files.append(output_file)
            total_duration += total_segment_duration
            
            # 显示进度
            if (i + 1) % 10 == 0:
                print(f"生成视频片段 {i+1}/{len(subtitles)}")
        
        if not segment_files:
            print("错误：未生成任何视频片段")
            return False
        
        # 创建文件列表
        filelist_path = os.path.join(temp_dir, "filelist.txt")
        with open(filelist_path, 'w', encoding='utf-8') as f:
            for file in segment_files:
                f.write(f"file '{file}'\n")
        
        # 合成总视频
        output_file = f"{adid}{video_title}_stream.mp4"
        cmd = [
            "ffmpeg", "-y",
            "-f", "concat",
            "-safe", "0",
            "-i", filelist_path,
            "-c", "copy",
            output_file
        ]
        
        print("合成总视频...")
        result = subprocess.run(cmd, capture_output=True)
        
        if result.returncode != 0:
            print("错误：合成总视频失败")
            print(result.stderr.decode('utf-8', errors='ignore'))
            return False
        
        print(f"完成！生成纯视频流: {output_file}")
        print(f"总时长: {total_duration:.2f} 秒")
        print(f"输出位置: {os.path.abspath(output_file)}")
        return True
        
    finally:
        # 清理临时目录
        if os.path.exists(temp_dir):
            shutil.rmtree(temp_dir)
            print(f"清理临时目录: {temp_dir}")


def main():
    """主函数"""
    if len(sys.argv) != 2:
        print("用法: python generate_video_stream.py <adid>")
        print("示例: python generate_video_stream.py 8442")
        sys.exit(1)
    
    try:
        adid = int(sys.argv[1])
    except ValueError:
        print("错误：adid必须是数字")
        sys.exit(1)
    
    print(f"=== 纯视频流合成工具 ===")
    print(f"adid: {adid}")
    
    success = generate_video_stream(adid)
    
    if success:
        print("\n纯视频流合成完成！")
    else:
        print("\n纯视频流合成失败！")
        sys.exit(1)


if __name__ == "__main__":
    main()
