diff --git a/encode_all b/encode_all index 8ec85ff..75dbd0f 100755 --- a/encode_all +++ b/encode_all @@ -4,9 +4,24 @@ ulimit -n "$(ulimit -Hn)" . env_parallel.bash +function ts() { + date '+%Y-%m-%d_%H:%M' +} + +overwrite_all=true +# overwrite_all=false +debug_only=false +# debug_only=true + src_library="${HOME}/flac" output_dir="${HOME}/opus" -log="${HOME}/encode_log_$(date '+%Y-%m-%d_%H:%M')" +logdir="${HOME}/encoding_logs" +[[ -d "$logdir" ]] || mkdir "$logdir" +start_ts="$(ts)" +log="${logdir}/${start_ts}_encoding_log" +fixes="${logdir}/${start_ts}_fixes.sh" + +printf '#!/bin/bash\n# FIXES generated by library_works/encode_all\n\n' > "$fixes" function encode() { file="$1" @@ -14,11 +29,16 @@ function encode() { # 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 + output_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" && "$overwrite_all" == 'false' ]]; then + printf '%s exists, not reencoding\n' >> "$log" return fi + unset tags unset dest_dir @@ -27,36 +47,103 @@ function encode() { tag_type="$(cut -d= -f1 <<< "$line")" tag_type="${tag_type^^}" tag_val="$(cut -d= -f2- <<< "$line")" + # TODO: suggest fixes for lower case tags 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}" + done < <(metaflac --list --block-type='VORBIS_COMMENT' "$file" | \ + grep 'comment\[' | \ + cut -d: -f2- | \ + sed 's/^ //') + album="$(basename "$output_dir")" + + album_dir_date="${album%% *}" + album_dir_date_valid='true' + if [[ ! "$album_dir_date" =~ ^[-0-9]+$ ]]; then + printf '%s invalid album date extracted from album directory name: %s\n' "$file" "$album_dir_date" >> "$log" + album_dir_date_valid='false' 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" + + # FLAC tags to read in order: DATE RELEASEDATE YEAR + album_flac_date_valid='false' + for date_tag in DATE RELEASEDATE YEAR; do + album_flac_date="${tags[$date_tag]}" + if [[ "$album_flac_date" =~ ^[-0-9]+$ ]]; then + album_flac_date_valid='true' + break 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)" + if [[ "$album_flac_date_valid" == 'false' ]]; then + [[ -n "$album_flac_date" ]] && printf '%s invalid album date extracted from flac data: %s\n' "$file" "$album_flac_date" >> "$log" + [[ ! -n "$album_flac_date" ]] && printf '%s no album date extracted from flac data\n' "$file" >> "$log" + fi + + album_date='unknown' + if [[ "$album_dir_date_valid" && ! "$album_flac_date_valid" ]]; then + printf '%s invalid flac tag date\n' >> "$log" + album_date="$album_dir_date" + if [[ "$file" != *\'* ]]; then + printf "metaflac --set-tag=DATE='%s' '%s'" "$album_date" "$file" >> "$fixes" + elif [[ "$file" != *\"* && "$file" == *\'* ]]; then + printf 'metaflac --set-tag=DATE="%s" "%s"' "$album_date" "$file" >> "$fixes" + elif [[ "$file" == *\"* && "$file" == *\'* ]]; then + printf "# metaflac --set-tag=DATE='%s' '%s'" "$album_date" "$file" >> "$fixes" + printf '# cant quote\n' >> "$fixes" + fi + [[ -n "$album_flac_date" ]] && printf "# old tag: '%s'\n" "$album_flac_date" >> "$fixes" + [[ -z "$album_flac_date" ]] && printf "# no old tag\n" >> "$fixes" + elif [[ ! "$album_dir_date_valid" && "$album_flac_date_valid" ]]; then + printf '%s invalid album dir date\n' "$file" >> "$log" + album_date="$album_flac_date" + elif [[ "$album_dir_date_valid" && "$album_flac_date_valid" ]]; then + album_dir_date_length="$(wc -c <<< "$album_dir_date")" + album_flac_date_length="$(wc -c <<< "$album_flac_date")" + if [[ "$album_dir_date_length" -gt "$album_flac_date_length" ]]; then + printf '%s has a longer date set in album dir name\n' "$file" >> "$log" + album_date="$album_dir_date" + if [[ "$file" != *\'* ]]; then + printf "metaflac --set-tag=DATE='%s' '%s'" "$album_date" "$file" >> "$fixes" + elif [[ "$file" != *\"* && "$file" == *\'* ]]; then + printf 'metaflac --set-tag=DATE="%s" "%s"' "$album_date" "$file" >> "$fixes" + elif [[ "$file" == *\"* && "$file" == *\'* ]]; then + printf "# metaflac --set-tag=DATE='%s' '%s'" "$album_date" "$file" >> "$fixes" + printf '# cant quote\n' >> "$fixes" + fi + printf "# old tag: '%s'\n" "$album_flac_date" >> "$fixes" + else + printf '%s has a longer date set in flac tag\n' "$file" >> "$log" + album_date="$album_flac_date" + fi + fi + + 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' 'ALBUM' 'ARTIST' ) + for tag_type in "${tag_ensure[@]}"; do + if [[ -z "${tags["$tag_type"]}" ]]; then + printf '%s is missing tag: %s\n' "$file" "$tag_type" >> "$log" + tags["$tag_type"]="missing $tag_type" + fi + done + + [[ -d "$output_dir" ]] || mkdir -p "$output_dir" + tag_flags=( + '--title' "${tags['TITLE']}" + '--artist' "${tags['ARTIST']}" + '--album' "${tags['ALBUM']}" + '--tracknumber' "${tags['TRACKNUMBER']}" + '--date' "${album_date}") + [[ -n "${tags[DISK]}" ]] && tag_flags+=('--comment' "DISK=${tags['DISK']}") + if [[ "$debug_only" == 'false' ]]; then + err="$(opusenc --quiet --discard-comments --discard-pictures "${tag_flags[@]}" "$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)" + echo opusenc --quiet --discard-comments --discard-pictures "${tag_flags[@]}" "$file" "$final_opus" 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 {} +find "$src_library" -type f -name '*.flac' -print0 | env_parallel -P 0 -0 --bar encode {}