#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
合并双语音频和视频流，生成完整的双语视频
用法: python merge_audio_video.py <adid>
"""
import warnings
# 强行忽略来自 debugpy 内部的所有 UserWarning
warnings.filterwarnings("ignore", category=UserWarning, module=".*debugpy.*")
import os
import sys
import sqlite3
import subprocess


def get_adname(adid, db_path):
    """
    从数据库获取adname
    """
    import inspect
    func_name = inspect.currentframe().f_code.co_name
    line_no = inspect.currentframe().f_lineno
    
    conn = None
    try:
        print('111111111111111111 connect db')

        conn = sqlite3.connect(db_path, timeout=10.0)
        cursor = conn.cursor()
        
        cursor.execute("SELECT DISTINCT adname FROM srts WHERE adid = ? LIMIT 1", (adid,))
        result = cursor.fetchone()
        
        if result:
            return result[0]
        return f"adid_{adid}"
    except Exception as e:
        import traceback
        print(f"错误 [函数: {func_name}, 行号: {line_no}]: 操作失败: {e}")
        traceback.print_exc()
        return f"adid_{adid}"
    finally:
        if conn:
            conn.close()
            print('22222222222222 close db')
def get_adname(adid, db_path):
    """
    从数据库获取adname
    """
    import inspect
    func_name = inspect.currentframe().f_code.co_name
    line_no = inspect.currentframe().f_lineno
    
    conn = None
    try:
        # print('111111111111111111222 connect db')

        conn = sqlite3.connect(db_path, timeout=10.0)
        cursor = conn.cursor()
        
        # cursor.execute("SELECT DISTINCT adname FROM srts WHERE adid = ? LIMIT 1", (adid,))
        cursor.execute("SELECT name FROM ads WHERE rowid = ? LIMIT 1", (adid,))
        result = cursor.fetchone()
        
        if result:
            return result[0]
        return f"adid_{adid}"
    except Exception as e:
        import traceback
        print(f"错误 [函数: {func_name}, 行号: {line_no}]: 操作失败: {e}")
        traceback.print_exc()
        return f"adid_{adid}"
    finally:
        if conn:
            conn.close()
            # print('22222222222222 close db')

def merge_audio_video(adid,adname=''):
    """
    合并音频和视频
    """
    # 配置
    db_path = r'\\ll\D\xtrssvjj\db\dpd.db'
    
    # 获取adname
    if adname=='':
        adname = get_adname(adid, db_path)
    print(f"adname: {adname}")
    
    # 文件路径
    audio_file = f"{adname}_bilingual.mp3"
    image_dir = f"{adname}_images"
    video_file = os.path.join(image_dir, f"{adname}_bilingual_video.mp4")
    output_file = f"{adname}_final_bilingual.mp4"
    
    # 检查文件是否存在
    if not os.path.exists(audio_file):
        print(f"错误：双语音频文件不存在: {audio_file}")
        return False
    
    if not os.path.exists(video_file):
        print(f"错误：视频流文件不存在: {video_file}")
        return False
    
    # 执行合并
    cmd = [
        "ffmpeg", "-y", "-hide_banner",
        "-i", video_file,
        "-i", audio_file,
        "-map", "0:v:0",      # 明确指定：只要第一个输入的第一个视频流
        "-map", "1:a:0",      # 明确指定：只要第二个输入的第一个音频流
        "-c:v", "copy",       # 视频流直接拷贝（秒完成）
        "-c:a", "aac",        # 音频流重编为 AAC
        "-b:a", "192k",
        "-shortest",          # 现在 shortest 会正确对比 9分钟的视频和 9分钟的音频了
        output_file
    ]
    print("开始合并音频和视频...")
    result = subprocess.run(cmd, capture_output=True)
    # print(result.stderr)
    if result.returncode == 0:
        # print(f"合并完成！输出文件: {output_file}")
        return True
    else:
        # 尝试解码错误信息
        try:
            error_msg = result.stderr.decode('utf-8', errors='replace')
        except:
            try:
                error_msg = result.stderr.decode('gbk', errors='replace')
            except:
                error_msg = str(result.stderr)
        print(f"合并失败！错误信息: {error_msg}")
        return False
def main():
    """
    主函数
    """
    if len(sys.argv) != 2:
        print("用法: python merge_audio_video.py <adid>")
        print("示例: python merge_audio_video.py 8496")
        # sys.exit(1)    
    try:
        adid = int(sys.argv[1])
        adname = int(sys.argv[2])
    except Exception as ex:
        print("错误：adid必须是数字")
        adid=280383
    print(f"=== 音频视频合并工具 ===")
    print(f"adid: {adid}")
    
    success = merge_audio_video(adid,adname)
    
    if success:
        print("\n合并完成！")
    else:
        print("\n合并失败！")
        sys.exit(1)
def mergeadvd(adid,adname):
    print(f"=== 音频视频合并工具 ===")
    print(f"adid: {adid}")
    
    success = merge_audio_video(adid,adname)
    
    if success:
        print("\n合并完成！")
        return True
    print("xxx 合并失败！")
    # sys.exit(1)
if __name__ == "__main__":
    main()
