#!/usr/bin/env bash # 2025 Hyperling # Clean up a music library. Improved version of rename_music_files.sh. # Steps: # 0) Ensure an OLD folder exists, it is what will be refactored. # 1) Convert all non-mp3 files to mp3 and put them in an INTERIM folder. # 2) Loop over all OLD and INTERIM's mp3 files and move them to NEW based on data. # - Name the file as "${ZERO_LED_TRACK_NUMBER}. ${SONG_TITLE} # - Name parent folder as "${YEAR} - ${ALBUM}" if both exist, otherwise just one or the other "${YEAR}${ALBUM}". # - Name grandparent folder as "${ARTIST} - ${GENRE}" if both exist, otherwise "${ARTIST}${GENRE}". # TODO list: # - Organize tracks by Artist + Album folders. # - Name parent folder as "$YEAR - $ALBUM" if both exist, otherwise just one or the other. # - Name grandparent folder as ARTIST if it exists, otherwise GENRE. ## Facts and Variables ## DIR="`pwd`" PROG="$(basename -- "${BASH_SOURCE[0]}")" FAIL=".$PROG.exit-error" OLD="$DIR/OLD" NEW="$DIR/NEW" INT="$DIR/INTERIM" ## Checks and Setup ## # System Packages # echo "* Checking if necessary tools are installed." function needed_progs { cat <<- EOF ffmpeg exiftool EOF } needed_progs | while read prog; do if [[ -z "`which $prog`" ]]; then echo "ERROR: $prog not found, please install." touch $FAIL fi done if [[ -e $FAIL ]]; then rm -fv $FAIL exit 1 fi echo "** Tools are available." # Old Directory # echo "* Checking whether OLD directory exists." if [[ "`pwd`"== */OLD ]]; then echo "** We are in the folder, moving up a directory." cd .. fi if [[ ! -d OLD ]]; then echo "ERROR: Could not find a folder named 'OLD'." echo " Please create it and add your library there." fi echo "** Folder exists appropriately." # Other Directories # echo "* Ensuring working directories NEW and INTERIM exist." mkdir -pv $NEW $INT ## Convert Media ## echo "* Convert all files to mp3." find "$OLD" ! -name "*".mp3 | while read file; do ffmpeg -nostdin -hide_banner -loglevel quiet -i "$file" "$file".converted.mp3 done echo "** Done creating mp3s." ## Transform Media ## echo "* Moving INTERIM files to NEW." echo "** Done with INTERIM, deleting." rm -rfv "$INT" echo "* Copying OLD files to NEW."