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/мин и тормозил бы
|
// ТОЛЬКО через iTunes (без Discogs, который лимитирован 54/мин и тормозил бы
|
||||||
// обложки). Полное обогащение (жанр/стили) идёт фоном через backfill/enqueue.
|
// обложки). Полное обогащение (жанр/стили) идёт фоном через backfill/enqueue.
|
||||||
|
private nowPlayingRunning = false;
|
||||||
|
|
||||||
@Cron(CronExpression.EVERY_MINUTE)
|
@Cron(CronExpression.EVERY_MINUTE)
|
||||||
async enrichNowPlaying(): Promise<void> {
|
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({
|
const rows = await this.prisma.nowPlaying.findMany({
|
||||||
select: { artist: true, song: true },
|
select: { artist: true, song: true },
|
||||||
});
|
});
|
||||||
@@ -84,9 +96,10 @@ export class EnrichmentService {
|
|||||||
// полное обогащение (жанр) — в общую очередь, если ещё не сделано
|
// полное обогащение (жанр) — в общую очередь, если ещё не сделано
|
||||||
if (track.enrichStatus !== 'done') this.enqueue(track.id);
|
if (track.enrichStatus !== 'done') this.enqueue(track.id);
|
||||||
}
|
}
|
||||||
// Быстрый cover-only проход, по 4 параллельно (iTunes терпимо)
|
// Быстрый cover-only проход, по 8 параллельно — чтобы успевать за сменой
|
||||||
for (let i = 0; i < todo.length; i += 4) {
|
// треков по всем сетям (~120/мин)
|
||||||
await Promise.all(todo.slice(i, i + 4).map((t) => this.coverFast(t)));
|
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