inotify-tools — автоматическое обновление базы MPD

Inotify – это функция ядра Linux, отслеживающая изменения в фс и немедленно отправляющая необходимым приложениям соответствующие события (удаление, чтение, запись, монтирование). Но не о нем, а о inotifywait, программе входящей в пакет который в ArchLinux называется inotify-tools, которая позволяет отслеживать любой набор файлов и директорий(в том числе и рекурсивно). И именно эта программа будет отсылать нам сообщения о изменениях в папке с музыкой из которой играет Music Player Daemon (MPD).
В итоге у нас получается небольшой скрипт
#!/bin/bash
# Зависит от mpc(куда же без него) и inotify-tools

# наш конфиг
MPDCONF="$HOME/.mpdconf" # в домашнеей папке

# вычисляем каталог с музыкой
MUSICDIR=`cat $MPDCONF | grep "[^#]*music_directory" |head -n1| awk '{print $2}'`
# обрезаем кавычки
MUSICDIR=${MUSICDIR:1:$((${#MUSICDIR}-2))}
# а можно всё добро выше заменить на MUSICDIR="наша_папка_с_музыкой"

#собственно сама функция обнавления
function mpcUpdate() {
	#путь к файлу
	file=$* 
	# отрезаем папку с музыкой, оставляя путь в библиотеке
	file=${file:$((${#MUSICDIR}+1))}
	mpc update "$file" >/dev/null
 
}

# читаем в цикле события в папке с музыкой и производим нужное обнавления базы
inotifywait -mr -e close_write -e move -e create -e delete --format "%w%f" $MUSICDIR | while read line
do
	mpcUpdate "$line"
done
Если скрипт запущен то вся музыка добавляемая в процессе его работы в каталог с музыкой будет сразу же появляться в базе, изменяемая изменяться, а удаляемая удаляться =)
Fd 09-09-2009
ага, встречал я этот скрипт, mpc update совершенно некорректно работает с русскими кодировками в тегах.
muhas 09-09-2009
@Fd не замечал, а в чем косяк?
Livid 09-09-2009
@Fd
"Русские кодировки" это видимо cp1251?
Вообще-то по стандарту v2 и выше положено UTF-8. Есть тулзы для исправления чужой криворукости.
У меня все работает и с id3v2 и с flacinfo или как она там зовется.
alex.kostrukov 10-03-2010
я поступил по другому, на incron повесил скрипт, и при создании в директории с музыкой новой директории, запускаю скрипт, который сначала переводит теги в utf,а патом обновляет базу mpd
muhas 10-03-2010
раньше тоже что-то похожее было, однако перевод тегов в utf8 не всегда нужен а иногда и вреден, поэтому сделал inotyfy для файлов (что бы сразу теги обновлял)
Michail 11-01-2011
Добрый день, новичок в Linuxe, а как сделать чтобы все изменения в папке с музыкой происходили не только в базе, но и в активном плейлисте?, то есть чтобы обновлялся активный плейлист сейчас удаляемая удаляется, а вот добавляемая не добавляется в активный плейлист
muhas 11-01-2011
добавить после mpcUpdate "$line" строчку mpc add "$line"
только я не понял, у тебя вся музыка в плейлисте что ли?

кстати, в 0.16 появилось нативное обновление базы при изменении в каталоге (можно включить в конфиге)
Michail 11-01-2011
Если делать mpc add $file, то добавляется в конец активного плейлиста, а хотелось бы чтобы после изменений в директории с музыкой активный плейлист соответствовал текущей базе, не соображу как это сделать?
muhas 11-01-2011
если только отчищать плейлист и добавлять в него все снова =)
Michail 11-01-2011
если очищать плейлист, музыка прерывается :(
muhas 11-01-2011
тогда не знаю :( других вариантов не вижу...
muhas 11-01-2011
лучше все же добавлять в конец плейлиста через add и потом сортировать как и до этого, умеет ли это делать кто консольный не знаю...
Michail 11-01-2011
[quote]только я не понял, у тебя вся музыка в плейлисте что ли?[/quote]
у меня mpd пока я не сделаю mpc add <file> вообще ничего не играет, хотя я запускаю его с опцией --create-db, может я что-то изначально не так делаю,
p.s. почему google adsense нет, чтобы можно было потыцкать в качестве благодарности :)
muhas 11-01-2011
так --create-db только создает базу, а потом из неё в плейлист добавлять файлы надо и так далее и так далее


ps. адсинса нету, поставил - но никто не кликал аж месяц - оставил на паре страниц ( about,zyxel, mosquito, etc) для проверки...
вообще сайт этот трудно монетизировать - вот футболочки повесил - мож купит кто через меня =)
Michail 11-01-2011
футболку не куплю, а в гугл потыцкаю, спасибо
muhas 11-01-2011
не за что, если есть какие вопросы обращайся. если беседа предполагает быть затянутой более чем на пару комментариев то лучше в jabber или на мыло (и то и то muhas@muhas.ru)
nikto 13-04-2013
Попытался сделать так вот, но к сожалению при добавлении пропускает некоторые песни =(
[code]
#!/bin/bash
MPDCONF="/etc/mpd.conf"
MUSICDIR="/home/mpd/music"
#MUSICDIR=${MUSICDIR:1:$((${#MUSICDIR}-2))}

function mpcADDFILE() {
file=$*
/usr/bin/mpc update > /dev/null && echo "Обновили базу" >>/var/log/io.log && file=${file:$((${#MUSICDIR}+1))} && echo "mpc add $file" >>/var/log/io.log && /usr/$

}

function mpcDELFILE() {
/usr/bin/mpc update >>/var/log/io.log
}

inotifywait -m -r -e close_write -e delete --format '%w:%Xe:%f' ${MUSICDIR} | while read line
do
dir=$(echo ${line}|awk -F ":" '{print $1}')
events=$(echo ${line}|awk -F ":" '{print $2}')
file=$(echo ${line}|awk -F ":" '{print $3}')

case "$events" in
"DELETE" ) mpcDELFILE "${dir}${file}" ;;
"CLOSE_WRITEXCLOSE" ) mpcADDFILE "${dir}${file}" ;;
esac

done
[/code]