import ctypes
import os
import glob
import subprocess

def get_short_path_name(long_name):
    output_buf_size = 0
    while True:
        buf = ctypes.create_unicode_buffer(output_buf_size)
        needed = ctypes.windll.kernel32.GetShortPathNameW(long_name, buf, output_buf_size)
        if output_buf_size >= needed:
            return buf.value
        output_buf_size = needed


def add_cover_physical(filemain):
    """
    物理拼接封面：将图片强制作为视频的第1帧，解决平台不识别的问题
    """
    video_path = f"{filemain}_final_bilingual.mp4"
    cover_dir = r"y:\xtrssvjj"
    output_path = f"mp4forpub/{filemain}_platform_ready.mp4"
    
    # 1. 搜寻封面
    search_pattern = os.path.join(cover_dir, f"{filemain}_*.jpg")
    found_covers = glob.glob(search_pattern)
    if not found_covers:
        print("❌ 未找到封面图")
        # return
    
    image_path = max(found_covers, key=os.path.getmtime)

    print(f"🚀 正在进行物理合并（适配所有平台）...")

    from pathlib import Path
    import subprocess

    # 2. 构建 FFmpeg 复杂滤镜命令
    # 核心逻辑：将图片缩放到视频尺寸，覆盖在视频开头，仅持续 1 帧或极短时间
    # 这样视频的第一帧就是图片内容，平台抓取封面绝对不会错
    v_path = str(Path(video_path).resolve())
    i_path = str(Path(image_path).resolve())
    o_path = str(Path(output_path).resolve())
    # v_path='第35集：孔祥熙宋霭龄逃离的手段能有多高超？连老蒋都始料未及！#孔祥熙#宋霭龄_final_bilingual.mp4'
    # v_path='a.mp4'
    # i_path='a.jpg'
    cmd = [
        'ffmpeg', '-y',
        '-i', 'file:'+v_path,
        '-i', i_path,
        '-filter_complex', 
        # 将第二路输入(图片)缩放到和第一路(视频)一样大，然后覆盖在最前面
        '[1:v]scale=trunc(iw/2)*2:trunc(ih/2)*2[img];[0:v][img]overlay=enable=\'between(t,0,0.1)\'[outv]',
        '-map', '[outv]',     # 使用处理后的视频流
        '-map', '0:a',        # 直接拷贝原音频流
        '-c:v', 'libx264',    # 物理修改第一帧必须重新编码视频
        '-preset', 'veryfast',# 提高处理速度
        '-crf', '18',         # 保证画质几乎无损
        '-c:a', 'copy',       # 音频不重编
        output_path
    ]
    # # 优雅点 1：使用 Path 对象，自动处理路径斜杠和编码
    # v_path = str(Path(video_path).resolve())
    # i_path = str(Path(image_path).resolve())
    # o_path = str(Path(output_path).resolve())

    # # 优雅点 2：针对 FFmpeg 的特殊字符敏感，对 filter 内部的路径进行转义
    # # 过滤器里的路径如果包含冒号或逗号，需要特殊处理，但我们这里的 filter 没引用路径，所以保持简洁
    # cmd = [
    #     'ffmpeg', '-y',
    #     '-hide_banner', '-loglevel', 'error', # 优雅点 3：只看错误，保持输出干净
    #     '-i', 'file:'+v_path,
    #     '-i', 'file:'+i_path,
    #     '-filter_complex', 
    #     '[1:v]scale=trunc(iw/2)*2:trunc(ih/2)*2[img];[0:v][img]overlay=enable=\'between(t,0,0.1)\'[outv]',
    #     '-map', '[outv]',
    #     '-map', '0:a',
    #     '-c:v', 'libx264',
    #     '-preset', 'veryfast',
    #     '-crf', '18',
    #     '-c:a', 'copy',
    #     o_path
    # ]

    # 优雅点 4：使用 shell=False (默认) 并通过绝对路径调用，规避 Shell 解析器的干扰
    # subprocess.run(cmd, check=True) 

    try:
        # result=subprocess.run(cmd, check=True) 
        result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8')
        if result.returncode == 0:
            print(f"✅ 处理完成！平台适配版文件: {output_path}")
            return
        else:
            print(f"❌ 出错了：{result.stderr}")
    except Exception as e:
        print(f"💥 崩溃: {e}")

if __name__ == "__main__":
    name = '''
52岁的谷歌创始人坦承“搞砸了”并重回一线写代码，这场帝国反击战告诉我们：AI时代最大的护城河，是放下身段、躬身入局。#科技商业 #人工智能 #谷歌AI #商业认知 #长期主义_bilingual    
    '''
    name=name.strip()
    print('name:>'+name+'<')
    add_cover_physical(name)
