diff options
Diffstat (limited to 'music/export.sh')
-rwxr-xr-x | music/export.sh | 57 |
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 |