Мой список блогов

вторник, 20 декабря 2011 г.

MPD + MPDScribble + Sonata

Что такое MPD: MPD - музыкальный сервак который раздает музыку по сети и сам воспроизводит оную через консоль или клиента
Мало того ентот сервер может работать на маломощных машинках от Пентюха 75!
Он умеет всё, что должен уметь современный плейер – работает с плейлистами, раскодирует звуковые файлы, используя разнообразные кодеки, поддерживает потоковое вещание в ogg и mp3, а также занимается собственно проигрыванием музыки. Единственное, чего у него нет – это пользовательского интерфейса. Зато есть сетевой.
Для того, чтобы скомандовать «Маэстро, музыку!», одного MPD мало। К нему нужен клиент, выступающий посредником между пользователем и самой программой। Через него и осуществляется все управление: выбор композиций, создание плейлистов и т।д. Особенность подхода состоит в


том, что после совершения всех необходимых действий клиент можно закрыть – а музыка будет играть как ни в чем не бывало. В качестве клиента будет использоваться Sonata.

Мои USE-флаги:
[ebuild R ] media-sound/mpd-0.13.0 USE="aac alsa audiofile flac iconv mp3 musepack ogg unicode vorbis -ao -avahi -icecast -ipv6 -jack -libsamplerate -mikmod -oss -pulseaudio" 0 kB
[ebuild R ] media-sound/sonata-1.2.2 USE="dbus taglib -lyrics" 0 kB

1. Mpd

Сразу скажу, что просто сделать "emerge mpd" не выйдет. Установив таким образом mpd и измучившись в попытках заставить работать параметр конфиг-файла "id3v1_encoding "cp1251"" я понял, что всё бесполезно. Ну не хочет он понимать id3-теги в Win-кодировке. Нагуглившись, оказалось, что раньше он умел с ними работать, а теперь - нет. Также, практически везде советуют перекодировывать id3-теги в UTF-8. Меня такое решение не устраивает, ибо по-моему это попытка лечить следствие, а не причину. Так и видится перспектива: прежде чем добавить новые mp3-шки в свою коллекцию, сначала запускаю перекодирование тегов... бррр...
Мы пойдём другим путём. А именно - подправим исходники. Версия mpd - 0.13.

Распаковать исходники mpd:
# ebuild /usr/portage/media-sound/mpd/mpd-0.13.0.ebuild unpack

Подправить:
# nano /var/tmp/portage/media-sound/mpd-0.13.0/work/mpd-0.13.0/src/tag.c

Вот патч, добавляющий поддержку перекодировки idv2 и idv1 (проверено в mpd 0.12 и 0.13) через опцию "id3v1_encoding" в конфиге.

--- mpd-0.12.1/src/tag.c 2006-10-11 07:56:58.000000000 +0800
+++ /home/brian/development/cool-karaoke/mpd-0.12.1/src/tag.c 2006-11-03 11:20:53.000000000 +0800
@@ -130,17 +130,36 @@
{
struct id3_frame const *frame;
id3_ucs4_t const *ucs4;
- id3_utf8_t *utf8;
+ id3_utf8_t *utf8 = NULL;
id3_latin1_t *isostr;
union id3_field const *field;
unsigned int nstrings;
int i;
char *encoding;
+ enum id3_field_textencoding id3_encoding = 0xff;
+ int need_conv = 0;

frame = id3_tag_findframe(tag, id, 0);
if (!frame || frame->nfields < 2)
return mpdTag;

+ field = id3_frame_field(frame, 0);
+ if (id3_field_type(field) == ID3_FIELD_TYPE_TEXTENCODING)
+ id3_encoding = field->number.value;
+
+ if (isId3v1(tag) || id3_encoding == 0xff || id3_encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1) {
+ /* encoding not found or equal to ISO-8859-1
+ * - ISO-8859-1 means local locale... */
+ need_conv = 1;
+ encoding = getConfigParamValue(CONF_ID3V1_ENCODING);
+
+ if (encoding) {
+ if (!strcmp(encoding, "UTF-8"))
+ need_conv = 0;
+ } else
+ need_conv = 0; /* Defaulting to UTF-8 */
+ }
+
field = &frame->fields[1];
nstrings = id3_field_getnstrings(field);

@@ -152,6 +171,7 @@
if (type == TAG_ITEM_GENRE)
ucs4 = id3_genre_name(ucs4);

+#if 0
if (isId3v1(tag) &&
(encoding = getConfigParamValue(CONF_ID3V1_ENCODING))) {
isostr = id3_ucs4_latin1duplicate(ucs4);
@@ -171,12 +191,27 @@
if (mpd_unlikely(!utf8))
continue;
}
+#else
+ if (need_conv) {
+ char* isostr;
+
+ isostr = id3_ucs4_latin1duplicate(ucs4);
+ setCharSetConversion("UTF-8", encoding);
+ utf8 = convStrDup(isostr);
+ free(isostr);
+ }
+
+ if (!utf8)
+ utf8 = id3_ucs4_utf8duplicate(ucs4);
+
+#endif

if (mpdTag == NULL)
mpdTag = newMpdTag();
addItemToMpdTag(mpdTag, type, (char *)utf8);

free(utf8);
+ utf8 = NULL;
}

return mpdTag;

(c) взято с лора

Поставить mpd с изменённым tag.c:
# ebuild /usr/portage/media-sound/mpd/mpd-0.13.0.ebuild merge

Далее есть два пути: настроить mpd глобально (/etc/mpd.conf) или локально (~/.mpdconf). Настраивал глобально, потому что не понял как при локальной настройке стартовать автоматом сервис mpd? "/etc/init.d/mpd start" в таком случае не годится, проходит "sudo /etc/init.d/mpd start", но как тогда добавлять его в уровни запуска?

Настройка (изменил только эти строки):
# nano /etc/mpd.conf
user "user" #"mpd"
id3v1_encoding "cp1251"

По HOWTO проставил права:
# chown user:audio /var/lib/mpd/* /var/log/mpd/* /var/run/mpd
И добавил симлинк на каталог со своей музыкой:
# cd /var/lib/mpd/music
# ln -s /home/user/Music

Смысл расстановки таких прав (как это понял я):
В случае, когда каталог с музыкой доступен на чтение только его владельцу, mpd не сможет просканировать его и создать базу музыкальных файлов. Чтобы не попасть в такую ситуацию, владельцем файлов в каталоге /var/lib/mpd/ (и /var/log/mpd/) объявляется пользователь. Короче тут надо будет ещё разобраться %)

Чтение папки с музыкой и создание базы:
# mpd --create-db

Запуск mpd:
# /etc/init.d/mpd start
Прописывание в автозапуск:
# rc-update add mpd default

2. Установка клиента

# emerge sonata

Запустить, проверить есть ли коннект и звук, тут проблем не было.
Кстати, Sonata имеет в настройках галочку "Аудиоскроблер", у меня не включалась и я про неё забыл। Возможно, можно было бы обойтись без пункта 3।

3. Скробблинг на lastfm.ru

# emerge media-sound/mpdscribble

Опять два пути настройки: глобальный или локальный для каждого пользователя. Ставлю глобально (для локальной установки - запустить скрипт из под user$):
# /usr/share/mpdscribble/setup.sh

Настройка (добавил к уже имеющимся строкам):
# nano /etc/mpdscribble.conf
sleep = 5 # интервал между опросами mpd

Старт сервиса:
# /etc/init.d/mpdscribble start
Добавление в автозапуск:
# rc-update add mpdscribble default

Закоментить обновление mpd до лучших времён:
# echo "# mpd обновлять не хочу" >> /etc/portage/package.mask
# echo ">media-sound/mpd-0.13.0" >> /etc/portage/package.mask

На этом всё. При прослушивании музыки треки будут автоматом аплоадиться на lastfm.ru. Увидеть это можно из лога mpdscribble:
# tail -f /var/log/mpdscribble.log

(кстати из лога не видно чтобы interval был 5сек, либо это другой интервал
и время по какой-то причине указано в UTC, хм)

PS по-хорошему надо бы добавить media-sound/mpd в world, но по какой-то странной причине "emerge -n media-sound/mpd" не срабатывает... :-\

PPS оказывается mpdscribble кеширует прослушанные в оффлайне песни и при первой же возможности подключения загружает их на lastfm (это я сегодня утром очень сильно удивился, обнаружив на сайте список из 60 песен, которые слушал вчера ночью дома без выхода в интернет =))

Часть инфы взято тут:
http://gentoo.blog.ru/1017457.html


Комментариев нет: