#!/bin/bash
# FFmpeg Pro-DVD 2-Pass + ISO Creator
# Features: Deep IDET Analysis, BWDIF De-interlace, Separate Denoise/Deblock, V/H Crop, 2-Stage Autocrop, Chapters, Vitality EQ, Film Grain, CAS, A/V Fades
# Concept and Testing by Glen MacArthur, coded by Google Gemini 3

# 1. Input Check
IFS=$'\n' FILES=($(sort <<<"$*"))
unset IFS
[[ ${#FILES[@]} -lt 1 ]] && exit 1

# 2. MAIN SETTINGS DIALOG
MAIN_OPTIONS=$(yad --form \
    --title="FFmpeg Convert to MPEG-2 (DVD)" \
    --image="/usr/local/share/icons/custom/ffmpeg-app.png" \
    --window-icon="/usr/local/share/icons/custom/ffmpeg.png" \
    --width=720 --center \
    --text="<b>Select Output Options for MPEG-PS &amp; ISO</b>" \
    --field="Aspect Ratio:CB" "16:9!4:3" \
    --field="--- Restoration ---:RO" "" \
    --field="De-interlace (BWDIF):CHK" "FALSE" \
    --field="Deep Interlace Analysis (idet):CHK" "FALSE" \
    --field="Enable Denoising (hqdn3d):CHK" "FALSE" \
    --field="Enable Deblocking (spp):CHK" "FALSE" \
    --field="--- Enhancement ---:RO" "" \
    --field="Apply Subtle Enhancement:CHK" "FALSE" \
    --field="Enable CAS Sharpening:CHK" "FALSE" \
    --field="Add Film Grain Filter:CHK" "FALSE" \
    --field="--- Geometry ---:RO" "" \
    --field="Top/Bottom Crop (Pixels):NUM" "0!0|500|1" \
    --field="Left/Right Crop (Pixels):NUM" "0!0|500|1" \
    --field="Smart Autocrop:CHK" "FALSE" \
    --field="--- Output Options ---:RO" "" \
    --field="Volume Label:" "" \
    --field="Force NTSC (29.97fps):CHK" "FALSE" \
    --field="Enable Frame Blend:CHK" "FALSE" \
    --field="Apply 1s Fade In/Out:CHK" "FALSE" \
    --field="Dual Layer (DVD-9):CHK" "FALSE" \
    --field="Create ISO Image:CHK" "FALSE" \
    --button="Start Convert":10 \
    --button="Cancel":1)

[[ $? -ne 10 ]] && exit 0

OUTPUT_AR=$(echo "$MAIN_OPTIONS" | cut -d'|' -f1)
DO_DEINTERLACE=$(echo "$MAIN_OPTIONS" | cut -d'|' -f3)
RUN_IDET=$(echo "$MAIN_OPTIONS" | cut -d'|' -f4)
DO_DENOISE=$(echo "$MAIN_OPTIONS" | cut -d'|' -f5)
DO_DEBLOCK=$(echo "$MAIN_OPTIONS" | cut -d'|' -f6)
EQ_BUMP=$(echo "$MAIN_OPTIONS" | cut -d'|' -f8)
DO_CAS=$(echo "$MAIN_OPTIONS" | cut -d'|' -f9)
ADD_GRAIN=$(echo "$MAIN_OPTIONS" | cut -d'|' -f10)
V_CROP=$(echo "$MAIN_OPTIONS" | cut -d'|' -f12 | cut -d'.' -f1)
H_CROP=$(echo "$MAIN_OPTIONS" | cut -d'|' -f13 | cut -d'.' -f1)
AUTO_CROP=$(echo "$MAIN_OPTIONS" | cut -d'|' -f14)
VOL_LABEL=$(echo "$MAIN_OPTIONS" | cut -d'|' -f16)
FORCE_NTSC=$(echo "$MAIN_OPTIONS" | cut -d'|' -f17)
RESCUE_MODE=$(echo "$MAIN_OPTIONS" | cut -d'|' -f18)
APPLY_FADES=$(echo "$MAIN_OPTIONS" | cut -d'|' -f19)
IS_DVD9=$(echo "$MAIN_OPTIONS" | cut -d'|' -f20)
CREATE_ISO=$(echo "$MAIN_OPTIONS" | cut -d'|' -f21)

# --- SECTION 3: GLOBAL ENCODING DEFINITIONS ---
export VIDEO_FORMAT=NTSC 
HEALER_FLAGS="-fflags +genpts -avoid_negative_ts make_zero"
MPEG2_BASE_OPTS="-target ntsc-dvd -b:v 7500k -maxrate 8500k -bufsize 1835k -flags +cgop -sc_threshold 1000000000"

# --- SECTION 4: PROCESSING LOOP ---
for INPUT_FILE in "${FILES[@]}"; do
    [[ ! -f "$INPUT_FILE" ]] && { echo "File not found: $INPUT_FILE"; continue; }

    BASENAME=$(basename "${INPUT_FILE%.*}")
    DIRNAME=$(dirname "$INPUT_FILE")
    OUTPUT_MPG="${DIRNAME}/${BASENAME}_DVD.mpg"
    PASS_LOG="/tmp/ffmpeg2pass_$(date +%s)"
    
    # Reset audio filter chain string for each loop iteration
    AUDIO_AF="loudnorm=I=-16:LRA=11:TP=-1.5"

    # --- IDET ANALYSIS PASS (STRICT & BASE-10 COMPLIANT) ---
    CALCULATED_PARITY="auto"
    if [[ "$RUN_IDET" == "TRUE" ]]; then
        IDET_LOG=$(ffmpeg -i "$INPUT_FILE" -vf "idet" -frames:v 1000 -an -f null /dev/null 2>&1)
        
        TFF_STR=$(echo "$IDET_LOG" | grep -i "Repeated Fields" | awk '{print $3}' | sed 's/[^0-9]//g' | head -n1)
        BFF_STR=$(echo "$IDET_LOG" | grep -i "Repeated Fields" | awk '{print $5}' | sed 's/[^0-9]//g' | head -n1)
        
        TFF_INT=$((10#${TFF_STR:-0}))
        BFF_INT=$((10#${BFF_STR:-0}))
        
        if [ "$TFF_INT" -ge "$BFF_INT" ]; then
            CALCULATED_PARITY="tff"
        else
            CALCULATED_PARITY="bff"
        fi
        
        if [ "$TFF_INT" -gt 0 ] || [ "$BFF_INT" -gt 0 ]; then
            DEINTERLACE="TRUE"
        fi
    fi

    # Geometry & Filter Construction
    FPS_FLAG=""; RESCUE_FILTER=""; TELECINE_FILTER=""
    if [[ "$FORCE_NTSC" == "TRUE" ]]; then
        DETECTED_FPS=$(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 "$INPUT_FILE")
        [[ "$RESCUE_MODE" == "TRUE" ]] && RESCUE_FILTER="framerate=fps=30000/1001," || [[ "$DETECTED_FPS" == "24/1" || "$DETECTED_FPS" == "24000/1001" ]] && TELECINE_FILTER="telecine=pattern=23," || FPS_FLAG="-r 30000/1001"
    fi
    [[ "$OUTPUT_AR" == "16:9" ]] && { SAR_VAL="40/33"; ASPECT_FLAG="-aspect 16:9"; } || { SAR_VAL="10/11"; ASPECT_FLAG="-aspect 4:3"; }
    
    VF_BUILD=""
    [[ "$DO_DEINTERLACE" == "TRUE" ]] && VF_BUILD+="bwdif=mode=0:parity=${CALCULATED_PARITY}:deint=1,"
    [[ "$DO_DENOISE" == "TRUE" ]] && VF_BUILD+="hqdn3d=4:3:6:4.5,"
    [[ "$DO_DEBLOCK" == "TRUE" ]] && VF_BUILD+="spp=quality=3,"
    VF_BUILD+="$RESCUE_FILTER$TELECINE_FILTER"
    
    # --- SMART AUTOCROP LOGIC BLOCK ---
    if [[ "$AUTO_CROP" == "TRUE" ]]; then
        DETECTED_CROP=$(ffmpeg -ss 00:02:00 -t 30 -i "$INPUT_FILE" -vf "cropdetect=limit=24:round=16" -an -f null /dev/null 2>&1 | grep -o "crop=[0-9]*:[0-9]*:[0-9]*:[0-9]*" | tail -n 1)
        [[ -n "$DETECTED_CROP" ]] && VF_BUILD+="${DETECTED_CROP},"
    elif [[ "$V_CROP" -gt 0 || "$H_CROP" -gt 0 ]]; then
        VF_BUILD+="crop=in_w-$((H_CROP*2)):in_h-$((V_CROP*2)):$H_CROP:$V_CROP,"
    fi
    
    VF_BUILD+="scale=720:480:flags=lanczos+accurate_rnd+full_chroma_inp,setsar=$SAR_VAL,unsharp=5:5:0.8:5:5:0.0"
    [[ "$EQ_BUMP" == "TRUE" ]] && VF_BUILD+=",eq=brightness=-0.05:contrast=1.2:gamma=1.3:saturation=1.2"
    [[ "$DO_CAS" == "TRUE" ]] && VF_BUILD+=",cas=strength=0.5"
    [[ "$ADD_GRAIN" == "TRUE" ]] && VF_BUILD+=",noise=c0_strength=10:c0_flags=0x00000003:c1_strength=0:c2_strength=0:c3_strength=0"

    # --- RESTORED: AUDIO/VIDEO FADE DESIGNATION ENGINE ---
    TOTAL_SECONDS=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$INPUT_FILE")
    
    if [[ "$APPLY_FADES" == "TRUE" ]]; then
        # Query accurate frame rate to pin-point final out-point frames
        LOCAL_FPS=$(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 "$INPUT_FILE" | bc -l)
        # Handle telecine/forced framerate target adjustments
        [[ "$FORCE_NTSC" == "TRUE" ]] && LOCAL_FPS=29.97
        
        # Calculate fade out parameters based on total frames
        CURR_FRAMES=$(echo "$TOTAL_SECONDS * $LOCAL_FPS" | bc | cut -d'.' -f1)
        F_LEN=$(echo "$LOCAL_FPS" | bc | cut -d'.' -f1) # Exactly 1 second worth of frames
        O_START=$(( CURR_FRAMES - F_LEN ))
        [[ "$O_START" -lt 0 ]] && O_START=0
        
        # Append video fade filters
        VF_BUILD+=",fade=t=in:st=0:n=$F_LEN,fade=t=out:st=$O_START:n=$F_LEN"
        
        # Append audio fade filters
        AUDIO_OUT_START=$(echo "$TOTAL_SECONDS - 1.0" | bc -l)
        AUDIO_AF+=",afade=t=in:st=0:d=1,afade=t=out:st=${AUDIO_OUT_START}:d=1"
    fi

    # Pass 1: Runs in Terminology standalone window
    notify-send -t 3000 "Running Analysis Pass 1, Please Wait..." "Large Files could take several minutes!" --icon="/usr/local/share/icons/custom/ffmpeg.png"
    
    terminology -T="DVD MPEG-2 Encoding Pass 1/2 (Analysis)" -e bash -c "
        echo '==================================================';
        echo 'STARTING PASS 1 (Analysis Filter Processing Loop)...';
        echo '==================================================';
        ffmpeg -y $FPS_FLAG -i '$INPUT_FILE' $HEALER_FLAGS -vf '$VF_BUILD' $MPEG2_BASE_OPTS $ASPECT_FLAG -pass 1 -passlogfile '$PASS_LOG' -an -f dvd /dev/null
    "
    
    # Catch Pass 1 failures before handing off to Pass 2
    if [[ $? -ne 0 ]]; then
        yad --error --width=600 --window-icon="/usr/local/share/icons/custom/ffmpeg.png" --text="Pass 1 Analysis Failed! Check input file."
        continue
    fi

    # Pass 2: Runs silently in background, piping output to the desktop YAD progress bar
    echo "Starting Pass 2 (Encoding)..."
    ffmpeg -y $FPS_FLAG -i "$INPUT_FILE" $HEALER_FLAGS -vf "$VF_BUILD" $MPEG2_BASE_OPTS $ASPECT_FLAG -pass 2 -passlogfile "$PASS_LOG" -af "$AUDIO_AF" -c:a ac3 -b:a 448k -ar 48000 -ac 2 "$OUTPUT_MPG" -progress - 2>&1 | \
        stdbuf -i0 -o0 -e0 grep --line-buffered "out_time_us=" | \
        stdbuf -i0 -o0 -e0 awk -v total="$TOTAL_SECONDS" '{
            split($0, a, "=");
            if (a[1] == "out_time_us") {
                curr_secs = a[2] / 1000000;
                if (total > 0) {
                    pct = int(100 * curr_secs / total);
                    if (pct >= 100) pct = 99;
                    if (pct >= 0) { print pct; fflush(); }
                }
            }
        }' | yad --progress --title="DVD MPEG-2 Encoding: Pass 2/2 (Rendering)" --width=600 --window-icon="/usr/local/share/icons/custom/ffmpeg.png" --image="/usr/local/share/icons/custom/ffmpeg-app.png" --center --auto-close --percentage=0

    # Cleanup logs after completion
    rm -f "${PASS_LOG}-0.log" "${PASS_LOG}-1.log"
done

notify-send "DVD Conversion Complete!" --icon="/usr/local/share/icons/custom/ffmpeg.png"
exit 0