#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
通用视频片段生成工具
将字幕图片和音频合并成静态视频
用法: python generate_videos.py <adid>
"""

import os
import sys
import sqlite3
import subprocess
import shutil


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_subtitle_count(adid, db_path):
    """获取字幕数量"""
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    cursor.execute("SELECT COUNT(*) FROM srts WHERE adid = ? AND cn IS NOT NULL AND cn != ''", (adid,))
    count = cursor.fetchone()[0]
    conn.close()
    
    return count


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_segments(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"
    audio_dir = f"{adname}_combined"
    
    # 输出目录
    output_dir = f"{adid}{video_title}mp4"
    
    # 检查目录是否存在
    if not os.path.exists(images_dir):
        print(f"错误：字幕图片目录不存在: {images_dir}")
        return False
    
    if not os.path.exists(audio_dir):
        print(f"错误：音频目录不存在: {audio_dir}")
        return False
    
    # 清理输出目录
    if os.path.exists(output_dir):
        shutil.rmtree(output_dir)
    os.makedirs(output_dir)
    
    # 获取字幕数量
    subtitle_count = get_subtitle_count(adid, db_path)
    print(f"字幕数量: {subtitle_count}")
    
    # 生成视频片段
    for i in range(subtitle_count):
        # 图片文件
        image_file = os.path.join(images_dir, f"vertical_subtitle_{i:03d}.png")
        
        # 音频文件
        audio_file = os.path.join(audio_dir, f"cn+en{i:03d}.mp3")
        
        # 输出文件
        output_file = os.path.join(output_dir, f"video_{i:03d}.mp4")
        
        # 检查文件是否存在
        if not os.path.exists(image_file):
            print(f"警告：图片文件不存在: {image_file}")
            continue
        
        if not os.path.exists(audio_file):
            print(f"警告：音频文件不存在: {audio_file}")
            continue
        
        # 使用ffmpeg生成视频
        cmd = [
            "ffmpeg", "-y",
            "-loop", "1",  # 循环图片
            "-i", image_file,  # 输入图片
            "-i", audio_file,  # 输入音频
            "-c:v", "libx264",  # 视频编码器
            "-tune", "stillimage",  # 静态图片优化
            "-c:a", "aac",  # 音频编码器
            "-b:a", "192k",  # 音频比特率
            "-pix_fmt", "yuv420p",  # 像素格式
            "-shortest",  # 以最短的流为准（音频长度）
            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
        
        # 显示进度
        if (i + 1) % 10 == 0:
            print(f"生成视频片段 {i+1}/{subtitle_count}")
    
    print(f"完成！生成了 {subtitle_count} 个视频片段")
    print(f"输出目录: {output_dir}")
    return True


def main():
    """主函数"""
    if len(sys.argv) != 2:
        print("用法: python generate_videos.py <adid>")
        print("示例: python generate_videos.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_segments(adid)
    
    if success:
        print("\n视频片段生成完成！")
    else:
        print("\n视频片段生成失败！")
        sys.exit(1)


if __name__ == "__main__":
    main()
