62 lines
2.0 KiB
Bash
Executable File
62 lines
2.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# encode_all encodes the whole library into specified format
|
|
#
|
|
. env_parallel.bash
|
|
|
|
src_library="${HOME}/flac"
|
|
output_dir="${HOME}/opus"
|
|
log="${HOME}/encode_log_$(date '+%Y-%m-%d_%H:%M')"
|
|
|
|
function encode() {
|
|
file="$1"
|
|
|
|
# file is full original path + filename
|
|
src_dir="$(dirname "$file")"
|
|
file_name="$(basename "$file")"
|
|
final_dir="$(sed "s_${HOME}/flac_${HOME}/opus_" <<< "$src_dir")"
|
|
final_opus="$(sed -e 's/\.flac$/.opus/' -e "s_${HOME}/flac_${HOME}/opus_" <<< "$file")"
|
|
if [[ -f "$final_opus" ]]; then
|
|
return
|
|
fi
|
|
unset tags
|
|
unset dest_dir
|
|
|
|
declare -A tags
|
|
while read -r line; do
|
|
tag_type="$(cut -d= -f1 <<< "$line")"
|
|
tag_type="${tag_type^^}"
|
|
tag_val="$(cut -d= -f2- <<< "$line")"
|
|
tags["$tag_type"]="$tag_val"
|
|
done < <(metaflac --list --block-type=VORBIS_COMMENT "$file" | grep 'comment\[' | cut -d: -f2- | sed 's/^ //')
|
|
album="$(basename "$final_dir")"
|
|
if [[ "$file_name" =~ ^D[0-9]+ ]]; then
|
|
disk="$(cut -d\ -f1 <<< "$file_name")"
|
|
tags[DISK]="${disk#D}"
|
|
fi
|
|
declare -a tag_ensure
|
|
tag_ensure=( TRACKNUMBER TITLE DATE ALBUM ARTIST )
|
|
for tag_type in "${tag_ensure[@]}"; do
|
|
if [[ -z "${tags[$tag_type]}" ]]; then
|
|
tags[$tag_type]="missing $tag_type"
|
|
fi
|
|
done
|
|
|
|
[[ -d "$final_dir" ]] || mkdir -p "$final_dir"
|
|
if [[ -n "${tags[DISK]}" ]]; then
|
|
err="$(opusenc --quiet \
|
|
--title "${tags[TITLE]}" --artist "${tags[ARTIST]}" \
|
|
--album "${tags[ALBUM]}" --tracknumber "${tags[TRACKNUMBER]}" \
|
|
--date "${tags[DATE]}" --comment "DISK=${tags[DISK]}" "$file" "$final_opus" 2>&1)"
|
|
else
|
|
err="$(opusenc --quiet \
|
|
--title "${tags[TITLE]}" --artist "${tags[ARTIST]}" \
|
|
--album "${tags[ALBUM]}" --tracknumber "${tags[TRACKNUMBER]}" \
|
|
--date "${tags[DATE]}" "$file" "$final_opus" 2>&1)"
|
|
fi
|
|
if [[ -n "$err" ]]; then
|
|
printf '%s\n' "$err" >> "$log"
|
|
fi
|
|
}
|
|
|
|
time find "$src_library" -type f -name '*.flac' -print0 | env_parallel -P 0 -0 --bar encode {}
|