Wolf
Roman Grossi
Tobishua
Digital nomad and originality

Пока я ожидаю самолёта решился на большой для себя шаг: написать в блог (думаю, буду дописывать уже в пути: в самолетах и/или во время пересадок).

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

В чём суть.

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

Но я бы был не я, если бы не решил взять основную идею таких сервисов и сделать всё гораздо лучше и бесплатно.

Уже более года существует мой пиратский до последней строчки кода бот для Telegram @The_MusicBot, который с помощью API pleer.net позволяет найти и скачать любую песню (или даже подкаст). То, что я делаю сейчас - скорее продолжение идеи этого бота.

На данный момент специально обученные люди воркеры выкачивают через API discogs и last.fm информацию обо всех исполнителях, альбомах, треках и музыкальных жанрах, которые существуют в мире на сегодняшний день и создают взаимосвязи между ними. Эта титаническая работа на несколько десятков гигабайт данных необходима для того, чтобы иметь некое подобие каталога, который есть у всех музыкальных сервисов по подписке и без которого всё это не имеет особого смысла. Задача усложняется ещё и наличием лимитов на количество обращений через API со стороны discogs (у last.fm таких жёстких лимитов я не заметил), поэтому, несмотря на наличие двух независимых серверов (один выделенный, другой VPS), я не могу запустить сразу несколько десятков воркеров и завершить эту работу за сутки, плюс ко всему, пришлось написать обработчик отказов, который в случае получения сообщения об ошибке со стороны какого-либо API останавливает все воркеры на минуту, а потом снова пытается выкачать данные на которых был превышен лимит.

В итоге весь сервис, который я делаю будет первое время существовать в виде десктопного приложения написанного на Electron.

Работа над недочётами.

Недостаток треков.

Как известно, у pleer.net есть фатальный недостаток: там есть далеко не все треки, а некоторые хоть и имеются, но названы людьми находящимися в опиумном бреду, иначе невозможно объяснить все эти сокращения, замены букв и т.д. для того, чтобы мусорные треки не попадались в результатах поиска я решил действовать крайне просто: на основании имеющихся данных об исполнителях и названиях треков будет выполнен поиск на pleer.net и, если такой трек есть, в базе данных он будет помечаться и выводиться на странице альбома или исполнителя, а если такого трека нет, то он будет просто недоступен для воспроизведения, а пользователю будет предложено загрузить его. В случае с загруженным треками они изначально будут записываться на мой выделенный сервер, а в дальнейшем буду думать о хранении их на Amazon или Google Cloud Storage.

Правоторговцы и законы.

В последнее время во всех странах, а особенно в России начали с необычайным рвением следить за защитой так называемых авторских прав и блокировать сайты и сервисы направо и налево, поэтому, после появления моего приложения с большой вероятностью будет предпринята попытка заблокировать основной back-сервер, который будет обрабатывать запросы из приложения. Как быть? Даже, если подставляться под блокировку и переезжать на новые IP и домен это слабо поможет, т.к. всем пользователям нужно будет обновлять приложения с подписанным адресом back-сервера. Я решил поступить в этой ситуации следующим образом: в открытых репозиториях на GitHub и BitBucket размещаем обычный json-файл с текущим активным серверов, который ещё не заблокирован. При запуске приложения оно скачивает этот файл и вытаскивает из него адрес сервера к которому и будет производить обращения. Репозитори в двух разных местах нужны на случай блокировки/удаления одного из репозиториев.

Поиск.

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

База данных.

Для того, чтобы запуститься максимально быстро, на текущий момент использую обычный MySQL с индексами и связями. В итоге нужно будет перебираться на что-то нереляционное, т.к. по скорости MySQL ну очень проигрывает.

Итог.

Я делаю это всё даже не как новый проект, а скорее в качестве хорошего опыта и наполнения своего портфолио, так как fronend в виде десктопного приложения в итоге выложу в открытый доступ на GitHub или BitBucket.

P.S. Закончил писать уже после того, как прилетел в Петербург и неделю прожил здесь. Пост оказался длиннее чем планировал изначально.