4 заметки с тегом

Лампач

Артикли

24 июня 2012, 3:22

Английские артикли «The» и «A» должны игнорироваться при сортировке и поиске в любых списках. К сожалению, не все этого понимают.

Увидел я, к примеру, кафе «Lounge» и хочу почитать отзывы о нём на городском портале. Поиска нет, зато есть выборка по алфавиту. Но по букве «L» ничего нет! Почему? Потому что кафе, оказывается, называлось «The Lounge» (а на вывеске «The» где-то затерялось), соответственно, искать нужно было на «T».

Получаем дизайнеров-идиотов, которые при проектировании сайта не предусмотрели таких вещей.
Если я ищу Beatles в списке всех исполнителей, я ожидаю их увидеть в начале, на букве «B», но никак не на букве «T».

Не знаю как на Андроиде, но Эппл это всё предусмотрели, что не может не радовать:

Итак!
В списках все значения, в начале которых имеются артикли «The» или «A», должны быть отсортированы так, будто этого артикля у них нет.
В поиске артикли также должны опускаться. Если я введу «The Aerosmith», в результатах должны быть Аэросмит, не смотря на то, что артикля в названии у них нет.

Тэгбота кстати этому я тоже обучил. Для него песни «The Animals — The House of the Rising Sun» и «Animals — House of the Rising Sun» являются одним и тем же, поэтому и рейтинг, и количество воспроизведений для них будут считаться как на одну песню.

Сказ о том, как тегбот ищет музыку

18 июня 2012, 20:33

Вот и закончился самый сложный и долгий этап работы над ботом — это очень важная веха в работе над лампачём. И в связи с этим я хочу рассказать некоторые аспекты работы бота.

Главная задача, которая была успешно решена — это, конечно, разнообразие музыки. Раньше, основным источником новых песен для бота являлся last.fm. Там очень много музыки, а также понятный и простой АПИ. Казалось, всё должно быть отлично, но, как обычно, действительность не соответствовала надеждам. Разнообразные методы поиска похожих треков, поиск по жанрам, исполнителям — всё это работало с популярной музыкой. Чтобы найти более редкие, нетрендовые треки, приходилось, соответственно, делать поиск похожего по другим редким и нетрендовым трекам. А получить список наименее релевантных песен по жанру оказалось вообще трудной задачей. Поэтому, чтобы разбавить музыку, приходилось что-то дополнительно выискивать. Что приводит нас к следующей задаче —

Автономность. Бот должен уметь сам искать музыку, подбирать жанры. И если внезапно выходит новый альбом, в котором песня может быть потенциально интересна слушателям, то она должна скоро оказаться в индексе. Без участия человека, само собой.

Напрашивается резонный вопрос: «Где брать всё это?». Ведь чтобы собрать хорошую коллекцию музыки, без человека не обойтись. Всё гениальное, как оказалось, просто! В интернете есть огромная куча хороших тематических радиостанций, на которых хорошо натренированные люди, непосредственно разбирающиеся в конкретном жанре, собирают отличные плейлисты.

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

Итак, FmCheckerd — демон, который раз в минуту опрашивает 57 радиостанций на играющие там треки. Все радиостанции аккуратно разделены по жанрам, поэтому треки лежат не кучей, а в соответствующих жанру виртуальных плейлистах. Плейлисты представляют собой sqlite3 базу данных, в которой удобно убивать дубликаты, а также методом стека держать строго определённое число записей.

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

Перед попаданием в основной плейлист, песня всё же проходит фильтрацию. Она попадает в эфир, если её устоявшийся рейтинг более 25%, подходит по тематике, и соответствует нескольким внутренним фильтрам (ОЛОЛОЦЕНЗУРА). Если песня попадает в эфир впервые, то она регистрируется в общей БД. С тех пор песня становится неотъемлемой частью радио, так как для неё ведётся подробная статистика. Пример: во время плавного перехода с одного жанра на другой, песни следующего жанра могут заминусовать, если после классики внезапно начнёт играть митол. Всё это будет учитываться для построения расписания эфирной сетки (да-да, тоже будет).

До пробного запуска вещания осталось совсем немного времени.

Новые боты

20 мая 2012, 21:18

Так уж сложилось, что пришло время нового тагбота.

Старый был написан на коленке для собственных нужд и представлял собой службу на C# под виндоус. Основной его задачей было играть ассоциативные плейлисты, которые генерировались через Ластфм. Играть просто для себя. Круто же: едешь себе в маршрутке и вместо гоп-стопа слушаешь своё радио. После завершения всех работ было решено протестировать сервер вещания и ассоциативные плейлисты. Где быстро найти аудиторию, как не на бордах? После треда на тирече «Посоны, помогите затестить бота для интернет-радио» и началась эпоха лампача.

Бот улучшался, добавлялся новый функционал. Но это было проблематично, так как архитектура была не расширяемой, вследствие чего всё неистово обрастало костылями. Предвиделись полноценные эфиры, появление диджеев, поэтому нужно было срочно делать фронтенд к боту.

Площадкой вещания являлся сервис moeradio.ru, который перестал нормально справляться со своей работой: вещание вечно рвалось, были подлагивания и прочие недуги. Начался переезд на новый временный домен, был арендован хостинг, на котором был поднят Айскаст (нормальный ретранслятор). Кстати, занимательный факт: айскаст был дополнен небольшим хаком и перекомпилирован, а бот отправлял теги через модифицированный заголовок. Благодаря этому ретранслятор на лету переводил теги в нужную конечному клиенту кодировку. Многие популярные плееры получали кодировку в utf-8, а некоторые упоротые (вроде WMP) получали cp-1251. Из-за всего этого русские буквы в тегах всегда были русскими, а не кракозябрами, как в большинстве интернет-радиостанций. Вот так-то.

После переезда появился сайт, на который бот тотчас же научился отправлять разнообразные данные о треках.

Через некоторое время появилось голосование, чатик, эфиры с диджеем.

Боту пришлось следовать новым трендам и учиться проводить тематические эфиры. Код, неподверженный расширению обрастал костылями, в которых копаться было всё труднее и труднее. Багов становилось всё больше, желания копаться в этом — всё меньше.

Ещё в течение года радио как-то работает, но за ним нужно ежедневно следить. Бот может поехать по своему курсу и зациклится, например, на Регине Спектор. Найти проблему в костылях сложно, а делать костыль для костылей уже не хочется. После адовых недель частых дисконнектов, циклов Регины и Эйнауди, был произведен вайп ассоциативной базы данных, которая велась всю жизнь радио, и выключено само радио.

Были оставлены только самые важные наработки, а все внутренности радио ушли на свалку истории.

Учитывая весь имеющийся опыт и возможные развития событий, я делаю нового бота. Бота, которого можно оставить хоть на год автономной работы, и он не подведет. Бота, основная задача которого — саморазвитие. Бота, который лучше будет понимать свою аудиторию. Бота, который, что уж там, охуенен!

К данному моменту готово ядро, скрипты анализа и обучения. Новому боту вместо виртуалбокса с виндовс 2003 будет достаточно ноды на ОпенВЗ с лайтовым дебианом, так как бэкенд нового бота полностью написан на Питоне с вкраплениями С++.

С очень высокой вероятностью после релиза наработки появятся на гитхабе под GPL-соусом. Репозиторий для дебиана точно будет.

Некоторые подробности работы буду публиковать тут, так что стей тюнед.

Что играет на радио?

30 апреля 2012, 22:39

Делая вторую версию лампача столкнулся с интересной проблемой — получение тегов из определенного интернет-потока. Готовый инструмент так и не нашёл, пришлось изучать матчасть и писать свой.

Итак, вкратце.
Существует два гиганта интернет-радиовещания: Shoutcast и Icecast. Я предпочитаю второй по многим субъективным причинам, но нужно решение универсальное. Различий в протоколе у них нет, разве что шоуткасту нужно насильно сказать, что я хочу получать от него теги помимо мп3-потока.

Сам протокол представляет собой обычный хттп, оформленный в виде непрерывного октет-стрима. Поэтому его можно даже скачивать браузером, на выходе получим обычный мп3 файл. Но можно также получить различные плюшки в виде тегов и описания потока. Если правильно попросить.

При хттп-запросе потока нужно дополнительно указать заголовок «Icy-MetaData:1» и юзер-агент какого-нибудь плеера. Некоторые серверы, получая юзер-агент браузера, выдают статусную страничку с количеством слушателей, битрейтом, и прочими ненужными в данный момент. А нам нужен именно поток. После того, как получили правильный контент, осталось считать заголовки ответа и найти среди них «icy-metaint».

Тут первая странность протокола — теги отдаются не сразу. Обычно нужно скачать секунду потока, а там уже лежит заветное название трека. Тут то и пригодится заголовок «icy-metaint», который хранит смещение в байтах, через которое прервется поток и пойдут мета-данные. Пропускаем mp3 данные, читаем один байт и умножаем его значение на 16. Столько байтов будет размер самих данных. Считываем их и радуемся — у нас есть теги.

Алсо, после нескольких тестов на разных радиостанциях заметил интересную особенность: ICY заголовки могут в http идти как обычными заголовками, так и обычным текстом. Пришлось учесть.

В скрипт осталось добавить поддержку локейшен-редиректов и все точно будут счастливы.

Скачать готовый скрипт на питоне.