﻿#!/bin/bash
set -euo pipefail

# -------------------------- 1. 配置参数（必改） --------------------------
LOCAL_DIR="/home/nick/.wine/drive_c/users/nick/Documents/wechat"  # 本地视频文件夹
S3_BUCKET="www.staroceans.org"                                   # S3桶名
S3_DIR="video/wechat/"                                           # S3目标目录（末尾加/）
MP3_LOCAL_SUBDIR="mp3"                                           # 本地MP3子目录名
MP3_S3_SUBDIR="mp3/"                                             # S3上MP3子目录名（末尾加/）

# -------------------------- 2. 测试模式开关（选填） --------------------------
DRY_RUN=false  # 测试时改true（只打印不执行），正式上传改false

# -------------------------- 3. 链接文件路径配置 --------------------------
LINK_FILE="/home/nick/diabloforum/tools/data/s3_video_links.txt"
MP3_LINK_FILE="/home/nick/diabloforum/tools/data/s3_audio_links.txt"
TOP_FILE="/home/nick/diabloforum/tools/data/top.txt"
BOTTOM_FILE="/home/nick/diabloforum/tools/data/bottom.txt"
VIDEO_FILE="/home/nick/diabloforum/tools/data/video_list.html"
MP3_VIDEO_FILE="/home/nick/diabloforum/tools/data/audio_list.html"


# -------------------------- 核心函数定义 --------------------------
safe_exec() {
    local cmd="$*"
    if [ "$DRY_RUN" = true ]; then
        echo "[DRY RUN] $cmd"
    else
        echo "[实际执行] $cmd"
        eval "$cmd"
    fi
}

get_file_md5() {
    local file_path="$1"
    if [ "$DRY_RUN" = true ]; then
        echo "模拟MD5"
        return
    fi
    md5sum "$file_path" | awk '{print $1}'
}

s3_file_exists() {
    local s3_path="$1"
    if [ "$DRY_RUN" = true ]; then
        return 1  # 测试模式默认不存在
    fi
    s3cmd info "$s3_path" >/dev/null 2>&1
}

get_s3_md5() {
    local s3_path="$1"
    if [ "$DRY_RUN" = true ]; then
        echo "模拟S3 MD5"
        return
    fi
    s3cmd info "$s3_path" | grep "MD5 sum" | awk -F': ' '{print $2}' | xargs
}

get_file_timestamp() {
    local file_path="$1"
    if [ "$DRY_RUN" = true ]; then
        date +"%Y-%m-%d %H:%M:%S"
        return
    fi
    if [ ! -f "$file_path" ]; then
        echo "错误：文件不存在 $file_path" >&2
        exit 1
    fi
    stat --format="%y" "$file_path" | cut -d. -f1
}

process_mp4() {
    local local_mp4="$1"
    local filename=$(basename "$local_mp4")
    local s3_mp4_path="s3://${S3_BUCKET}/${S3_DIR}${filename}"
    local s3_mp4_url="http://${S3_BUCKET}/${S3_DIR}${filename}"

    echo -e "\n=== 处理MP4文件：$filename ==="
    echo "[步骤1] 检查S3是否存在: $s3_mp4_path"
    
    local s3_exists=false
    if s3_file_exists "$s3_mp4_path"; then
        s3_exists=true
    fi

    local s3_md5_check=false
    if [ "$s3_exists" = true ] && [ "$s3_md5_check" = true ]; then
        local local_md5=$(get_file_md5 "$local_mp4")
        local s3_md5=$(get_s3_md5 "$s3_mp4_path")
        echo "[对比] 本地MD5: $local_md5 | S3 MD5: $s3_md5"
        
        if [ "$local_md5" != "$s3_md5" ]; then
            echo "[结论] MD5不一致，需要重新上传"
            s3_exists=false
        else
            echo "[结论] MD5一致，跳过上传"
        fi
    fi

    if [ "$s3_exists" = false ]; then
        echo "[步骤2] 开始上传到S3"
        safe_exec "s3cmd put --mime-type=\"video/mp4\" --acl-public --continue --check-md5 '$local_mp4' '$s3_mp4_path'"
    fi

    local timestamp=$(get_file_timestamp "$local_mp4")
    local link_line="<li><a href=\"$s3_mp4_url\">$filename ($timestamp)</a></li>"
    safe_exec "echo '$link_line' >> $LINK_FILE"
    echo "[步骤3] 已添加链接到列表"
}

process_mp3() {
    local local_mp4="$1"
    local filename=$(basename "$local_mp4")
    local filename_noext="${filename%.mp4}"
    local mp3_filename="${filename_noext}.mp3"
    
    local local_mp3_dir="${LOCAL_DIR}/${MP3_LOCAL_SUBDIR}"
    local local_mp3="${local_mp3_dir}/${mp3_filename}"
    local s3_mp3_path="s3://${S3_BUCKET}/${S3_DIR}${MP3_S3_SUBDIR}${mp3_filename}"
    local s3_mp3_url="http://${S3_BUCKET}/${S3_DIR}${MP3_S3_SUBDIR}${mp3_filename}"

    echo -e "\n=== 处理MP3文件：$mp3_filename ==="
    
    safe_exec "mkdir -p $local_mp3_dir"

    echo "[步骤1] 检查本地MP3: $local_mp3"
    if [ ! -f "$local_mp3" ] || [ "$DRY_RUN" = true ]; then
        if [ "$DRY_RUN" = false ] && [ ! -f "$local_mp3" ]; then
            echo "[生成] 本地不存在，使用ffmpeg提取音频"
            safe_exec "ffmpeg -y -i '$local_mp4' -vn -acodec libmp3lame '$local_mp3'"
        else
            echo "[DRY RUN] 模拟生成MP3文件"
        fi
    fi

    echo "[步骤2] 检查S3是否存在: $s3_mp3_path"
    local s3_exists=false
    if s3_file_exists "$s3_mp3_path"; then
        s3_exists=true
    fi

    local s3_md5_check=false
    if [ "$s3_exists" = true ] && [ "$s3_md5_check" = true ]; then
        local local_md5=$(get_file_md5 "$local_mp3")
        local s3_md5=$(get_s3_md5 "$s3_mp3_path")
        echo "[对比] 本地MD5: $local_md5 | S3 MD5: $s3_md5"
        
        if [ "$local_md5" != "$s3_md5" ]; then
            echo "[结论] MD5不一致，需要重新上传"
            s3_exists=false
        else
            echo "[结论] MD5一致，跳过上传"
        fi
    fi

    if [ "$s3_exists" = false ]; then
        echo "[步骤3] 开始上传到S3"
        safe_exec "s3cmd put --mime-type=\"audio/mpeg\" --acl-public --continue --check-md5 '$local_mp3' '$s3_mp3_path'"
    fi

    local timestamp=$(get_file_timestamp "$local_mp3")
    local link_line="<li><a href=\"$s3_mp3_url\">$mp3_filename ($timestamp)</a></li>"
    safe_exec "echo '$link_line' >> $MP3_LINK_FILE"
    echo "[步骤4] 已添加链接到列表"
}


# -------------------------- 主程序 --------------------------
main() {
    echo "========================================"
    if [ "$DRY_RUN" = true ]; then
        echo "🔴 当前为DRY RUN测试模式，不会实际执行操作"
    else
        echo "🟢 当前为正式模式，将执行实际操作"
        # 清空并初始化链接文件
        safe_exec "> $LINK_FILE"
        safe_exec "echo '<ol>' > $LINK_FILE"
        safe_exec "> $MP3_LINK_FILE"
        safe_exec "echo '<ol>' > $MP3_LINK_FILE"
    fi

    echo "本地目录: $LOCAL_DIR"
    echo "本地MP3目录: $LOCAL_DIR/$MP3_LOCAL_SUBDIR"
    echo "S3 MP4目标: s3://$S3_BUCKET/$S3_DIR"
    echo "S3 MP3目标: s3://$S3_BUCKET/$S3_DIR$MP3_S3_SUBDIR"
    echo "========================================"

    # 获取并按自然排序（人类习惯）排列MP4文件
    local mp4_files
    mp4_files=$(find "$LOCAL_DIR" -maxdepth 1 -type f -name "*.mp4" | sort -V)

    # 统计文件总数
    local total_count=$(echo "$mp4_files" | wc -l | xargs)
    echo -e "\n📊 发现的MP4文件总数: $total_count 个"

    # DRY_RUN模式下打印排序后的文件名
    if [ "$DRY_RUN" = true ]; then
        echo -e "\n📋 按处理顺序排列的MP4文件列表："
        local idx=1
        while IFS= read -r file; do
            if [ -n "$file" ]; then
                echo "  $idx. $(basename "$file")"
                idx=$((idx + 1))
            fi
        done <<< "$mp4_files"
    fi

    # 处理每个MP4文件
    local processed_count=0
    while IFS= read -r mp4_file; do
        if [ -n "$mp4_file" ]; then
            processed_count=$((processed_count + 1))
            echo -e "\n===== 开始处理第 $processed_count/$total_count 个文件 ====="
            process_mp4 "$mp4_file"
            process_mp3 "$mp4_file"
            echo "----------------------------------------"
        fi
    done <<< "$mp4_files"

    # 生成最终HTML文件
    echo -e "\n[生成HTML列表]"
    # 处理MP4 HTML
    safe_exec "echo '</ol>' >> $LINK_FILE"
    safe_exec "cat $TOP_FILE > $VIDEO_FILE"
    safe_exec "cat $LINK_FILE >> $VIDEO_FILE"
    safe_exec "cat $BOTTOM_FILE >> $VIDEO_FILE"
    safe_exec "s3cmd put --mime-type=\"text/html\" --acl-public --continue --check-md5 '$VIDEO_FILE' 's3://$S3_BUCKET/tools/data/video_list.html'"

    # 处理MP3 HTML
    safe_exec "echo '</ol>' >> $MP3_LINK_FILE"
    safe_exec "cat $TOP_FILE > $MP3_VIDEO_FILE"
    safe_exec "cat $MP3_LINK_FILE >> $MP3_VIDEO_FILE"
    safe_exec "cat $BOTTOM_FILE >> $MP3_VIDEO_FILE"
    safe_exec "s3cmd put --mime-type=\"text/html\" --acl-public --continue --check-md5 '$MP3_VIDEO_FILE' 's3://$S3_BUCKET/tools/data/audio_list.html'"

    echo -e "\n🎉 所有文件处理完成！"
    echo "📊 处理统计：共发现 $total_count 个MP4文件，实际处理 $processed_count 个"
    if [ "$DRY_RUN" = true ]; then
        echo "🔴 注意：测试模式未执行实际操作，请核对排序是否符合预期"
    else
        echo "🟢 MP4链接列表: $LINK_FILE"
        echo "🟢 MP3链接列表: $MP3_LINK_FILE"
    fi
}

# 启动主程序
main
