Маргинал

Моё личное интернет-радио. Крутит музыку 24/7, ИИ-диджей выбирает треки, пишет скрипты и вещает в эфир. Музыка из Navidrome, метаданные через Subsonic API. Beets тегирует библиотеку, ListenBrainz скробблит эфир. Слушать — на radio.mrgnl.ru.


Архитектура

Локальная библиотека (FLAC/MP3)
    ↓
Navidrome (скан библиотеки по cron)
    ↓
Контроллер: ИИ-диджей + Liquidsoap
    ↓
Icecast / веб-стрим
    ↓
Слушатели (radio.mrgnl.ru)

Компоненты

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 для радио