Маргинал
Моё личное интернет-радио. Крутит музыку 24/7, ИИ-диджей выбирает треки, пишет скрипты и вещает в эфир. Музыка из Navidrome, метаданные через Subsonic API. Beets тегирует библиотеку, ListenBrainz скробблит эфир. Слушать — на radio.mrgnl.ru.
Архитектура
Локальная библиотека (FLAC/MP3)
↓
Navidrome (скан библиотеки по cron)
↓
Контроллер: ИИ-диджей + Liquidsoap
↓
Icecast / веб-стрим
↓
Слушатели (radio.mrgnl.ru)
Компоненты
Navidrome
Navidrome — self-hosted музыкальный сервер. Совместим с Subsonic/Airsonic API. Сканирует библиотеку по cron, отдаёт метаданные, стримит аудио.
services:
navidrome:
image: deluan/navidrome:latest
ports:
- "127.0.0.1:4533:4533"
volumes:
- ./music:/music:ro
- ./data:/data
environment:
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
ND_ENABLETRANSCODINGCONFIG: true
restart: unless-stoppedПорт только на
127.0.0.1Наружу — через Caddy reverse proxy. Никогда не открывайте порты на
0.0.0.0.
Cron
Системный cron (не Hermes cron) для двух задач:
- Spotify sync — скачивание новых треков (раз в день, 3:00)
- Navidrome scan — сканирование обновлённой библиотеки (раз в 30 минут)
После sync автоматически запускается beets для тегирования новых треков — названия, обложки, тексты, жанры через MusicBrainz.
Стрим
Icecast принимает поток от Liquidsoap и раздаёт слушателям. Caddy проксирует домен radio.mrgnl.ru, давая HTTPS. Метаданные (artist, title) отдаются через Icecast status-json.xsl — их использует ListenBrainz скробблер. Подробнее: Caddy.
Диджей
Радио ведёт ИИ-диджей — см. ИИбан-DJ. Контроллер на vLLM читает контекст эфира (время суток, погода, фестивали), выбирает треки, пишет связки, озвучивает через TTS (Piper).
Веб-плеер
Next.js App Router, полностью на русском. Playfair Display + Plus Jakarta Sans + JetBrains Mono. PWA с офлайн-поддержкой. Заказ треков, расписание, история эфира, обсерватория. Репозиторий: mrgnl044/mrgnl-radio (private).
Метаданные и скробблинг
| Компонент | Что делает |
|---|---|
| Beets | Авто-тегирование: названия, артисты, альбомы, обложки, тексты, жанры через MusicBrainz |
| ListenBrainz | Скробблинг эфира: история прослушиваний, статистика, рекомендации |
Контакты
По любым вопросам — Telegram.
Связанные статьи
- ИИбан-DJ — ИИ-диджей для радио
- Beets — авто-тегирование музыки
- ListenBrainz — скробблинг радио
- Docker — основы Docker для self-hosting
- Caddy — reverse proxy для радио