#!/bin/sh set -eu -o pipefail MUSIC_DIR=/nfs/media/music MP3_BITRATE=320k # Searches the given argument paths for .flac files, and copies them to # $MUSIC_DIR with the follow hierarchy: # # flac/${artist}/${album}/${tracknum} ${trackname}.flac # # It also transcodes the FLACs to MP3s and stores them in a similar way: # # mp3/${artist}/${album}/${tracknum} ${trackname}.flac # # The metadata is taken from the id3 tags in the flac file, santized to contain # only ASCII characters. sanitize(){ echo "$1" | tr -Cd 'A-Za-z0-9 _-' } if [ $# -ne 0 ] ; then echo 'usage: import.sh PATH...' 1>&2 exit 1 fi find "$@" -iname '*.flac' -type f -print | while read -r file; do track=$(exiftool -s3 -TrackNumber "$file") title=$(exiftool -s3 -Title "$file") album=$(exiftool -s3 -Album "$file") artist=$(exiftool -s3 -AlbumArtist "$file") artist=${artist:-$(exiftool -s3 -Artist "$file")} if [ -z "$artist" ]; then echo "$file has no artist metadata, skipping" 1>&2 continue fi if [ -z "$album" ]; then echo "$file has no album metadata, skipping" 1>&2 continue fi if [ -z "$title" ]; then echo "$file has no title metadata, skipping" 1>&2 continue fi if [ -z "$track" ]; then echo "$file has no track metadata, skipping" 1>&2 continue fi subpath="$(sanitize "$artist")/$(sanitize "$album")" basename="$(printf '%03d' "$(expr "$track" + 0)") $(sanitize "$title")" # flac mkdir -p "${MUSIC_DIR}/flac/${subpath}" cp "$file" "${MUSIC_DIR}/flac/${subpath}/${basename}.flac" echo "flac :: $artist / $album / $title" if ! [ -f "${MUSIC_DIR}/flac/${subpath}/folder.jpg" ]; then ffmpeg -y -nostdin -loglevel error -i "$file" -an -c:v copy "${MUSIC_DIR}/flac/${subpath}/folder.jpg" echo "aart :: $artist / $album" fi # mp3 mkdir -p "${MUSIC_DIR}/mp3/${subpath}" ffmpeg -y -nostdin -loglevel error -i "$file" -ab "${MP3_BITRATE}" "${MUSIC_DIR}/mp3/${subpath}/${basename}.mp3" echo " mp3 :: $artist / $album / $title" done