Compare commits

...

5 Commits
main ... dev

123
rename_music_files.sh Executable file
View File

@ -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