#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' VERSION=1.5 VERBOSE=0 RECURSIVE=0 NOACTION=0 SYNC=1 FLAC_LEVEL=5 # Default FLAC compression level PRESERVE_MODTIME="" # for -p|--preserve SELF="$(readlink -f "$0")" OPTS=$(getopt -o Vvhrnps012345678 \ -l version,verbose,help,recursive,preserve,no-action,no-sync,fast,best \ -n reflac -- "$@") TMPDIR="$(mktemp --tmpdir -d reflac.XXXXXXXXXX)" eval set -- "$OPTS" trap "exit 1" INT usage() { cat < /dev/null 2>&1 || HAS_COVER_ART=0 #the error is handled later. do not exit the script if [ $VERBOSE -gt 1 ]; then flac --force-rf64-format --output-prefix="$TMPDIR/" -d -- "$flac" flac --delete-input-file -$FLAC_LEVEL -- \ "$TMPDIR/$(basename -s flac -- "$flac")rf64" else flac -s --force-rf64-format --output-prefix="$TMPDIR/" -d -- "$flac" flac -s --delete-input-file -$FLAC_LEVEL -- \ "$TMPDIR/$(basename -s flac -- "$flac")rf64" fi if [ $HAS_COVER_ART -eq 1 ]; then metaflac --no-utf8-convert $PRESERVE_MODTIME \ --import-tags-from="$TMPDIR/$(basename -s flac -- "$flac")tag" \ --import-picture-from="$TMPDIR/$(basename -s flac -- "$flac")img" \ -- "$TMPDIR/$flac" else metaflac --no-utf8-convert $PRESERVE_MODTIME \ --import-tags-from="$TMPDIR/$(basename -s flac -- "$flac")tag" \ -- "$TMPDIR/$flac" fi mv -f -- "$TMPDIR/$flac" "$flac.new" if [ $SYNC -eq 1 ]; then sync "$flac.new" mv -f "$flac.new" "$flac" sync "$flac" else mv -f "$flac.new" "$flac" fi rm -f -- "$TMPDIR/$(basename -s flac -- "$flac")tag" \ "$TMPDIR/$(basename -s flac -- "$flac")img" fi done } while true ; do case "$1" in -v|--verbose) VERBOSE=$((VERBOSE+1)) shift ;; -r|--recursive) RECURSIVE=1 shift ;; -0|-1|-2|-3|-4|-5|-6|-7|-8) FLAC_LEVEL=${1#-} shift ;; --fast) FLAC_LEVEL=0 shift ;; --best) FLAC_LEVEL=8 shift ;; -n|--no-action) NOACTION=1 shift ;; -p|--preserve) PRESERVE_MODTIME="--preserve-modtime" shift ;; -s|--no-sync) SYNC=0 shift ;; -V|--version) echo "reflac version $VERSION" rmdir "$TMPDIR" exit 0 ;; -h|--help) usage ;; --) shift; break ;; *) echo "$0: This should never happen!" >&2; exit 1 ;; esac done if [ -z "$*" ]; then usage fi if [ $VERBOSE -eq 0 ] && [ $NOACTION -eq 1 ]; then rmdir "$TMPDIR" exit 0 fi for dir do if [ $RECURSIVE -eq 1 ] && [ $NOACTION -eq 1 ]; then find "$(readlink -f -- "$dir")" -type d -execdir "$SELF" -nv {} \; elif [ $RECURSIVE -eq 1 ]; then if [ $VERBOSE -eq 1 ]; then find "$(readlink -f -- "$dir")" -type d \ -execdir "$SELF" -v -"$FLAC_LEVEL" {} \; elif [ $VERBOSE -ge 2 ]; then find "$(readlink -f -- "$dir")" -type d \ -execdir "$SELF" -vv -"$FLAC_LEVEL" {} \; else find "$(readlink -f -- "$dir")" -type d \ -execdir "$SELF" -"$FLAC_LEVEL" {} \; fi else pushd -- "$dir" >/dev/null if [ $VERBOSE -gt 0 ]; then readlink -f .; fi if [ ! -z "$(ls -- *.flac 2>/dev/null)" ]; then recompress fi popd >/dev/null fi done rmdir "$TMPDIR"