#!/bin/bash # encode_all encodes the whole library into specified format # ulimit -n "$(ulimit -Hn)" . 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 --discard-comments --discard-pictures \ --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 --discard-comments --discard-pictures \ --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 {}