diff --git a/rename_music_files.sh b/rename_music_files.sh new file mode 100755 index 0000000..90da83c --- /dev/null +++ b/rename_music_files.sh @@ -0,0 +1,123 @@ +#!/bin/bash +# 2024-06-07 C.Greenwood +# Rename all files in a music library based on metadata. +# Uses the format "[Track]. [Title].mp3" + +## Variables ## + +PROG="`basename $0`" +#DIR="`dirname $0`" +DIR="`pwd`" +EXT=".mp3" + +## Functions ## + +function usage { + cat <<- EOF + Usage: + $PROG [-h] [-u] + + Parameters: + -h : Help, display the usage and exit succesfully. + + Place this file at the root of your music destined for a flash drive and run it without any parameters. + It will dive through all folders and convert your MP3's to have the Track# and Title in the filename. + + This tool has a pre-requisite you should make sure you have installed: + - exiftool + + Thanks for using $PROG! + EOF + exit $1 +} + +function error { + num_chars=$(( 7 + ${#1} )) + echo "" + printf '*%.0s' $(seq 1 $num_chars) + echo -e "\nERROR: $1" + printf '*%.0s' $(seq 1 $num_chars) + echo -e "\n" + usage $2 +} + +## Validations ## + +# Check for parameters. +while getopts ":h" opt; do + case "$opt" in + h) usage 0 + ;; + *) error "Operator $OPTARG not recognized." 6 + ;; + esac +done + +# Ensure critical tools are available. +if [[ ! `which exiftool` ]]; then + error "exiftool not found" 2 +fi + +## Main ## + +# Loop through all files in and lower than the current directory. +time find $DIR -name "*${EXT}" | sort | while read file; do + + echo -e "\n$file" + + # Retrieve and clean the Track# + track="" + # Get raw value + track="`exiftool -Track "$file"`" + # Filter the header + track="${track//Track /}" + track="${track// : /}" + # Remove disk designations + track="${track%%/*}" + # Remove any whitespace before/after + track="`echo $track`" + # Add a leading 0 to single digits. + [[ ${#track} == 1 ]] && track="0$track" + echo "Track=$track" + + # Retrieve and clean the Title + title="" + title="`exiftool -Title "$file"`" + title="${title//Title /}" + title="${title// : /}" + title="${title//[^[:alnum:][:space:].]/}" + title="`echo $title`" + while [[ "$title" == *" "* ]]; do + title="${title// / }" + done + echo "Title=$title" + + # Create the new file with the correct filename. + new_file="`dirname "$file"`/$track. $title$EXT" + if [[ "$file" == "$new_file" ]]; then + echo "SKIP: Filename already correct! :)" + continue + fi + + if [[ ! -z "$track" && ! -z "$title" ]]; then + echo "Creating '`basename "$new_file"`'." + mv -v "$file" "$new_file" + elif [[ -z "$track" && ! -z "$title" ]]; then + echo "No Track# found, leaving Title alone." + continue + else + echo "File does not have Track or Title metadata." + continue + fi + + # Confirm the new file exists and remove the old file if so + if [[ -e "$new_file" ]]; then + echo "Success!" + else + error "$new_file was not created successfully." 5 + fi +done + +echo -e "\nProcess has completed. Enjoy having your songs named correctly!" + +exit 0