#!/usr/bin/env python3
"""
将第一段视频延长一倍时长，后半部分使用最后一帧作为静止画面
"""
import subprocess
import os
import tempfile

# 导入编码处理模块
from console_helper import (
    safe_print, print_header, print_step, print_info,
    print_success, print_fail, print_done
)

def get_video_duration(video_path):
    """获取视频时长（使用ffprobe）"""
    args = [
        'ffprobe',
        '-v', 'quiet',
        '-print_format', 'json',
        '-show_format',
        video_path
    ]
    
    try:
        result = subprocess.run(args, check=True, capture_output=True, text=True)
        import json
        data = json.loads(result.stdout)
        return float(data['format']['duration'])
    except Exception as e:
        safe_print(f"      获取时长失败: {e}")
        return None

def extract_last_frame(video_path, output_image, ffmpeg_path="ffmpeg"):
    """提取视频最后一帧"""
    # 先获取视频时长
    duration = get_video_duration(video_path)
    if duration is None:
        return False
    
    # 在视频结束前0.1秒提取一帧
    args = [
        ffmpeg_path,
        '-y',
        '-ss', str(max(0, duration - 0.1)),
        '-i', video_path,
        '-vframes', '1',
        '-q:v', '2',
        output_image
    ]
    
    try:
        subprocess.run(args, check=True, capture_output=True)
        return True
    except subprocess.CalledProcessError as e:
        safe_print(f"      提取最后一帧失败: {e}")
        return False

def create_paused_video(image_path, duration, output_path, ffmpeg_path="ffmpeg"):
    """使用静态图片创建视频（带静音音频）"""
    args = [
        ffmpeg_path,
        '-y',
        '-loop', '1',
        '-i', image_path,
        '-f', 'lavfi',
        '-i', 'anullsrc=r=44100:cl=mono',
        '-c:v', 'libx264',
        '-c:a', 'aac',
        '-ar', '44100',
        '-ac', '1',
        '-t', str(duration),
        '-pix_fmt', 'yuv420p',
        '-vf', 'fps=30',
        '-shortest',
        output_path
    ]
    
    try:
        subprocess.run(args, check=True, capture_output=True)
        return True
    except subprocess.CalledProcessError as e:
        safe_print(f"      创建暂停视频失败: {e}")
        return False

def concatenate_videos(video_list, output_path, ffmpeg_path="ffmpeg"):
    """拼接多个视频（使用concat demuxer）"""
    # 创建临时文件列表（放在当前目录）
    list_file = 'video_list.txt'
    with open(list_file, 'w', encoding='utf-8') as f:
        for video in video_list:
            # 使用正斜杠
            escaped_path = video.replace('\\', '/')
            f.write(f"file '{escaped_path}'\n")
    
    args = [
        ffmpeg_path,
        '-y',
        '-f', 'concat',
        '-safe', '0',
        '-i', list_file,
        '-c:v', 'libx264',
        '-c:a', 'aac',
        '-ar', '44100',
        '-ac', '1',
        '-pix_fmt', 'yuv420p',
        output_path
    ]
    
    try:
        result = subprocess.run(args, check=True, capture_output=True, text=True)
        os.remove(list_file)
        return True
    except subprocess.CalledProcessError as e:
        safe_print(f"      拼接视频失败")
        if e.stderr:
            # 显示更多错误信息
            error_msg = e.stderr
            if "Permission denied" in error_msg:
                safe_print(f"      错误: 文件权限被拒绝，请更换输出文件名")
            else:
                safe_print(f"      错误信息: {error_msg[:300]}")
        try:
            os.remove(list_file)
        except:
            pass
        return False

def main():
    input_video = "segment_01.mp4"
    output_video = "segment_01_extended.mp4"
    temp_dir = tempfile.gettempdir()
    last_frame_image = os.path.join(temp_dir, "last_frame.png")
    paused_video = os.path.join(temp_dir, "paused_segment.mp4")
    
    print_header("视频延长工具")
    safe_print(f"输入视频: {input_video}")
    safe_print("")
    
    # 1. 获取原始视频时长
    print_step(1, 4, "获取原始视频时长...")
    duration = get_video_duration(input_video)
    if duration is None:
        safe_print("获取时长失败，退出")
        return
    print_info("时长", f"{duration:.3f}秒")
    safe_print("")
    
    # 2. 提取最后一帧
    print_step(2, 4, "提取最后一帧...")
    if not extract_last_frame(input_video, last_frame_image):
        safe_print("提取失败，退出")
        return
    print_info("已保存", last_frame_image)
    safe_print("")
    
    # 3. 创建空白视频
    print_step(3, 4, "创建静止画面视频...")
    if not create_paused_video(last_frame_image, duration, paused_video):
        safe_print("创建失败，退出")
        return
    print_info("已创建", paused_video)
    print_info("时长", f"{duration:.3f}秒")
    safe_print("")
    
    # 4. 拼接两个视频
    print_step(4, 4, "拼接视频...")
    if not concatenate_videos([input_video, paused_video], output_video):
        safe_print("拼接失败")
        return
    print_info("输出", output_video)
    
    # 5. 验证结果
    final_duration = get_video_duration(output_video)
    print_info("最终时长", f"{final_duration:.3f}秒 (原始时长的 {final_duration/duration:.1f}倍)")
    safe_print("")
    
    # 清理临时文件
    try:
        os.remove(last_frame_image)
        os.remove(paused_video)
        safe_print("[清理] 临时文件已删除")
    except:
        pass
    
    print_done()

if __name__ == '__main__':
    main()
