aboutsummaryrefslogtreecommitdiff
path: root/music/import.sh
diff options
context:
space:
mode:
Diffstat (limited to 'music/import.sh')
-rwxr-xr-xmusic/import.sh75
1 files changed, 75 insertions, 0 deletions
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