Maksutov Design МАКСУТОВ ДИЗАЙН
News aggregator MusicBrainz Country & Genre RSS + Google News + Discogs · 167 источников Next.js · TypeScript Prisma

MusicNews новости по странам и жанрам

Агрегатор мировых музыкальных новостей. Тянет ленты RSS из профильных изданий и Google News по 47 странам, определяет упомянутых в заголовках исполнителей через MusicBrainz и выводит для каждой новости страну и жанр — чтобы ленту можно было сортировать по стране, жанру и источнику. Рядом — лента физических релизов: винил, CD и кассеты из Bandcamp, Discogs (включая 20 стран отдельно) и Toolbox Records, с фильтрами по формату и источнику. Придумал и проектирую его сам.

01 / что это

Музыкальные новости разбросаны по десяткам изданий — MusicNews собирает их в одну ленту, которую можно сортировать

Обычно, чтобы следить за музыкой, приходится обходить Pitchfork, Billboard, Rolling Stone, NME и ещё десяток сайтов. MusicNews складывает их ленты в один поток и добавляет то, чего у них нет: для каждой новости определяет страну исполнителя и жанр. В итоге можно смотреть, например, «только техно», «только из Японии» или «только из Resident Advisor» — и переключаться между этими срезами в один клик. А отдельная лента собирает свежие физические релизы — винил, CD и кассеты — с теми же фильтрами по формату и источнику.

Ленту новостей расширил Google News Music: 47 стран — от США, Британии и России до Японии, Кореи, Бразилии, Индии, Китая, Турции и стран Ближнего Востока — каждая на своём языке, с корректной кодировкой запроса для японского, корейского, китайского, арабского и русского. Для релизов Discogs теперь опрашивается отдельно по 20 странам и трём форматам (винил, CD, кассета), а RSS-парсер справляется с некорректными датами публикации, не роняя весь импорт. Google News даёт кратно более широкий охват, чем редакционные издания, но и больше шума — поэтому вместо тегов качества источника решение получилось надёжнее: каждая новость из Google News сначала попадает в очередь модерации и публикуется только после подтверждения.

02 / интерфейс

Экраны сервиса

maksutovdesign.ru/musicnews/ Открыть сайт ↗
MusicNews — лента новостей с фильтрами по стране, жанру и источнику
01 — лента новостей Общий поток из всех изданий: слева фильтры по стране, жанру и источнику, у каждой новости — источник, дата и метки страны и жанра.
MusicNews — каталог исполнителей со страной и жанрами
02 — каталог исполнителей Все распознанные исполнители: страна, жанры и число новостей по каждому — данные подтягиваются из MusicBrainz.
MusicNews — лента физических релизов с фильтрами по формату и источнику
03 — лента релизов Физические релизы — винил, CD и кассеты из Bandcamp, Discogs и Toolbox Records. Фильтры по формату и источнику, сортировка по дате.

03 / как это работает

От заголовка новости — к стране и жанру: конвейер классификации

Самое сложное — не собрать RSS, а понять, о ком новость, и не ошибиться. Заголовки пишут в Title Case, поэтому наивная эвристика «слова с большой буквы = имя» ловит «Manager», «Live» или «Various Artists» — это реальные (пусть и мусорные) сущности в MusicBrainz. Поэтому перед распознаванием работает список исключений общих слов и известных заглушек.

  1. RSS. Раз в 15 минут собираются свежие статьи из 167 источников (RSS, Google News, Discogs), дубли отсекаются.
  2. Извлечение имён. Из заголовка выделяются кандидаты в исполнители (эвристический NER), общие слова отсеиваются по блок-листу.
  3. MusicBrainz. Каждое имя резолвится в базе — получаем MBID, страну и жанровые теги.
  4. Нормализация жанров. Сырые теги приводятся к канонической таксономии из 35 жанров.
  5. Уверенность. Стране и жанру присваивается оценка; в отсортированные срезы попадают только совпадения выше порога — слабые догадки не мусорят ленту.

04 / модерация

Google News даёт охват, модерация — качество

Раз источник настолько широкий, между лентой и читателем встала очередь проверки: новости из Google News не публикуются автоматически, а сначала попадают в /admin/review, где решение принимает человек.

  1. Очередь. Материал из Google News сначала лежит в /admin/review, а не в публичной ленте.
  2. Publish / Block. По каждой статье — решение опубликовать или заблокировать; заблокированное в публичных лентах не появляется.
  3. BlockRule. Правило по домену или ключевому слову блокирует будущие совпадения без ручной проверки каждой новости.
  4. Массовые действия. Можно выбрать несколько статей и нажать Publish selected / Block selected, а в шапке очереди — домены с числом материалов и кнопки Publish domain / Block domain.
  5. Артворк. В /releases — фильтр With artwork / Missing artwork, чтобы быстро отделить релизы без обложки.

Заодно подчистил связку с Discogs: релизы теперь хранят externalProvider/externalId, а тайтлы вида «Artist — Release» точнее привязывают релиз к исполнителю.

05 / охват и стек

Реальные данные и предсказуемая инфраструктура

167активных источников
2886новостей
2236релизов
3634опубликовано
1488на модерации
2129релизов с обложками
47стран через Google News
237Discogs external ID

Источники: Pitchfork, Stereogum, Consequence, Billboard, Rolling Stone, NME, The Quietus, Resident Advisor, Brooklyn Vegan, Zvuki.ru и InterMedia. Сборка на Next.js и TypeScript, данные — через Prisma: SQLite для локальной разработки без настройки, Postgres в продакшене. Обход лент идемпотентен и запускается по крону, поэтому лента обновляется сама.

06 / дальше

Роадмап

  • Реальный Postgres в проде — как только будут доступы к базе; миграция уже описана в docs/postgres-migration.md.
  • API-источники помимо RSS: YouTube Data, Spotify, NewsAPI.
  • LLM-классификатор как запасной вариант для неоднозначных заголовков.
  • Отдельные страницы по исполнителю, стране и жанру; мультиязычность.
  • Выборочные лицензированные источники из соцсетей.

07 / next projects