#!/bin/bash
SOURCE="$0"
source /usr/lib/elive-tools/functions
EL_REPORTS="1"
#el_make_environment

#trap "exit_ok" 0
trap "exit_error" 1 2 3 5 6 14 15 ERR TERM

exit_error(){
    rm -f "$dest/$( basename "$file" )"
    exit 0
}


main(){
    # pre {{{
    local file from to rate logs returned

    # Usage
    if [[ -z "${2}" ]] ; then
        echo -e "Usage: $(basename $BASH_SOURCE) from-dir to-dir"
        exit 1
    fi


    from="${1%/}"
    shift
    to="${1%/}"
    shift

    to_orig="$to"

    if ! el_dependencies_check "lame" ; then
        el_dependencies_install lame
    fi

    if ! el_dependencies_check "eyeD3" ; then
        el_dependencies_install eyed3
    fi


    mkdir -p "$to"

    logs="/tmp/.$(basename $0)-${USER}-logs.txt"

    # }}}

    # check for invalid files and report it before to proceed
    invalid_files="$( find "$from" -type f \( -iname '*.wav' -o -iname '*.flac' -o -iname '*.ogg' -o -iname '*.m4a' -o -iname '*.wma' \) )"
    if [[ -n "$invalid_files" ]] ; then
        echo "$invalid_files"
        el_warning "There are invalid files in the source directory, please remove them before to proceed"
        exit 1
    fi

    # conver all the files
    while read -ru 3 line
    do
        file="$line"
        if [[ ! -s "$file" ]] ; then
            el_warning "file '$file' doesn't exist, skipping..."
        fi

        to="$to_orig"
        filename="$( basename "$file" )"

        if [[ "$from" = "." ]] ; then
            from=""
        fi

        if [[ "$( echo "$line" | tr '/' '\n' | wc -l )" -le 2 ]] ; then
            dirname="$line"
        else
            if [[ -n "$from" ]] && [[ "$from" != "." ]] ; then
                dirname="$( echo "$line" | sed -e "s|^.*${from}/||g" )"
            else
                dirname="$( echo "$line" | sed -e 's|^/||g' )"
            fi
        fi
        dirname="${dirname%/*}"

        if [[ -d "$to" ]] ; then
            if [[ "$( basename "$from" )" != "$( basename "$to" )" ]] ; then
                to="${to}/$( basename "$from" )"
                to="${to%/}"
            fi
        fi

        dest="${to}/${dirname}"
        destfile="${dest%/}/${filename}"


        if [[ -s "$destfile" ]] ; then
            el_explain 0 "skipping '$file'"
            continue
        fi

        mkdir -p "$dest"
        rm -f "$logs"


        rate="$( eyeD3 --no-color "$file" 2>/dev/null | strings | grep -F "kb/s" | sed -e 's|^.*\[ ||g' -e 's|kb/s .*$||g' -e 's|~||g' )"


        if { [[ "$rate" -gt 160 ]] && [[ "$rate" -lt 350 ]] ; }  || [[ -z "$rate" ]] ; then
            #echo convert "$file"
            el_explain 0 "converting: $file"

            # v4 for a much more quality (flac converter)
            precache "$file" 1>/dev/null

            lame --vbr-new -V 3 -q 0 "$file" -o "$destfile"  1>"$logs" 2>&1
            returned="$?"

            if grep -qsE "(Aborting layer . decode|illegal bit allocation value)" "$logs" ; then
                el_explain 0 "  MPEG-3 mode force: $file"
                lame --vbr-new --mp3input -V 3 -q 0 "$file" -o "$destfile"  1>"$logs" 2>&1
                returned="$?"
            fi

            if [[ "$returned" != 0 ]] ; then
                NOREPORTS=1 el_warning "error converting, using back original file..."
                cp -f "$file" "${destfile}"
                continue
            fi

            # file is bigger than original AND file is bigger than 800 kb (which should be broken in conversion) --> copy back the original one
            size_dest="$( du -s "$destfile" | awk '{print $1}' )"
            size_orig="$( du -s "$file" | awk '{print $1}' )"
            size_dest_mb="$( du -hs "$destfile" | awk '{print $1}' )"
            size_orig_mb="$( du -hs "$file" | awk '{print $1}' )"

            # make it at least 200k smaller or ignore
            size_dest_extra="$(( $size_dest + 200 ))"

            el_debug "orig ${size_orig_mb} vs dest ${size_dest_mb} (${size_dest_extra})"

            if [[ "$size_dest_extra" -lt "$size_orig" ]] \
                && [[ "$( du -s "$destfile" | awk '{print $1}' )" -gt 800 ]] ; then
                #el_explain 0 "  compressed from '${size_orig}' KB to '${size_dest}' KB "
                reduced_percent="$( echo "( $size_dest / $size_orig ) * 100" | bc -l | sed -e 's|\..*$||g' )"
                #el_explain 0 "  reduced at ${reduced_percent} %, from '${size_orig}' KB to '${size_dest}' KB "
                el_explain 0 "  reduced "$(( 100 - ${reduced_percent} ))" %, from '${size_orig_mb}' to '${size_dest_mb}' "
                continue
            else
                if [[ "$( du -s "$destfile" | awk '{print $1}' )" -gt 800 ]] ; then
                    el_explain 0 "  oops, resulting file was bigger, using copy instead"
                else
                    NOREPORTS=1 el_warning "Less than 800 kb, maybe broken file, copying back the original one"
                fi
                cp -f "$file" "$dest"
            fi

        else
            el_explain 0 "Using original file (already good sized): copied back '$filename'"
            cp -f "$file" "$dest"
        fi
    done 3<<< "$( find "$from" -type f -iname '*'.mp3 | sed -e 's|^\./||g' )"

    rm -f "$logs"
}

#
#  MAIN
#
main "$@"

# vim: set foldmethod=marker :
