#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
检查音频和视频长度，判断是否缺少 TTS 音频部分
"""

import os
import sys
import sqlite3
import subprocess


def get_file_duration(file_path):
    """
    使用 ffprobe 获取音频/视频文件的时长（秒）
    """
    try:
        cmd = [
            'ffprobe',
            '-v', 'quiet',
            '-show_entries', 'format=duration',
            '-of', 'default=noprint_wrappers=1:nokey=1',
            file_path
        ]
        result = subprocess.run(cmd, capture_output=True, text=True, shell=True)
        duration = float(result.stdout.strip())
        return duration
    except Exception as e:
        print(f"获取文件时长失败: {e}")
        return 0


def get_subtitles(adid, db_path):
    """
    从数据库获取字幕信息
    """
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    cursor.execute("""
        SELECT idx, cn, en, start, end, tts FROM srts 
        WHERE adid = ? 
        ORDER BY idx
    """, (adid,))
    
    subtitles = []
    for row in cursor.fetchall():
        idx, cn, en, start, end, tts = row
        subtitles.append((idx, cn, en, start, end, tts))
    
    conn.close()
    return subtitles


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 main():
    """
    主函数
    """
    if len(sys.argv) != 2:
        print("用法: python check_lengths.py <adid>")
        print("示例: python check_lengths.py 8585")
        sys.exit(1)
    
    try:
        adid = int(sys.argv[1])
    except ValueError:
        print("错误：adid必须是数字")
        sys.exit(1)
    
    # 数据库路径
    db_path = r'\\ll\D\xtrssvjj\db\dpd.db'
    
    # 获取adname
    adname = get_adname(adid, db_path)
    print(f"adname: {adname}")
    
    # 文件路径
    bilingual_audio = f"{adname}_bilingual.mp3"
    final_video = f"{adname}_final_bilingual.mp4"
    
    # 检查文件是否存在
    if not os.path.exists(bilingual_audio):
        print(f"错误：双语音频文件不存在: {bilingual_audio}")
        sys.exit(1)
    
    if not os.path.exists(final_video):
        print(f"错误：最终视频文件不存在: {final_video}")
        sys.exit(1)
    
    # 获取文件时长
    audio_duration = get_file_duration(bilingual_audio)
    video_duration = get_file_duration(final_video)
    
    print(f"\n文件时长:")
    print(f"双语音频: {audio_duration:.2f}秒")
    print(f"最终视频: {video_duration:.2f}秒")
    
    # 获取字幕信息
    subtitles = get_subtitles(adid, db_path)
    print(f"\n找到 {len(subtitles)} 句字幕")
    
    # 计算各分句长度之和
    total_subtitle_duration = 0
    for idx, cn, en, start, end, tts in subtitles:
        # 计算字幕时长（毫秒）
        subtitle_duration = end - start
        total_subtitle_duration += subtitle_duration
        
        # 检查是否有 TTS
        if tts != 1:
            print(f"警告：第 {idx} 句字幕没有 TTS")
    
    # 转换为秒
    total_subtitle_duration_sec = total_subtitle_duration / 1000
    print(f"\n各分句长度之和: {total_subtitle_duration_sec:.2f}秒")
    
    # 比较长度
    print(f"\n长度比较:")
    print(f"双语音频 vs 各分句之和: {abs(audio_duration - total_subtitle_duration_sec):.2f}秒差异")
    print(f"最终视频 vs 双语音频: {abs(video_duration - audio_duration):.2f}秒差异")
    
    # 判断是否缺少 TTS
    if audio_duration < total_subtitle_duration_sec * 0.8:
        print("\n警告：双语音频长度明显短于各分句之和，可能缺少 TTS 音频部分")
    elif audio_duration > total_subtitle_duration_sec * 1.2:
        print("\n警告：双语音频长度明显长于各分句之和，可能有多余的音频")
    else:
        print("\n双语音频长度与各分句之和基本匹配")
    
    if abs(video_duration - audio_duration) > 1:
        print("警告：最终视频与双语音频长度差异较大")
    else:
        print("最终视频与双语音频长度基本匹配")


if __name__ == "__main__":
    main()
