feat(shazam): распознавание трека через Shazam API для станций без метаданных

- новый модуль shazam: POST /shazam/recognize/:stationId — тянет ~6с аудио из
  потока станции, отдаёт в изолированный ShazamClient, возвращает artist/song/cover
- ShazamClient — адаптер к shazam-api.com, ключ из env (SHAZAM_API_KEY); точный
  контракт запроса/ответа помечен TODO до получения доки из ЛК
- кэш результата по станции (15с) — троттлинг + экономия платных вызовов
- общий реестр не-музыкальных жанров (common/station-classification.ts);
  charts.service переведён на него, shazam использует для гейта «есть ли музыка»

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
nk
2026-06-07 18:37:53 +03:00
parent 05e3796b85
commit 1616c231b7
8 changed files with 335 additions and 9 deletions

View File

@@ -0,0 +1,17 @@
import { Controller, Post, Param, ParseIntPipe } from '@nestjs/common';
import { ApiTags, ApiOperation } from '@nestjs/swagger';
import { ShazamService } from './shazam.service';
@ApiTags('shazam')
@Controller('shazam')
export class ShazamController {
constructor(private readonly shazamService: ShazamService) {}
@Post('recognize/:stationId')
@ApiOperation({
summary: 'Распознать играющий сейчас трек на станции (по station_id)',
})
async recognize(@Param('stationId', ParseIntPipe) stationId: number) {
return this.shazamService.recognize(stationId);
}
}