#!/bin/bash
#
# remux_fix_timestamp.sh
# 对指定文件夹内所有视频文件执行：
#   ffmpeg -i xxx.mp4 -c copy xxx1.mp4
# 重新封装（remux，不重新编码，仅修复容器/时间戳问题），
# 成功后删除原文件，并将新文件改回原文件名。
#
# 用法:
#   ./remux_fix_timestamp.sh [文件夹路径]
#
# 示例:
#   ./remux_fix_timestamp.sh ./videos
#   ./remux_fix_timestamp.sh          # 默认当前目录
#
# 说明:
#   - "-c copy" 表示不重新编码，只是重新封装容器，速度快，
#     常用于修复因异常时间戳(PTS/DTS)导致的播放/拼接问题。
#   - 处理流程: xxx.mp4 -> 生成 xxx1.mp4 -> 校验成功 -> 删除 xxx.mp4
#     -> 将 xxx1.mp4 改名为 xxx.mp4（保持原文件名，方便后续合并脚本使用）。
#   - 如果某个文件处理失败，会保留原文件，不会误删。

set -uo pipefail

FOLDER="${1:-.}"

if [ ! -d "$FOLDER" ]; then
    echo "错误: 文件夹不存在: $FOLDER"
    exit 1
fi

EXTENSIONS=("mp4" "mkv" "mov" "avi" "flv" "wmv" "webm" "ts" "m4v")

FIND_EXPR=()
for ext in "${EXTENSIONS[@]}"; do
    FIND_EXPR+=(-iname "*.${ext}" -o)
done
unset 'FIND_EXPR[${#FIND_EXPR[@]}-1]'

mapfile -t VIDEOS < <(find "$FOLDER" -maxdepth 1 -type f \( "${FIND_EXPR[@]}" \) | sort -V)

if [ "${#VIDEOS[@]}" -eq 0 ]; then
    echo "错误: 在 $FOLDER 中未找到任何视频文件"
    exit 1
fi

echo "找到 ${#VIDEOS[@]} 个视频文件，开始逐个重新封装（remux）..."
echo ""

SUCCESS_COUNT=0
FAIL_COUNT=0

for v in "${VIDEOS[@]}"; do
    DIR=$(dirname "$v")
    BASE=$(basename "$v")
    NAME="${BASE%.*}"
    EXT="${BASE##*.}"

    NEWFILE="${DIR}/${NAME}1.${EXT}"

    # 避免覆盖已存在的同名文件
    if [ -e "$NEWFILE" ]; then
        echo "跳过: $NEWFILE 已存在，请先手动处理"
        FAIL_COUNT=$((FAIL_COUNT + 1))
        continue
    fi

    echo "处理: $BASE"
    if ffmpeg -y -i "$v" -c copy "$NEWFILE" -loglevel error; then
        # 校验新文件确实生成且非空
        if [ -s "$NEWFILE" ]; then
            rm -f "$v"
            mv "$NEWFILE" "$v"
            echo "  完成: $BASE (时间戳已修复)"
            SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
        else
            echo "  失败: 生成的文件为空，保留原文件 $BASE"
            rm -f "$NEWFILE"
            FAIL_COUNT=$((FAIL_COUNT + 1))
        fi
    else
        echo "  失败: ffmpeg 处理出错，保留原文件 $BASE"
        rm -f "$NEWFILE"
        FAIL_COUNT=$((FAIL_COUNT + 1))
    fi
    echo ""
done

echo "处理完成: 成功 $SUCCESS_COUNT 个，失败 $FAIL_COUNT 个"
