library_works/encode_all

56 lines
1.7 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"
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")"
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
opusenc \
--title "${tags[TITLE]}" --artist "${tags[ARTIST]}" \
--album "${tags[ALBUM]}" --tracknumber "${tags[TRACKNUMBER]}" \
--date "${tags[DATE]}" --comment "DISK=${tags[DISK]}" "$file" "$final_opus"
else
opusenc \
--title "${tags[TITLE]}" --artist "${tags[ARTIST]}" \
--album "${tags[ALBUM]}" --tracknumber "${tags[TRACKNUMBER]}" \
--date "${tags[DATE]}" "$file" "$final_opus"
fi
}
time find "$src_library" -type f -name '*.flac' -print0 | env_parallel -P 0 -0 --bar encode {}