From 6ce52784197d3f64353f7c058adfc8815de66320 Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Tue, 8 Nov 2022 20:28:46 -0600 Subject: [PATCH] truckmusic: Script to sync music truck USB stick Compares the files in `~/.homeshare/Music` and `~/.homeshare/TRUCKMUSIC` and creates any that are missing or updates those that are outdated. Uses `ffmpeg` to convert from FLAC to MP3. Embeds album art in each file (since that's the only way to display them in the truck). --- truckmusic.sh | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 truckmusic.sh diff --git a/truckmusic.sh b/truckmusic.sh new file mode 100644 index 0000000..46ecfe5 --- /dev/null +++ b/truckmusic.sh @@ -0,0 +1,103 @@ +#!/bin/.sh +# vim: set sw=4 ts=4 sts=4 et : + +clean() { + echo "$1" | sed \ + -e "s/’/'/g" \ + -e 's/?//g' \ + -e 's@ / @ _ @g' \ + -e 's@/@-@g' \ + -e 's/: / - /g' \ + -e 's/:/-/g' \ + -e 's/\.\+$//' +} + +convert() { + unset src dst cover + src="${1}" + dst="${2}" + + cover="${src%/*}/folder.jpg" + + mkdir -p "${dst%/*}" + echo "${dst}" >> /tmp/modified.txt + printf 'Converting %s to %s ...\n' "${src##*/}" "${dst##*/}" + ffmpeg \ + -loglevel warning \ + -i "${src}" \ + -vn \ + -ar 44100 \ + -ac 2 \ + -b:a 256k \ + "${dst}" \ + < /dev/null \ + || return $? + if [ -f "${cover}" ]; then + printf 'Embedding %s in %s ...\n' "${cover##*/}" "${dst##*/}" + ffmpeg \ + -loglevel warning \ + -i "${dst}" \ + -i "${cover}" \ + -c copy \ + -map 0:0 \ + -map 1:0 \ + -id3v2_version 3 \ + -metadata:s:v title='Album Cover' \ + -metadata:s:v comment='Cover (Front)' \ + "${dst%.mp3}.new.mp3" \ + < /dev/null \ + || return $? + mv "${dst%.mp3}.new.mp3" "${dst}" + fi +} + +rm -f /tmp/modified.txt +cd ~/.homeshare +find Music -name '*.flac' -printf '%T@%p\n' \ + | sed -E 's/^([0-9]+)(\.[0-9]+)(.*)/\1\3/' \ + | sort -t '' -k2 \ + > /tmp/music.txt +while IFS='' read timestamp filename; do + album=$(metaflac --show-tag=album "${filename}" | sed 's/^album=//') + albumartist=$(metaflac --show-tag=albumartist "${filename}" \ + | sed 's/^albumartist=//' \ + | head -n1) + artist=$(metaflac --show-tag=artist "${filename}" \ + | sed 's/^artist=//' \ + | head -n1) + discnumber=$(metaflac --show-tag=discnumber "${filename}" \ + | sed 's/^discnumber=//') + disctotal=$(metaflac --show-tag=disctotal "${filename}" \ + | sed 's/^disctotal=//') + tracknumber=$(metaflac --show-tag=tracknumber "${filename}" \ + | sed 's/^tracknumber=//') + title=$(metaflac --show-tag=title "${filename}" | sed 's/^title=//') + if [ -n "${disctotal}" ] || [ "${discnumber:-0}" -gt 0 ]; then + newfilename=$(printf \ + '%s - %s Disc %d/%02d %s - %s.mp3' \ + "$(clean "${albumartist:-${artist}}")" \ + "$(clean "${album}")" \ + "${discnumber:-1}" \ + "${tracknumber:-0}" \ + "$(clean "${artist}")" \ + "$(clean "${title}")" + ) + else + newfilename=$(printf \ + '%s - %s/%02d %s - %s.mp3' \ + "$(clean "${albumartist:-${artist}}")" \ + "$(clean "${album}")" \ + "${tracknumber:-0}" \ + "$(clean "${artist}")" \ + "$(clean "${title}")" + ) + fi + if [ ! -f "TRUCKMUSIC/${newfilename}" ]; then + convert "${filename}" "TRUCKMUSIC/${newfilename}" + else + newtimestamp=$(stat -c %Y "TRUCKMUSIC/${newfilename}") + if [ "${timestamp}" -gt "${newtimestamp}" ]; then + convert "${filename}" "TRUCKMUSIC/${newfilename}" + fi + fi +done < /tmp/music.txt