Files
Audio-Classifier/frontend/lib/types.ts
Benoit ed010fa60f
All checks were successful
Build and Push Docker Images / Build Backend Image (push) Successful in 14m9s
Build and Push Docker Images / Build Frontend Image (push) Successful in 7m36s
Fix #5 Fix #6 Fix #7
1. Tri aléatoire 
Ajout d'un sélecteur de tri dans l'en-tête avec options "Récents" et "Aléatoire"
Backend : nouveau paramètre sort_by="random" qui utilise func.random() de PostgreSQL
Les résultats seront maintenant mélangés aléatoirement, permettant de découvrir tous les titres de la bibliothèque
2. Correction du bug de recherche textuelle 
La recherche charge maintenant jusqu'à 10 000 résultats au lieu de 25 quand une requête est active
La recherche filtre ensuite sur TOUS les résultats chargés, pas seulement la page active
Cela permet de rechercher dans toute la bibliothèque de résultats filtrés
3. Filtres exclusifs pour instruments 
Nouvelle option "Uniquement ces instruments (mode exclusif)" qui apparaît quand des instruments sont sélectionnés
Backend : nouveau paramètre instruments_exclusive qui vérifie que le track a EXACTEMENT les instruments sélectionnés (pas d'autres)
Frontend : checkbox dans un bandeau orange/ambre pour activer le mode exclusif
Les modifications touchent :
Backend : crud.py et tracks.py
Frontend : types.ts, FilterPanel.tsx et page.tsx
2026-01-27 22:43:32 +01:00

117 lines
2.3 KiB
TypeScript

/**
* TypeScript type definitions for Audio Classifier
*/
export interface Track {
id: string
filepath: string
filename: string
duration_seconds: number
file_size_bytes: number
format: string
analyzed_at: string
features: {
tempo_bpm: number
key: string
time_signature: string
energy: number
danceability: number
valence: number
loudness_lufs: number
spectral_centroid: number
zero_crossing_rate: number
}
classification: {
genre: {
primary: string
secondary: string[]
confidence: number
}
mood: {
primary: string
secondary: string[]
arousal: number
valence: number
}
instruments: string[]
vocals: {
present: boolean | null
gender: string | null
}
}
embedding: {
model: string | null
dimension: number | null
}
metadata: Record<string, any>
}
export interface FilterParams {
genre?: string
mood?: string
bpm_min?: number
bpm_max?: number
energy_min?: number
energy_max?: number
has_vocals?: boolean
key?: string
instrument?: string
instruments?: string[] // Multiple instruments filter
instruments_exclusive?: boolean // Only the selected instruments (no others)
tempo_range?: 'slow' | 'medium' | 'fast' // Lent (<100), Moyen (100-140), Rapide (>140)
sort_by?: 'analyzed_at' | 'tempo_bpm' | 'duration_seconds' | 'filename' | 'energy' | 'random'
sort_desc?: boolean
}
export interface TracksResponse {
tracks: Track[]
total: number
skip: number
limit: number
}
export interface SearchResponse {
query: string
tracks: Track[]
total: number
}
export interface SimilarTracksResponse {
reference_track_id: string
similar_tracks: Track[]
total: number
}
export interface JobStatus {
job_id: string
status: 'pending' | 'running' | 'completed' | 'failed'
progress: number
total: number
current_file: string | null
errors: Array<{ file?: string; error: string }>
saved_count?: number
}
export interface AnalyzeFolderRequest {
path: string
recursive: boolean
}
export interface WaveformData {
peaks: number[]
duration: number
num_peaks: number
}
export interface Stats {
total_tracks: number
genres: Array<{ genre: string; count: number }>
moods: Array<{ mood: string; count: number }>
average_bpm: number
total_duration_hours: number
}