#! /bin/sh

set -ue

die() {
    [ -n "$1" ] && echo >&2 "$1"
    cat >&2 <<EOF
Usage: $0 [OPTIONS] FILE
Available options:
 -d DURATION  duration of each chunk (default: 5 seconds)
 -v QUALITY   mp3 quality, like lame -V (default: 2)
EOF
    exit 1
}

encode() {
    in=$1
    name="${in%.*}"
    [ $2 -gt 1 ] && in=${name}.mp3
    ffmpeg -v error -i "$in" -c:a libmp3lame -q:a $QUALITY "${name}_tmp.mp3"
    mv "${name}_tmp.mp3" "$name.mp3"
}

DURATION=5
QUALITY=2

while getopts ":d:v:" opt; do
    case $opt in
        d)
            [ ! "$OPTARG" -ge 0 2>/dev/null ] && die "Invalid duration: $OPTARG"
            DURATION="$OPTARG"
            ;;
        v)
            [ ! "$OPTARG" -ge 0 2>/dev/null ] && die "Invalid quality: $OPTARG"
            QUALITY="$OPTARG"
            ;;
        \?)
            die "Invalid option: -$opt"
            ;;
    esac
done

shift $((OPTIND - 1))
[ ! -f "$1" ] && die "File not found: $1"

ffmpeg -v error -stats -i "$1" -f segment -segment_time $DURATION -segment_start_number 1 -vn "%03d.wav"

for f in [0-9][0-9][0-9].wav; do
    num=${f%.*}
    for j in $(seq 1 $num); do
        printf >&2 "%s: pass %d\r" "$f" "$j"
        encode "$f" "$j"
    done
    echo >&2
    echo "file '${num}.mp3'"
done | ffmpeg -y -v error -stats -protocol_whitelist pipe,file -f concat -i - out.wav

rm [0-9][0-9][0-9].mp3 [0-9][0-9][0-9].wav