From 9cce3e225daff5ca7215de0a8d2e1d73b1ca9042 Mon Sep 17 00:00:00 2001 From: Cullum Smith Date: Thu, 14 Nov 2024 20:36:44 -0500 Subject: initial commit --- music/import.sh | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 music/import.sh (limited to 'music/import.sh') diff --git a/music/import.sh b/music/import.sh new file mode 100755 index 0000000..2d5f5e5 --- /dev/null +++ b/music/import.sh @@ -0,0 +1,75 @@ +#!/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 -- cgit v1.2.3