#!/usr/bin/env bash
set -euo pipefail

# Base directory to search
cd /home/shared/video || exit 1
dir="."

# Lock directory (atomic)
lockdir="./mp3lockdir"

# Acquire lock
if ! mkdir "$lockdir" 2>/dev/null; then
    echo "Lock exists, another instance is running."
    exit 1
fi
trap 'rm -rf "$lockdir"' EXIT INT TERM

# Process .mp4 and .MP4 files recursively, safely handling special chars
find "$dir" -type f \( -iname '*.mp4' -o -iname '*.m4v' \) -print0 |
while IFS= read -r -d '' input; do
    # Output path with .mp3 extension
    output="${input%.*}.mp3"

    # Skip if output already exists
    if [ -f "$output" ]; then
        printf 'Skipping existing: %s\n' "$output"
        continue
    fi

    # Ensure output directory exists
    outdir=$(dirname -- "$output")
    mkdir -p -- "$outdir"

    # Check for an audio stream using ffprobe
    if ffprobe -v error -select_streams a -show_entries stream=index -of csv=p=0 -- "$input" >/dev/null 2>&1; then
        # Convert using first audio stream; do not overwrite (-n)
        if ffmpeg -hide_banner -loglevel error -n -i "$input" -map 0:a:0 -c:a libmp3lame -b:a 64k "$output"; then
            printf 'Converted: %s -> %s\n' "$input" "$output"
        else
            printf 'ffmpeg failed for: %s\n' "$input"
            rm -f -- "$output" 2>/dev/null || true
        fi
    else
        printf 'No audio stream, skipping: %s\n' "$input"
    fi
done
