97 lines
2.2 KiB
Bash
Executable File
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."
|