From 3215dd5a4e129512988ad894881b3afd0eec4ff7 Mon Sep 17 00:00:00 2001 From: nk Date: Wed, 3 Jun 2026 16:11:26 +0300 Subject: [PATCH] =?UTF-8?q?fix(now-playing):=20=D0=BE=D1=82=D1=81=D0=B5?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D1=8C=20JSON-=D1=81=D1=82=D0=B0=D1=82=D1=83?= =?UTF-8?q?=D1=81=20=D0=B2=20ICY=20StreamTitle=20(101.ru)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Потоки 101.ru (Comedy Club, StandUp, Женский StandUp и др.) шлют в StreamTitle JSON {"status":1,...} вместо трека — он попадал в now_playing как название. ICY-парсер и ingest теперь отсекают значения, начинающиеся с { или [. Co-Authored-By: Claude Opus 4.8 --- src/now-playing/icy-now-playing.service.ts | 11 +++++++++-- src/now-playing/now-playing.service.ts | 9 +++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/now-playing/icy-now-playing.service.ts b/src/now-playing/icy-now-playing.service.ts index edcd9b1..767ba88 100644 --- a/src/now-playing/icy-now-playing.service.ts +++ b/src/now-playing/icy-now-playing.service.ts @@ -141,9 +141,16 @@ export class IcyNowPlayingService { resolve(null); return; } - const parts = match[1].split(' - ', 2); + const raw = match[1].trim(); + // Некоторые потоки (101.ru и др.) шлют в StreamTitle JSON-статус, + // а не название трека — это не трек, отсекаем. + if (raw.startsWith('{') || raw.startsWith('[')) { + resolve(null); + return; + } + const parts = raw.split(' - ', 2); if (parts.length < 2) { - resolve({ artist: match[1], song: match[1] }); + resolve({ artist: raw, song: raw }); } else { resolve({ artist: parts[0].trim(), diff --git a/src/now-playing/now-playing.service.ts b/src/now-playing/now-playing.service.ts index e30a99c..7c31af1 100644 --- a/src/now-playing/now-playing.service.ts +++ b/src/now-playing/now-playing.service.ts @@ -134,6 +134,15 @@ export class NowPlayingService { coverUrl?: string | null; }): Promise { const { stationDbId, stationNumericId, artist, song } = params; + + // Отсекаем мусор: пустое или JSON-статус в полях (некоторые потоки шлют + // в метаданных {"status":...} вместо трека). + const a = (artist ?? '').trim(); + const s = (song ?? '').trim(); + if (!a || !s || a.startsWith('{') || a.startsWith('[') || s.startsWith('{')) { + return; + } + const coverUrl = await this.resolveCover(artist, song, params.coverUrl); const prev = await this.prisma.nowPlaying.findUnique({