MP3 Hoarder
Пост для маньяков музыкального даунлоудинга. Для всех нормальных людей – это просто куча бесполезной информации, не тратьте время. Буду душно рассказвать, как я организовал свой личный стриминговый сервер. Как он может потешить меломанское эго и раззадорить коллекционерское ОКР. Речь пойдёт исключительно о софте – о железе расскажу в другой раз.
В прошлом году я закончил разбирать свою музыкальную коллекцию. Ну то есть я привёл её к тому состоянию, которое посчитал целевым на данном этапе. Сразу обозначу масштаб для понимания: сервер при индексации насчитал у меня 177 275 треков.
Основной упор был сделан на правильном наименовании каталогов в соответствии с шаблоном 📁Artist – year – Album. Это позволяет выстроить в хронологическом порядке дискографии и сразу вносит в фонотеку консистентность.
📁Genre
📁Artist
📁Artist - year - Album
🎵01.track.mp3
🎵02.track.mp3
...
🎵N.track.mp3
🖼️cover.jpg
Дополнительно.
Все флаки переведены в mp3. Это решение принято после того, как в слепых тестах на очень хорошем оборудовании я не смог отличить flac от mp3 320, сделанных с этих же флаков.
Во всех папках лежит обложка в виде файла 🖼️cover.jpg.
Основные инструменты, которые я использовал: руки, глаза, discogs.com, Total Commander, мозги – в меньшей степени. В общем, это была чёртова куча ручной работы: сверять дискографии, проставлять правильное название исполнителя\группы, указывать год и название альбома, скачивать и переименовывать обложку, удалять всякий мусор из папок, оставшийся после рипов, конвертаций и т.п.
Надо сказать, что со временем я развил очень неплохую скорость перелопачивания авгиевых конюшен: настроил хоткеи, разделил экран на зоны, где можно было – пользовался групповым переименованием. В основном мозг был почти отключён – пальцы двигались как у пианиста, но, конечно, «мелодия» была донельзя тупой. Иногда, наоборот, приходилось привлекать дополнительные материалы, чтобы разобраться в сложных дискографиях больших артистов. Очень многое я докачивал в процессе, если мне хотелось «закрыть» дискографию (или по крайней мере какой-то интересный период), подкачать сольники или сайд‑проекты.
На это ушёл год. Я просто садился в свободное время и херачил, сколько хватало терпения. Не знаю, можно ли было автоматизировать весь этот процесс и быть уверенным в результате. Это интересная тема, особенно при наличии сейчас таких штук, как openclaw.
Server
Когда я закончил, небосвод содрогнулся от моего оргазмического ликования. А потом… мне стало беспокойно, что всё это можно потерять, если у меня банально заклинит жёсткий диск. Стало понятно, что мне нужен NAS. Через пару месяцев я его собрал, хотя и в несколько гипертрофированном виде. Всё получилось отлично, можно было, как и раньше, закачивать пачками, штук по 200, альбомы в телефон и в hi‑fi‑плеер, но уже в удобном, причёсанном виде и не париться о сохранности.
Но потом я наткнулся на информацию, что люди селфхостят у себя стриминговые серверы, слушают свою музыку онлайн, имея доступ ко всей своей фонотеке с мобильного устройства из любой географической точки, где есть интернет, и не занимаются рутинной закачкой‑перекачкой. Я отнёсся к этой идее скептически. Это казалось ненадёжным в современных реалиях. Нет ничего хуже – начать слушать альбом и внезапно споткнуться на середине кайфового трека из‑за слабого мобильного интернета. Потом, непонятно было, что там с качеством звука – не режется ли он какими‑нибудь встроенными кодеками.
Но, в общем, я решил попробовать. Итак.
Немного истории.
Прародителем всех современных селфхостед «спотифаев» был Subsonic. Этот сервер дал миру Subsonic API, на котором потом выросли десятки клиентов. Со временем оригинальный Subsonic стал проприетарным и фактически застыл на версии API 1.16.1, в то время как комьюнити хотело новые фичи и open‑source‑лицензии. Появилась куча open‑source‑серверов, совместимых с этим API: Madsonic, Airsonic, Airsonic‑advanced, Navidrome, gonic и другие – все они решали примерно одну задачу: самохостинговый стриминг своей коллекции, но с разными акцентами.
Посоветовавшись с ИванИванычем Перплексиковым, я выбрал в качестве сервера gonic и не прогадал. Это лёгкий Subsonic‑совместимый сервер на Go: ест мало ресурсов, простая конфигурация через переменные окружения и флаги, установка через docker‑compose за пару строк. В отличие от некоторых «толстых» решений (типа Airsonic и Navidrome), gonic стремится быть максимально утилитарен: без сложной веб‑морды медиатеки (её вообще, по сути, нет), но с хорошим API, чтобы основную роль UI забирали на себя клиенты вроде Symfonium, Sublime Music, Amperfy и т.п. Gonic отвечает за индексацию, хранение, поиск и транскодинг, а всё, что касается воспроизведения, отдаётся на откуп клиентам.

Самым популярным сервером сейчас является Navidrome. Я его тоже попробовал: он даёт возможность погулять по медиатеке из браузера. Но – и это его главный недостаток – он навигируется только по тегам. В том числе и клиенты не получают доступа к папочной структуре коллекции. На этом вопрос выбора сервера был решён: у gonic есть киллер‑фича для меня – навигация по файловой структуре.
Некоторые заброшенные или полумёртвые форки Subsonic (Airsonic, Airsonic‑advanced) также заявляют этот функционал, но, судя по отзывам и комментам, он у них реализован глючно и нормально не работает.
Почему это киллер‑фича? Я не ставил себе целью нормализовать метаданные в своей огромной коллекции файлов. Эта задача была абсолютно неподъёмной для меня в то время, когда я разгребал свои завалы. Так что я не обращаю внимания на теги, у меня есть отлично структурированные папки, и этого мне достаточно для навигации и, собственно, прослушивания музыки.
Client
Итак, gonic проиндексировал мою коллекцию примерно минут за 40. Пришло время выбрать клиент для Android.
Я установил сразу два самых популярных, чтобы сравнивать на лету.
Бесплатный Substreamer и платный (с 30 пробными днями) Symfonium.
Substreamer – простенький, притормаживает при работе с папками, умеет скачивать только отдельные файлы. Точнее, он может скачать альбом целиком, если навигироваться по тегам. То есть можно сразу поставить на закачку все файлы, в метаданных которых прописано: album: «Привыкай… К Ларисе Долиной». Но если зайти в папку «Лариса Долина – 1993 – Привыкай… К Ларисе Долиной», то придётся тыкать в каждый файл отдельно – это неудобно.
Symfonium – стабильный, достаточно гибкий, настраиваемый, с нормальным интерфейсом клиент. Скачивает папки целиком. Также есть режим работы, когда файлы или альбомы добавляются к постоянному кэшу, а не лежат в виде файлов непосредственно в файловой системе. То есть процесс скачивания всё равно происходит, музыку можно слушать оффлайн, просто эти файлы видны только через Symfonium. Есть удобная настройка: если её включить, то при добавлении альбома в избранное через serdechko сразу произойдёт закачка в постоянный кэш. Таким образом, через избранное всегда можно узнать, какая музыка у тебя скачана и будет проигрываться вне зависимости от наличия интернета. В общем, я купил Symfonium за 5 баксов и начал осваиваться.
Надо сказать, что мне очень понравилось, вряд ли я захочу вернуться к старой схеме оффлайн‑прослушивания. Это довольно приятное чувство – в любой момент пройтись по своей коллекции и послушать оттуда любой случайно приглянувшийся альбом. Да и сам Symfonium на главном экране предлагает к прослушиванию рандомные альбомы. Также и наоборот: можно задаться целью целенаправленно отслушать дискографию какого‑то артиста – она вся всегда у тебя под рукой. К звуку никаких претензий нет, разницы со своим любимым андроид‑плеером PowerAmp (кстати, отечественный софт) я не заметил.

What’s your problem?
Какие есть проблемы? Вот показательный скрин. Это как раз «Избранное» – тут альбомы отображаются тегами Artist, Album, Date так, как они заполнены (или не заполнены) в файлах.

1. Каталог «Kousokuya – 1990 – 1st». Это альбом группы Kousokuya, который так и называется 1st и вышел он в 1990, – в 2003 вышло переиздание. Мне хотелось бы видеть название на английском и дату первого релиза.
2. Каталог «Four Tops – 1966 – On Top». Альбом называется «On Top», а не «03 – On Top», да, он третий по счёту в дискографии, но мне эта цифра в названии не нужна.
3. Каталог «Cheap Trick – 1977 – Cheap Trick». Метаданные вообще не заполнены.
4. Каталог «Ray Charles – 1959 – The Genius Of Ray Charles». Видимо, это рип с какого‑то многодискового издания классических альбомов, и, конечно, год выхода альбома не 2011.
5. Каталог «Fe‑mail – 2002 – Syklubb Fra Hælvete». Метаданные опять вообще не заполнены.
Из 10 альбомов 5 имеют проблемы с отображением. Хотелось бы от этого избавиться. Так я пришёл к мысли, что всё же надо нормализовать теги во всей этой куче файлов. Теперь эта задача уже не представляется непосильной. Я, по крайней мере, могу выйти на полуавтоматизацию. Собственно, уже вышел. Вот что у меня получилось.
Pipeline
Сначала очень помогает хорошая программа Kid3, которая работает с тегами и позволяет подтягивать метаданные с Discogs и других баз данных. С помощью неё можно отловить файлы, где не заполнен тег Title (название трека), и вытащить его с Discogs. Далее проставить номера треков, если тег Track number пустой.
Сложнее с тегами Artist, Album и Date. Kid3 умеет искать в базе MusicBrainz по акустическому отпечатку трека, а поиск через Discogs – основан на уже имеющихся метаданных. Проблема в том, что в MusicBrainz нет отпечатков и половины моей музыки. А поиск по Discogs, даже если и сработает, может заполнить Artist и Album не так, как мне надо. Группы периодически слегка изменяли название (например: добавляли и убирали артикль the), артисты меняли имена и псевдонимы на разных релизах (Sunny Murray, Sonny Murray, Sonny Murry и ещё штук 5 вариантов), иногда даже не по своему желанию, а по прихоти или по ошибке издателя. Похожая ситуация для названий альбомов: разные названия для разных регионов, в том числе и на разных языках. Так вот, Discogs содержит релизы именно с такими наименованиями, как они были зафиксированы на физическом носителе. У одного альбома могут быть десятки вариантов, изданных в разные годы. В итоге, какой вариант тега Artist, Album и Date подхватит Kid3 – неизвестно. И можно получить знатную мешанину.
Далее стоит учесть, что у меня в файловой системе уже имеются все эти данные в нужном мне виде. Когда я перелопачивал фонотеку, я приводил имена артистов, годы и названия альбомов именно к тому виду, который нужен и понятен мне. Одинаковым или нет будет псевдоним джазового музыканта, я решал сам, исходя из своих собственных соображений удобства навигации по огромной фонотеке. Какое имя реально числилось на релизе, я всегда могу посмотреть, открыв соответствующие страницы в интернете. В общем, это и была именно та работа, которую невозможно полностью автоматизировать.
Так вот. Если все данные у меня есть в названии папки, остаётся вычленить их и загнать в метаданные файлов. Для этого совместно с ИванИванычем мы написали два скрипта. Первый выгружает в таблицу метаданные и полный путь всех аудиофайлов в указанной папке. Второй, наоборот, обновляет метаданные во всех аудиофайлах в указанной папке в соответствии с таблицей.
Между ними остаётся только формулами разбить на составляющие путь, имеющий в конце как раз название папки по шаблону artist – year – album, и обновить данные в соответствующих колонках. Финальный скрипт загрузит в файлы новые метаданные. Этот пайплайн работает, я проверил уже на двух среднего размера жанровых папках.
Есть ещё один небольшой нюанс со сборниками – он решается, но это уже совсем дебри, рассказывать стоит лично безумцу, решившему повторить мой путь.
Enough
Давно пора закругляться. В завершение скажу, что все старания были не напрасны. Штуковина работает отлично и явно будет радовать меня долгие годы. В процессе я заинтересовался многим, не связанным с музыкой, но она не отошла на второй план, а по‑прежнему является живительной эссенцией, подпиткой, которую теперь стало ещё удобнее отхлёбывать или смаковать небольшими порциями – в зависимости от настроения и окружающей реальности.