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
117 lines
2.3 KiB
TypeScript
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
|
|
}
|