From ed94bd73d7a739da51f374a394636c791bab8500 Mon Sep 17 00:00:00 2001 From: nk Date: Wed, 3 Jun 2026 21:02:33 +0300 Subject: [PATCH] =?UTF-8?q?perf(enrich):=20cover-=D0=BF=D1=80=D0=BE=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=20=D1=8D=D1=84=D0=B8=D1=80=D0=B0=208=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D0=BB=D0=BB=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=20?= =?UTF-8?q?+=20=D0=B7=D0=B0=D1=89=D0=B8=D1=82=D0=B0=20=D0=BE=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ~447 живых станций, смена ~120 треков/мин — проход по 4 не успевал. Теперь 8 параллельно + guard против перекрытия крон-запусков. Co-Authored-By: Claude Opus 4.8 --- src/enrich/enrichment.service.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/enrich/enrichment.service.ts b/src/enrich/enrichment.service.ts index 08dd635..9ba5e8c 100644 --- a/src/enrich/enrichment.service.ts +++ b/src/enrich/enrichment.service.ts @@ -63,8 +63,20 @@ export class EnrichmentService { // Раз в минуту обеспечиваем ОБЛОЖКУ у играющих СЕЙЧАС треков — быстрый проход // ТОЛЬКО через iTunes (без Discogs, который лимитирован 54/мин и тормозил бы // обложки). Полное обогащение (жанр/стили) идёт фоном через backfill/enqueue. + private nowPlayingRunning = false; + @Cron(CronExpression.EVERY_MINUTE) async enrichNowPlaying(): Promise { + if (this.nowPlayingRunning) return; // не накладываем проходы + this.nowPlayingRunning = true; + try { + await this.runEnrichNowPlaying(); + } finally { + this.nowPlayingRunning = false; + } + } + + private async runEnrichNowPlaying(): Promise { const rows = await this.prisma.nowPlaying.findMany({ select: { artist: true, song: true }, }); @@ -84,9 +96,10 @@ export class EnrichmentService { // полное обогащение (жанр) — в общую очередь, если ещё не сделано if (track.enrichStatus !== 'done') this.enqueue(track.id); } - // Быстрый cover-only проход, по 4 параллельно (iTunes терпимо) - for (let i = 0; i < todo.length; i += 4) { - await Promise.all(todo.slice(i, i + 4).map((t) => this.coverFast(t))); + // Быстрый cover-only проход, по 8 параллельно — чтобы успевать за сменой + // треков по всем сетям (~120/мин) + for (let i = 0; i < todo.length; i += 8) { + await Promise.all(todo.slice(i, i + 8).map((t) => this.coverFast(t))); } }