perf(enrich): cover-проход эфира 8 параллельно + защита от наложения
~447 живых станций, смена ~120 треков/мин — проход по 4 не успевал. Теперь 8 параллельно + guard против перекрытия крон-запусков. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -63,8 +63,20 @@ export class EnrichmentService {
|
||||
// Раз в минуту обеспечиваем ОБЛОЖКУ у играющих СЕЙЧАС треков — быстрый проход
|
||||
// ТОЛЬКО через iTunes (без Discogs, который лимитирован 54/мин и тормозил бы
|
||||
// обложки). Полное обогащение (жанр/стили) идёт фоном через backfill/enqueue.
|
||||
private nowPlayingRunning = false;
|
||||
|
||||
@Cron(CronExpression.EVERY_MINUTE)
|
||||
async enrichNowPlaying(): Promise<void> {
|
||||
if (this.nowPlayingRunning) return; // не накладываем проходы
|
||||
this.nowPlayingRunning = true;
|
||||
try {
|
||||
await this.runEnrichNowPlaying();
|
||||
} finally {
|
||||
this.nowPlayingRunning = false;
|
||||
}
|
||||
}
|
||||
|
||||
private async runEnrichNowPlaying(): Promise<void> {
|
||||
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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user