#!/usr/bin/env bash
#
# flv_to_mp4.sh
# Batch convert .flv -> .mp4 (H.264 + AAC) using ffmpeg,
# so videos play natively in browsers without flv.js.
#
# Usage:
#   ./flv_to_mp4.sh [input_dir] [output_dir]
#
# Examples:
#   ./flv_to_mp4.sh
#       -> looks for .flv in current dir, outputs mp4 to ./converted
#   ./flv_to_mp4.sh /path/to/flv_files /path/to/output
#

set -euo pipefail

INPUT_DIR="${1:-.}"
OUTPUT_DIR="${2:-./converted}"

# Encoding settings (tweak if needed)
VIDEO_CODEC="libx264"
VIDEO_PROFILE="baseline"
VIDEO_LEVEL="3.0"
CRF="21"              # quality: lower = better quality / bigger file, sane range 18 to 28
AUDIO_CODEC="aac"
AUDIO_BITRATE="128k"

# Check ffmpeg exists
if ! command -v ffmpeg &> /dev/null; then
    echo "Error: ffmpeg not found. Install it first (e.g. apt install ffmpeg)."
    exit 1
fi

# Check input dir exists
if [ ! -d "$INPUT_DIR" ]; then
    echo "Error: directory '$INPUT_DIR' does not exist."
    exit 1
fi

mkdir -p "$OUTPUT_DIR"

shopt -s nullglob nocaseglob
FLV_FILES=("$INPUT_DIR"/*.flv)
shopt -u nocaseglob

if [ ${#FLV_FILES[@]} -eq 0 ]; then
    echo "No .flv files found in '$INPUT_DIR'."
    exit 0
fi

echo "Found ${#FLV_FILES[@]} .flv file(s). Output dir: $OUTPUT_DIR"
echo "----------------------------------------"

SUCCESS_COUNT=0
FAIL_COUNT=0
FAILED_FILES=()

for FLV in "${FLV_FILES[@]}"; do
    BASENAME=$(basename "$FLV" .flv)
    OUT_FILE="$OUTPUT_DIR/${BASENAME}.mp4"

    if [ -f "$OUT_FILE" ]; then
        echo "[SKIP] '$OUT_FILE' already exists."
        continue
    fi

    echo "[...] Converting: $FLV -> $OUT_FILE"

    if ffmpeg -hide_banner -loglevel error -nostats -y -err_detect ignore_err -i "$FLV" \
        -c:v "$VIDEO_CODEC" -profile:v "$VIDEO_PROFILE" -level "$VIDEO_LEVEL" -crf "$CRF" \
        -c:a "$AUDIO_CODEC" -b:a "$AUDIO_BITRATE" \
        -movflags +faststart \
        "$OUT_FILE"; then

        # Confirm output file exists and is non-empty before touching the source
        if [ -s "$OUT_FILE" ]; then
            echo "[OK]   $OUT_FILE"
            if rm "$FLV"; then
                echo "[DEL]  $FLV"
            else
                echo "[WARN] Could not delete '$FLV' (permissions or read-only filesystem?)"
            fi
            SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
        else
            echo "[FAIL] $FLV (empty output file)"
            FAILED_FILES+=("$FLV")
            FAIL_COUNT=$((FAIL_COUNT + 1))
            rm -f "$OUT_FILE"
        fi
    else
        echo "[FAIL] $FLV"
        FAILED_FILES+=("$FLV")
        FAIL_COUNT=$((FAIL_COUNT + 1))
        rm -f "$OUT_FILE"  # clean up incomplete output
    fi
    echo "----------------------------------------"
done

echo ""
echo "Done: $SUCCESS_COUNT succeeded, $FAIL_COUNT failed."

if [ $FAIL_COUNT -gt 0 ]; then
    echo ""
    echo "Files that failed (possibly unsupported codec or corrupted file):"
    for F in "${FAILED_FILES[@]}"; do
        echo "  - $F"
    done
    exit 1
fi
