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
parent
f7f0dc4bd5
commit
6ce5278419
|
@ -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
|
Loading…
Reference in New Issue