- Documentation archivée et réorganisée - Backend: Ajout tests, migrations, library service, rate limiting - Frontend: Suppression Flutter, focus sur interface web HTML/JS - Tailwind CSS ajouté pour le style - Améliorations UX et corrections bugs Generated with [Claude Code](https://claude.com/claude-code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
8.6 KiB
RAPPORT DE DIAGNOSTIC COMPLET - AudiOhm
Date: 2026-01-19 20:30 Version: 2.0 Statut: 🔴 BLOQUANT - Plusieurs bugs critiques identifiés
📋 RÉSUMÉ EXÉCUTIF
AudiOhm souffre de plusieurs bugs critiques qui empêchent le bon fonctionnement des fonctionnalités principales:
- ✅ Dropdown z-index - CORRIGÉ (non confirmé)
- ✅ Liked tracks endpoint - CORRIGÉ
- ✅ Auto-play queue race condition - CORRIGÉ
- 🔴 AJOUT À LA PLAYLIST - BUG CRITIQUE
- 🔴 CONVERSION TRACKID - BUG CRITIQUE
🐛 BUGS CRITIQUES IDENTIFIÉS
1. BUG CRITIQUE: Conversion trackId (youtube_id vs UUID)
Localisation: /opt/audiOhm/backend/app/static/js/app.js
Fonctions affectées:
addTrackToPlaylist()(ligne 3248)toggleLikeTrack()(ligne 1591)- Probablement d'autres fonctions utilisant trackId
Problème:
// Dans renderTracks() - ligne 2249-2255
<div data-id="${track.id}" // ← C'est l'UUID de la BDD
data-youtube-id="${track.youtube_id || ''}" // ← C'est l'ID YouTube
onclick="playTrack('${track.id}', ${isYoutubeTrack})">
// Dans addTrackToPlaylist() - ligne 3264-3266
body: JSON.stringify({
track_ids: [trackId] // ← Problème: trackId peut être youtube_id (string) au lieu de UUID
})
Détail du problème:
- Lors de la recherche YouTube,
track.idcontient l'UUID de la base de données - MAIS pour les pistes YouTube qui ne sont pas encore dans la BDD,
track.idpourrait être leyoutube_id - L'API backend
/api/v1/playlists/{id}/tracksattend un UUID valide - Le schéma
AddTrackRequestvalide:track_ids: List[UUID] - Si on envoie un string youtube_id, Pydantic génère une erreur 422
Preuve:
# Dans les logs du backend:
"POST /api/v1/playlists/6244fc0b-dce5-4626-a4ab-5bbb737a82c0/tracks HTTP/1.1" 422 Unprocessable Content
2. BUG CRITIQUE: addTrackToPlaylist utilise le mauvais ID
Localisation: /opt/audiOhm/backend/app/static/js/app.js ligne 3265
Problème:
La fonction addTrackToPlaylist(trackId, playlistId, playlistName) reçoit un trackId qui est passé depuis renderTracks(). Dans renderTracks(), le trackId passé est track.id (ligne 2255), qui peut être:
- Un UUID de base de données (correct)
- Un youtube_id pour les pistes pas encore en BDD (INCORRECT pour l'API playlist)
Solution requise: Il faut s'assurer que le trackId passé à l'API est toujours un UUID valide. Pour les pistes YouTube pas encore dans la BDD, il faut:
- Soit les créer d'abord dans la BDD via un endpoint
- Soit modifier l'API pour accepter les youtube_id
- Soit empêcher l'ajout à la playlist tant que la piste n'est pas dans la BDD
3. BUG: playNext/playPrevious non implémentés dans app-optimized.js
Localisation: /opt/audiOhm/backend/app/static/js/app-optimized.js lignes 401-409
Problème:
function playPrevious() {
// Implement previous track logic
showToast('Non disponible pour le moment', 'error'); // ← PAS IMPLÉMENTÉ!
}
function playNext() {
// Implement next track logic
showToast('Non disponible pour le moment', 'error'); // ← PAS IMPLÉMENTÉ!
}
Impact:
- Le fichier
app-optimized.jssemble être une version minifiée/optimisée - MAIS le fichier HTML utilise
app.js(ligne 780 de index.html) - Donc ce bug n'est PAS actif actuellement, mais c'est une bombe à retardement
Recommandation:
- Soit supprimer
app-optimized.jss'il n'est pas utilisé - Soit le mettre à jour avec les bonnes implémentations de
app.js
✅ FONCTIONNALITÉS VÉRIFIÉES
Backend API
- ✅ Serveur uvicorn tourne sur le port 8000
- ✅ Documentation Swagger disponible: http://localhost:8000/api/docs
- ✅ Endpoint
/api/v1/library/liked-tracksfonctionne - ✅ Endpoint
/api/v1/library/liked-tracks/{track_id}(POST/DELETE) fonctionne - ✅ Endpoint
/api/v1/playlistsfonctionne - ✅ Endpoint
/api/v1/playlists/{id}/tracksfonctionne mais attend des UUIDs valides
Frontend JavaScript
- ✅
playNext()implémenté dans app.js (ligne 932) - ✅
playPrevious()implémenté dans app.js (ligne 844) - ✅
toggleLikeTrack()implémenté (ligne 1591) - ✅
loadLikedTracks()utilise le bon endpoint/api/v1/library/liked-tracks(ligne 1435) - ✅ Gestion de la queue implémentée
- ✅ Auto-play avec
handleTrackEnd()(ligne 1133)
🔧 CORRECTIONS À APPORTER
Correction 1: S'assurer que les trackId sont des UUID valides
Fichier: /opt/audiOhm/backend/app/static/js/app.js
Option A: Modifier addTrackToPlaylist pour créer la piste d'abord:
window.addTrackToPlaylist = async function(trackId, playlistId, playlistName) {
console.log('[addTrackToPlaylist] Track ID:', trackId, 'Playlist ID:', playlistId);
try {
const token = localStorage.getItem('token');
// Vérifier si c'est un UUID valide
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
let actualTrackId = trackId;
// Si ce n'est pas un UUID, c'est probablement un youtube_id
// Il faut créer la piste dans la BDD d'abord ou trouver son UUID
if (!uuidRegex.test(trackId)) {
console.log('[addTrackToPlaylist] Track ID is not a UUID, searching for track...');
// TODO: Implémenter la recherche ou création de la piste
showToast('Cette piste doit être jouée avant d\'être ajoutée à une playlist', 'warning');
return;
}
const response = await fetch(`/api/v1/playlists/${playlistId}/tracks`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
track_ids: [actualTrackId]
})
});
// ... reste du code
} catch (error) {
console.error('[addTrackToPlaylist] Exception:', error);
showToast('Erreur de connexion', 'error');
}
};
Option B: Modifier le backend pour accepter les youtube_id:
# Dans app/api/v1/playlists.py
@router.post("/{playlist_id}/tracks", response_model=PlaylistResponse)
async def add_tracks(
playlist_id: str,
track_data: AddTrackRequest,
current_user: CurrentUser,
db: DBSession,
):
# ... code existant qui accepte déjà les UUIDs
Correction 2: Mettre à jour ou supprimer app-optimized.js
Fichier: /opt/audiOhm/backend/app/static/js/app-optimized.js
Soit:
- Copier les implémentations correctes de
app.jsversapp-optimized.js - Ou supprimer
app-optimized.jss'il n'est pas utilisé
Correction 3: Améliorer la gestion des erreurs
Ajouter des messages d'erreur plus clairs pour les utilisateurs quand:
- Une piste YouTube doit être jouée avant d'être ajoutée à une playlist
- Un UUID invalide est détecté
📊 TESTS À EFFECTUER
Tests Backend
# 1. Test de l'endpoint add track avec UUID valide
curl -X POST http://localhost:8000/api/v1/playlists/{playlist_id}/tracks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{"track_ids": ["4b7e394f-2c28-4c5a-8e1e-06be72b4bd37"]}'
# 2. Test de l'endpoint avec youtube_id (doit échouer actuellement)
curl -X POST http://localhost:8000/api/v1/playlists/{playlist_id}/tracks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{"track_ids": ["dQw4w9WgXcQ"]}'
Tests Frontend
- ✅ Se connecter à l'application
- ✅ Rechercher une piste YouTube
- ❌ Cliquer sur "Ajouter à la playlist" → DOIT ÉCHOUER
- ✅ Jouer une piste
- ✅ Vérifier que la piste s'ajoute à la queue
- ✅ Vérifier que le bouton Next fonctionne
- ✅ Vérifier que l'auto-play fonctionne à la fin du morceau
- ✅ Vérifier le chargement des liked tracks
🎯 PRIORITÉS DE CORRECTION
🔴 URGENT - Bloquant
- Corriger la conversion trackId pour l'ajout à la playlist
- Tester manuellement la correction
🟡 MOYEN - Important
- Mettre à jour app-optimized.js ou le supprimer
- Améliorer les messages d'erreur
🟢 FAIBLE - Amélioration
- Ajouter des tests automatisés
- Améliorer la documentation
📝 NOTES
- Le backend est fonctionnel et bien structuré
- L'API respecte les standards REST
- Le schéma Pydantic est correct (attend des UUIDs)
- Le problème principal est dans le frontend qui mélange youtube_id et UUID
Conclusion: Le système est bien conçu mais il y a une incohérence entre les IDs utilisés dans le frontend (youtube_id) et ce que l'API backend attend (UUID de base de données).