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