104 lines
3.1 KiB
Bash
104 lines
3.1 KiB
Bash
#!/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
|