aboutsummaryrefslogtreecommitdiff
path: root/music/export.sh
diff options
context:
space:
mode:
Diffstat (limited to 'music/export.sh')
-rwxr-xr-xmusic/export.sh57
1 files changed, 57 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