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).
master
Dustin 2022-11-08 20:28:46 -06:00
parent f7f0dc4bd5
commit 6ce5278419
1 changed files with 103 additions and 0 deletions

103
truckmusic.sh Normal file
View File

@ -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