aboutsummaryrefslogtreecommitdiff
path: root/music
diff options
context:
space:
mode:
authorCullum Smith <cullum@sacredheartsc.com>2024-11-14 20:36:44 -0500
committerCullum Smith <cullum@sacredheartsc.com>2024-11-14 20:36:44 -0500
commit9cce3e225daff5ca7215de0a8d2e1d73b1ca9042 (patch)
treefc06867b937e119d413f18f73b7746ff32bf6638 /music
downloadscripts-9cce3e225daff5ca7215de0a8d2e1d73b1ca9042.tar.gz
initial commitHEADmaster
Diffstat (limited to 'music')
-rwxr-xr-xmusic/export.sh57
-rwxr-xr-xmusic/import.sh75
2 files changed, 132 insertions, 0 deletions
diff --git a/music/export.sh b/music/export.sh
new file mode 100755
index 0000000..6f53793
--- /dev/null
+++ b/music/export.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+set -eu -o pipefail
+
+# I use this script to export my flac collection to a portable device,
+# which happens to require smaller embedded album art.
+
+MUSIC_DIR="/nfs/media/music/flac"
+ARTSIZE=${ARTSIZE:-320}
+
+sanitize(){
+ echo "$1" | tr -Cd 'A-Za-z0-9 _-'
+}
+
+if [ $# -ne 1 ]; then
+ echo 'usage: export.sh DST' 1>&2
+ exit 1
+fi
+DEST_DIR="$1"
+
+find "$MUSIC_DIR" -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")"
+
+ mkdir -p "${DEST_DIR}/${subpath}"
+
+ if [ ! -e "${DEST_DIR}/${subpath}/${basename}.flac" ]; then
+ echo "$artist / $album / $title"
+ ffmpeg -n -nostdin -loglevel error -i "$file" -map 0:a:0 -map 0:v:0 -filter:v "scale=w=${ARTSIZE}:h=${ARTSIZE},format=yuvj420p" -c:v mjpeg -c:a copy "${DEST_DIR}/${subpath}/${basename}.flac"
+ fi
+done
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