Files
beets-setup/scripts/unsorted/convert/convert-new.sh

97 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SOURCE_LIBRARY="/music/library"
CONVERTED_LIBRARY="/music/opus-library"
BEETS_VENV="/music/beets/venv"
# Extra args passed directly to beet convert.
# -a = album mode
# -y = yes/noninteractive
CONVERT_ARGS=(-a -y -d "$CONVERTED_LIBRARY")
AUDIO_EXT_REGEX='.*\.\(mp3\|flac\|m4a\|aac\|ogg\|opus\|wav\|aiff\|aif\|alac\|wma\|wv\|ape\)$'
activated_own_venv=0
cleanup() {
if [[ "$activated_own_venv" == "1" ]]; then
deactivate || true
fi
}
trap cleanup EXIT
die() {
echo "ERROR: $*" >&2
exit 1
}
safe_dir_check() {
local path="$1"
[[ -n "$path" ]] || die "empty path"
[[ "$path" != "/" ]] || die "refusing to operate on /"
[[ -d "$path" ]] || die "directory does not exist: $path"
}
safe_dir_check "$SOURCE_LIBRARY"
mkdir -p "$CONVERTED_LIBRARY"
safe_dir_check "$CONVERTED_LIBRARY"
if [[ -z "${VIRTUAL_ENV:-}" ]]; then
[[ -f "$BEETS_VENV/bin/activate" ]] || die "beets venv not found at $BEETS_VENV"
# shellcheck disable=SC1091
source "$BEETS_VENV/bin/activate"
activated_own_venv=1
fi
echo "Pruning stale converted audio files..."
echo "Source: $SOURCE_LIBRARY"
echo "Converted: $CONVERTED_LIBRARY"
echo
deleted=0
kept=0
while IFS= read -r -d '' dest_file; do
rel="${dest_file#$CONVERTED_LIBRARY/}"
rel_dir="$(dirname "$rel")"
rel_file="$(basename "$rel")"
stem="${rel_file%.*}"
source_dir="$SOURCE_LIBRARY/$rel_dir"
if [[ ! -d "$source_dir" ]]; then
echo "DELETE missing source dir: $dest_file"
rm -f -- "$dest_file"
((deleted++)) || true
continue
fi
# Extension-agnostic check:
# dest: /music/opus-library/A/B/01 Song.opus
# source match: /music/library/A/B/01 Song.*
if find "$source_dir" -maxdepth 1 -type f -iname "$stem.*" | grep -q .; then
((kept++)) || true
else
echo "DELETE stale file: $dest_file"
rm -f -- "$dest_file"
((deleted++)) || true
fi
done < <(find "$CONVERTED_LIBRARY" -type f -iregex "$AUDIO_EXT_REGEX" -print0)
echo
echo "Deleted stale audio files: $deleted"
echo "Kept existing audio files: $kept"
echo
echo "Removing empty directories..."
find "$CONVERTED_LIBRARY" -depth -type d -empty -delete
echo
echo "Running beet convert..."
beet convert "${CONVERT_ARGS[@]}"
echo
echo "Soft sync complete."