Coverart display/ru

Отображает обложку для треков mpd с помощью библиотеки naughty.

Обложка должна находиться в том же каталоге, что и файл с песней.

= Используемые скрипты =

Я создал 2 скрипта для этой задачи:

1) coverart.sh - Определяет каталог с текущей песней и находит в нем обложку


 * 1) !/bin/bash
 * 2) coverart.sh

DEFAULT_COVER="/path/to/defaultcover.png"

MUSICDIR=`cat /etc/mpd.conf | grep -v "#" | grep music_directory` MUSICDIR=${MUSICDIR:16} MUSICDIR=${MUSICDIR%/$}
 * 1) для пользователей 'mpd'

MFILE=`mpc current -f %file%` MFILE=${MFILE%/*} MFILE=${MFILE%/$}

FULLDIR="$MUSICDIR/$MFILE"


 * 1) для пользователей 'moc' в Debian, не уверен что в других дистрибутивах используется 'mocp' в качестве имени программы:
 * 2) MFILE=`mocp --format "%file"`
 * 3) [ -n "$MFILE" ] && FULLDIR=`dirname "$MFILE"`

[ -n "$FULLDIR" ] && COVERS=`ls "$FULLDIR" | grep "\.jpg\|\.png\|\.gif"`

if [ -z "$COVERS" ]; then COVERS="$DEFAULT_COVER" else TRYCOVERS=`echo "$COVERS" | grep -i "cover\|front\|folder\|albumart" | head -n 1`

if [ -z "$TRYCOVERS" ]; then TRYCOVERS=`echo "$COVERS" | head -n 1` if [ -z "$TRYCOVERS" ]; then TRYCOVERS="$DEFAULT_COVER" else TRYCOVERS="$FULLDIR/$TRYCOVERS" fi else TRYCOVERS="$FULLDIR/$TRYCOVERS" fi

COVERS="$TRYCOVERS" fi

echo -n "$COVERS"

2) musicinfo.sh - Печатает любую информацию которыю вы захотите видеть в подсказках


 * 1) !/bin/bash
 * 2) musicinfo.sh

echo "Исполнитель: `mpc current -f %artist%`" echo "Альбом: `mpc current -f %album%`" echo -n "Год: `mpc current -f %date%`"

для тех, кто использует moc в Debian. В других дистрибутивах может не использоваться mocp в качестве названия для программы:


 * 1) !/bin/bash
 * 2) musicinfo.sh

date +"%F%n%a %b %d, %-l:%M%P"

if mocp --info 2>/dev/null | grep -q PLAY; then mocp -Q " Исполнитель:	%artist Альбом: 	%album Название:	%song Время: 	%ct/%tt" else echo "Ничего не воспроизводится..." fi

= Изменения в rc.lua = 1) Вам необходимо добавить функцию отображения/скрытия подсказки

local coverart_nf function coverart_show -- destroy old popup, needed when bound to a key coverart_hide local img = awful.util.pread("/path/to/coverart.sh") local ico = image(img) local txt = awful.util.pread("/path/to/musicinfo.sh") -- set desired position of popup during creation coverart_nf = naughty.notify({icon = ico, icon_size = 100, text = txt, position = "bottom_left"}) end

function coverart_hide if coverart_nf ~= nil then naughty.destroy(coverart_nf) end end

2) Вам необходимо добавить обработчик событий мыши для виджета, или клавиатурные сочетания. Позиция всплывающего окнаустанавливается функцией описанной вышеcoverart_show, в свойстве position.

Замечание: mpdw это мой виджет для отображения информации. mytextclock работает также, даже если виджет mpdw не запущен.

mpdw:add_signal("mouse::enter", function	coverart_show end)

mpdw:add_signal("mouse::leave", function	coverart_hide end)

Простейший способ добавить клавиатурные сочетания, добавить их в таблицу globalkeys:

awful.key({ modkey,          }, "slash", function  coverart_show end),

= Добавляем динамику =

Если вы хотите отображать обложку при изменении песни, или если вы хотите отображать обложку как виджет на вашем главном окне или изменять поля динамически, то этого легко добиться с помощью библиотеки Bashets.

1. Для отображения обложки при изменении песни, вам необходимо зарегистрировать простую callback функцию:

ctitle = "" function mpd_callback(data) if data[1] ~= ctitle then                    --here "1" may be "3" or "2", or any other number of your variable ctitle = data[1] coverart_show end end bashets.register("mpd.sh", {update_time = 1, separator = "|", callback = mpd_callback})

Здесь mpd.sh это ваш скрипт, который возвращает разделенное разделителем значение. Например, ниже упрощеная версия моего mpd.sh:

TITLE=`mpc | head -n 1` MTIME=`mpc | head -n 2 | tail -n 1 | awk '{print $3}'` CURR=`mpc current` if [ -z "$CURR" ]; then TITLE="mpd `mpd --version | head -n 1 | awk '{print $6}'`" MTIME="stopped" fi echo -n "$TITLE|$MTIME"

которая возвращает что то подобное:

Artist - Song|00:00/99:99

Здесь "Artist - Song" соответсвует первой переменной - $1 в формате строки или data[1] в таблице данных, а "00:00/99:99" соответсвует второй переменной. Разделителем как уже упоминалось выше является "|" в вызове register.

2. Для отображения обложки в виде виджета на главном окне, вам необходимо определить его (смотрите исходники naughty для изучения того, как организовать виджеты на wibox, затем добавьте ваш wibox на текущий экран с нужной вам геометрией) и зарегистрировать все его текстовые виджеты в bashets:

bashets.register("mpd.sh", {widget = mpdw, format = '$1 | $2', update_time = 1, separator = '|'}) bashets.register("mpd.sh", {widget = mpdw, format = '$3', update_time = 1, separator = '|'})

Также вы можете объединить callback с обновлением виджетов, например: bashets.register("mpd.sh", {widget = mpdw, format = '$1 | $2', update_time = 1, separator = '|', callback = mpd_callback})

Замечание: callbacks доступна с bashets 0.4.

= Примечания переводчика =

У скрипта использующего отображение обложки и названия песни есть один недостаток, для него нужно создавать отдельный виджет (что лично для меня оказалось неудобным). Т.е. если нет виджета нет и возможности посмотреть что играет, соответственно теряется весь смысл этих скриптов. Найденные в сети скрипты уведомления работают через notify-send, коего в Debian по умолчанию нет, да и использовать его не рекомендуется, т.к. если вы переключаете песню за песней (например в поисках музыки под настроение), то увидите множество всплывающих окон, что не очень то приятно. Поэтому я предлагаю вам чуть-чуть переработанный вариант описанных выше скриптов, но работающих через D-Bus и автоматически заменяющий\закрывающий старые уведомления, плюс отображающий обложку трека. Дополнительно оба скрипта объединены в один. Скрипт переработан для moc/mocp.

К сожалению сам mocp не поддерживает dbus, но он может вызывать внешнюю команду при смене трека (и не только, за подробностями к документации).

В конфиге для mocp я добавил свой обработчик: OnSongChange = "/home/user/script/changesong.sh %f %a %t %d %r %n" Здесь мы передаем все необходимые значения: путь к файлу, исполнитель, название, время, альбом, для того, чтобы потом не дергать mocp еще раз, чтобы получить эти данные, как указано в изначальных версиях этих скриптов.

Затем, создаем скрипт (changesong.sh) для получения обложки и формирования текста:
 * 1) !/bin/bash
 * 2) changesong.sh

DEFAULT_COVER="/home/faiver/Images/no-cover.jpg"

if mocp --info 2>/dev/null | grep -q PLAY; then #MFILE=$1 [ -n "$1" ] && FULLDIR=`dirname "$1"`

[ -n "$FULLDIR" ] && COVERS=`ls "$FULLDIR" | grep "\.jpg\|\.png\|\.gif"`

if [ -z "$COVERS" ]; then COVERS="$DEFAULT_COVER" else TRYCOVERS=`echo "$COVERS" | grep -i "cover\|front\|folder\|albumart" | head -n 1`

if [ -z "$TRYCOVERS" ]; then TRYCOVERS=`echo "$COVERS" | head -n 1` if [ -z "$TRYCOVERS" ]; then TRYCOVERS="$DEFAULT_COVER" else TRYCOVERS="$FULLDIR/$TRYCOVERS" fi else TRYCOVERS="$FULLDIR/$TRYCOVERS" fi COVERS="$TRYCOVERS" fi

#echo -n "$COVERS"

MTITLE="

Исполнитель: $2 Название: $3 Альбом:	$5 Трек: 	$6 Время: 	$4"	if [ -z $1 ]; then		MTITLE=`mocp -Q "
 * 1) в случае если мы запускаем скрипт после паузы, необходимо явно запросить данные от mocp

Исполнитель:	%artist Название:	%song Альбом: 	%album Время: 	%tt" ` 	fi else	MTITLE="

Ничего не воспроизводится..."	COVERS="$DEFAULT_COVER" fi

dbus-send --session --dest=org.naquadah.awesome.awful /ru/console/mocp ru.console.mocp.songChanged \ string:"$MTITLE" \ string:"$COVERS" #здесь кавычки нужны, т.к. в тексте могут быть пробелы, иначе некорректно передаст строку

Даем скрипту права на исполнение: chmod +x changesong.sh Добавляем обработчик в Awesome: dbus.request_name("session", "ru.console.mocp" dbus.add_match("session", "interface='ru.console.mocp', member='songChanged' ") dbus.add_signal("ru.console.mocp", function(...) local data = {...} --убираем старую информацию notifyHide(coverart_nf) coverart_nf = naughty.notify({icon = data[3], icon_size = 100, text = data[2], position = "bottom_left"}) end ) И добавьте в rc.lua следующий код: function notifyHide(mynotification)   --функция удаляет уведомление по переданному идентификатору 	if mynotification ~= nil then 		naughty.destroy(mynotification)		return nil	else		return true	end end Хотя результат и будет тем же самым, что и в изначальном варианте, но разница будет в том, что система не зависнет если жесткий диск будет занят, плюс мы используем один скрипт вместо 2х в первоначальной версии.
 * 1) скрипт позволяет отрабатывать состояние переключения на паузу/повторный запуск

Собственно это все, перезапукаем awesome (Ctrl+Mod4+r), и наслаждаемся уведомлениями.