/** * API client for Audio Classifier backend */ import axios from 'axios' import type { Track, TracksResponse, SearchResponse, SimilarTracksResponse, JobStatus, AnalyzeFolderRequest, WaveformData, Stats, FilterParams, } from './types' // Get API URL from runtime config (injected at container startup) or fallback to env var function getApiUrl(): string { if (typeof window !== 'undefined' && (window as any).__RUNTIME_CONFIG__) { return (window as any).__RUNTIME_CONFIG__.API_URL } return process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000' } const API_BASE_URL = getApiUrl() const apiClient = axios.create({ baseURL: API_BASE_URL, headers: { 'Content-Type': 'application/json', }, }) // Tracks export async function getTracks(params: FilterParams & { skip?: number; limit?: number }): Promise { const response = await apiClient.get('/api/tracks', { params }) return response.data } export async function getTrack(id: string): Promise { const response = await apiClient.get(`/api/tracks/${id}`) return response.data } export async function deleteTrack(id: string): Promise { await apiClient.delete(`/api/tracks/${id}`) } // Search export async function searchTracks( query: string, filters?: { genre?: string; mood?: string; limit?: number } ): Promise { const response = await apiClient.get('/api/search', { params: { q: query, ...filters }, }) return response.data } // Similar export async function getSimilarTracks(id: string, limit: number = 10): Promise { const response = await apiClient.get(`/api/tracks/${id}/similar`, { params: { limit }, }) return response.data } // Analysis export async function analyzeFolder(request: AnalyzeFolderRequest): Promise<{ job_id: string }> { const response = await apiClient.post('/api/analyze/folder', request) return response.data } export async function getAnalyzeStatus(jobId: string): Promise { const response = await apiClient.get(`/api/analyze/status/${jobId}`) return response.data } export async function deleteJob(jobId: string): Promise { await apiClient.delete(`/api/analyze/job/${jobId}`) } // Audio export function getStreamUrl(trackId: string): string { return `${API_BASE_URL}/api/audio/stream/${trackId}` } export function getDownloadUrl(trackId: string): string { return `${API_BASE_URL}/api/audio/download/${trackId}` } export async function getWaveform(trackId: string, numPeaks: number = 800): Promise { const response = await apiClient.get(`/api/audio/waveform/${trackId}`, { params: { num_peaks: numPeaks }, }) return response.data } // Stats export async function getStats(): Promise { const response = await apiClient.get('/api/stats') return response.data } // Health export async function healthCheck(): Promise<{ status: string }> { const response = await apiClient.get('/health') return response.data } export default apiClient