From 51576f71981994834970036806b0aa04da7a7c21 Mon Sep 17 00:00:00 2001 From: nk Date: Thu, 4 Jun 2026 10:55:09 +0300 Subject: [PATCH] =?UTF-8?q?feat(now-playing):=20=D0=A0=D0=B0=D0=B4=D0=B8?= =?UTF-8?q?=D0=BE=20=D0=9C=D0=BE=D0=BD=D1=82=D0=B5-=D0=9A=D0=B0=D1=80?= =?UTF-8?q?=D0=BB=D0=BE=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=9A=D1=80?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D0=B9=20=D0=9C=D0=B5=D0=B4=D0=B8=D0=B0=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Все 21 канал Монте-Карло — сеть Крутой Медиа (dfm.ru/api/n/current). Добавил genre='Radio Monte Carlo' в DfmNowPlayingService, матчинг по слагу из маута потока (basename без битрейта: blues96.aacp -> blues), исключил из ICY-поллера. Чинит 5 каналов, залипших на 'Дух — Тишина' (Blues, Chill Lounge, Italiano, Meditation, Summertime). --- src/now-playing/dfm-now-playing.service.ts | 17 +++++++++++++++-- src/now-playing/icy-now-playing.service.ts | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/now-playing/dfm-now-playing.service.ts b/src/now-playing/dfm-now-playing.service.ts index 1d0e28c..32009ef 100644 --- a/src/now-playing/dfm-now-playing.service.ts +++ b/src/now-playing/dfm-now-playing.service.ts @@ -62,9 +62,10 @@ export class DfmNowPlayingService { @Interval(30000) async pollDfmNowPlaying() { - // DFM и MAXIMUM — обе сети Крутой Медиа, общий API dfm.ru/api/n/current + // DFM, MAXIMUM и Радио Монте-Карло — все сети Крутой Медиа, общий API + // dfm.ru/api/n/current const stations = await this.prisma.station.findMany({ - where: { genre: { in: ['DFM', 'MAXIMUM'] } }, + where: { genre: { in: ['DFM', 'MAXIMUM', 'Radio Monte Carlo'] } }, }); if (stations.length === 0) return; @@ -96,9 +97,14 @@ export class DfmNowPlayingService { for (const station of stations) { const n = this.norm(station.name); const aliasSlug = this.alias[n]; + // Слаг из маута потока (basename без битрейта) — основной ключ для + // Монте-Карло (имя станции не совпадает с API-слагом, а маут совпадает: + // `mccovers96.aacp` → `mccovers`, `blues96.aacp` → `blues`). + const mount = this.mountSlug(station.streamUrl); const cur = idx.get(n) ?? idx.get(n.replace(/-/g, '')) ?? + (mount ? idx.get(mount) : undefined) ?? (aliasSlug ? data[aliasSlug]?.current : undefined); if (!cur?.artist || !cur?.title) continue; @@ -133,4 +139,11 @@ export class DfmNowPlayingService { .replace(/[^a-z0-9а-я]+/gi, '-') .replace(/^-|-$/g, ''); } + + // Слаг из маута потока: basename пути без расширения и хвостового битрейта. + // `http://mc-blues.hostingradio.ru/blues96.aacp` → `blues`. + private mountSlug(streamUrl: string): string | null { + const m = streamUrl.match(/\/([a-z0-9_-]+?)\d*\.(?:aacp|aac|mp3|m3u8)/i); + return m ? m[1].toLowerCase() : null; + } } diff --git a/src/now-playing/icy-now-playing.service.ts b/src/now-playing/icy-now-playing.service.ts index b4de699..1d93e7b 100644 --- a/src/now-playing/icy-now-playing.service.ts +++ b/src/now-playing/icy-now-playing.service.ts @@ -29,7 +29,7 @@ export class IcyNowPlayingService { const where = { recordStationId: null, isOnline: true, - genre: { notIn: ['DFM', 'MAXIMUM', 'Love Radio'] }, + genre: { notIn: ['DFM', 'MAXIMUM', 'Love Radio', 'Radio Monte Carlo'] }, NOT: { streamUrl: { contains: 'emgsound.ru' } }, }; const total = await this.prisma.station.count({ where });