start integrate suno and generate lyrics with gemini

This commit is contained in:
Thomas Demirdjian
2025-08-08 17:30:03 +02:00
parent 7bcc2e9779
commit 2a5a0149e8
81 changed files with 8321 additions and 26379 deletions
+50
View File
@@ -0,0 +1,50 @@
# Intégration de la fonction callback dans music.js
## Objectif
Centraliser toute la logique liée à l'API Suno dans un seul fichier pour une meilleure organisation du code.
## Changements effectués
### ✅ Déplacement de la fonction callback
- [x] Ajout des imports nécessaires dans `music.js` (onRequest, admin, logger)
- [x] Initialisation de Firestore dans `music.js`
- [x] Intégration complète de la fonction `sunoCallback` dans `music.js`
- [x] Suppression du fichier `callback.js` devenu obsolète
### ✅ Mise à jour des exports
- [x] Modification de `index.js` pour exporter `sunoCallback` depuis `music.js`
- [x] Correction de la syntaxe d'export pour éviter les erreurs de parsing
## Structure finale
### Fichier `music.js`
- Fonction `generateMusic` : génération de musique via l'API Suno
- Fonction `sunoCallback` : réception des callbacks de l'API Suno
- Toutes les fonctions utilitaires (buildStyle, clampLen, etc.)
- Configuration globale de l'API Suno
### Fichier `index.js`
- Export de `music` (contient generateMusic)
- Export de `sunoCallback` (fonction callback)
- Export de `lyrics`
## Avantages
1. **Centralisation** : Toute la logique Suno dans un seul fichier
2. **Cohérence** : Partage des constantes et utilitaires
3. **Maintenance** : Plus facile de maintenir et déboguer
4. **Organisation** : Structure plus claire du projet
## URL de callback
L'URL reste la même :
```
https://us-central1-musicland-app.cloudfunctions.net/sunoCallback
```
## Prochaines étapes
1. Déployer les fonctions : `firebase deploy --only functions`
2. Tester la génération de musique
3. Vérifier la réception des callbacks
4. Contrôler les mises à jour Firestore
+43
View File
@@ -0,0 +1,43 @@
# Plan de correction de l'API Suno
## Problème identifié
- [ ] ❌ L'API Suno retournait une erreur 404 à cause d'une URL incorrecte
- [ ] ❌ Les paramètres de la requête n'étaient pas conformes à la documentation officielle
- [ ] ❌ L'authentification utilisait un mauvais format de header
## Solutions appliquées
### 1. Correction de l'URL de l'API
- [x] ✅ Changé `https://api.sunoaiapi.com` vers `https://api.sunoapi.org`
- [x] ✅ Changé l'endpoint `/api/custom_generate` vers `/api/v1/generate`
### 2. Correction des paramètres de la requête
- [x] ✅ Changé `custom_mode` vers `customMode` (camelCase)
- [x] ✅ Changé `tags` vers `style` selon la documentation
- [x] ✅ Changé `callback_url` vers `callBackUrl` (camelCase)
### 3. Correction de l'authentification
- [x] ✅ Changé `X-API-Key` vers `Authorization: Bearer` selon la documentation
### 4. Ajustement du modèle
- [x] ✅ Changé `V4_5PLUS` vers `V4_5` (modèle supporté)
## Tests à effectuer
- [ ] 🧪 Tester la génération de musique avec paroles
- [ ] 🧪 Tester la génération de musique instrumentale
- [ ] 🧪 Vérifier la réponse de l'API et le format des données retournées
- [ ] 🧪 Tester avec différents styles musicaux
## Documentation de référence
- 📚 [Documentation officielle Suno API](https://docs.sunoapi.org/suno-api/generate-music)
- 📚 URL de l'API: `https://api.sunoapi.org/api/v1/generate`
- 📚 Authentification: `Authorization: Bearer <token>`
## Fichiers modifiés
- ✏️ `/functions/src/music.js` - Correction de l'URL, des paramètres et de l'authentification
## Notes importantes
- ⚠️ L'API Suno a une limite de concurrence: 20 requêtes toutes les 10 secondes
- ⚠️ Chaque requête génère exactement 2 chansons
- ⚠️ URL de streaming disponible en 30-40 secondes
- ⚠️ URL de téléchargement prête en 2-3 minutes
+124
View File
@@ -0,0 +1,124 @@
# Plan d'implémentation - Fonction Callback Suno
## Objectif
Créer une cloud function qui servira de callback pour l'API Suno afin de recevoir les notifications lorsque la génération de musique est terminée.
## Problèmes identifiés
- [ ] Besoin d'une URL de callback pour l'API Suno
- [ ] Gestion des notifications de fin de génération
- [ ] Mise à jour automatique du statut dans Firestore
- [ ] Traitement des erreurs de callback
## Solutions appliquées
### ✅ 1. Création de la fonction callback
- [x] Créé `/functions/src/callback.js`
- [x] Fonction `sunoCallback` avec méthode POST uniquement
- [x] Validation des données reçues
- [x] Gestion des erreurs avec logs émojis
### ✅ 2. Traitement des données callback
- [x] Extraction des paramètres de l'API Suno :
- `id` : Identifiant de la génération
- `status` : Statut de la génération
- `audio_url` : URL du fichier audio
- `video_url` : URL du fichier vidéo
- `image_url` : URL de l'image de couverture
- `lyric` : Paroles générées
- `title` : Titre de la chanson
- `tags` : Style musical
- `duration` : Durée de la chanson
- `error_message` : Message d'erreur si échec
### ✅ 3. Mise à jour Firestore
- [x] Recherche du document correspondant par ID
- [x] Mise à jour des champs :
- `status` : Nouveau statut
- `audioUrl` : URL audio si disponible
- `videoUrl` : URL vidéo si disponible
- `imageUrl` : URL image si disponible
- `lyrics` : Paroles si disponibles
- `title` : Titre si disponible
- `style` : Style si disponible
- `duration` : Durée si disponible
- `errorMessage` : Message d'erreur si échec
- `updatedAt` : Timestamp de mise à jour
### ✅ 4. Configuration de l'URL callback
- [x] Mis à jour `SUNO_CALLBACK_URL` dans `music.js`
- [x] URL : `https://us-central1-musicland-app.cloudfunctions.net/sunoCallback`
- [x] Intégration dans le payload de génération
### ✅ 5. Export de la fonction
- [x] Ajouté l'export dans `functions/index.js`
- [x] Fonction accessible via Firebase Functions
## Structure de la fonction callback
```javascript
exports.sunoCallback = onRequest({
cors: true,
methods: ["POST"],
}, async (req, res) => {
// Validation de la méthode
// Extraction des données
// Recherche du document Firestore
// Mise à jour des données
// Réponse de succès/erreur
});
```
## Gestion des erreurs
- ✅ Validation de la méthode HTTP (POST uniquement)
- ✅ Vérification de la présence de l'ID
- ✅ Vérification de l'existence du document Firestore
- ✅ Gestion des erreurs de mise à jour
- ✅ Logs avec émojis pour faciliter le debugging
## Réponses de la fonction
### Succès (200)
```json
{
"success": true,
"message": "Callback traité avec succès",
"id": "generation_id",
"status": "completed"
}
```
### Erreurs
- **405** : Méthode non autorisée
- **400** : ID manquant
- **404** : Document non trouvé
- **500** : Erreur interne du serveur
## Tests à effectuer
- [ ] Tester la fonction avec un payload de test
- [ ] Vérifier la mise à jour Firestore
- [ ] Tester les cas d'erreur
- [ ] Vérifier les logs
- [ ] Tester l'intégration avec l'API Suno
## Déploiement
- [ ] Déployer les functions : `firebase deploy --only functions`
- [ ] Vérifier l'URL de la fonction déployée
- [ ] Tester la fonction en production
## Notes importantes
- La fonction utilise `onRequest` pour accepter les callbacks HTTP
- CORS activé pour permettre les appels externes
- Seules les requêtes POST sont acceptées
- Les logs utilisent des émojis pour faciliter le debugging
- La fonction met à jour automatiquement le timestamp `updatedAt`
## Fichiers modifiés
-`/functions/src/callback.js` (créé)
-`/functions/src/music.js` (SUNO_CALLBACK_URL mis à jour)
-`/functions/index.js` (export ajouté)
- ✅ `/plans/suno-callback-implementation.md` (ce fichier)
+147
View File
@@ -0,0 +1,147 @@
# Plan - Suivi du statut de génération Suno
## Objectif
Permettre de suivre la progression d'une génération de musique Suno en utilisant le taskId retourné par l'API.
## Problème identifié
- ✅ L'API Suno retourne un taskId après la génération
- ✅ Pas de moyen de suivre la progression de la génération
- ✅ Besoin d'une fonction pour interroger le statut
## Solution implémentée
### ✅ 1. Ajout de la constante API
- [x] Ajouté `SUNO_STATUS_PATH = "/api/v1/query"` dans `music.js`
- [x] Endpoint pour interroger le statut d'une tâche
### ✅ 2. Création de la fonction getSunoStatus
- [x] Nouvelle fonction Cloud Function `getSunoStatus`
- [x] Prend en paramètre le `taskId`
- [x] Interroge l'API Suno pour récupérer le statut
- [x] Retourne les données de progression
### ✅ 3. Export de la fonction
- [x] Ajouté l'export dans `index.js`
- [x] Fonction accessible via `firebase.functions().httpsCallable('getSunoStatus')`
## Structure de la fonction
```javascript
exports.getSunoStatus = onCall({}, async ({ data = {} }) => {
const { taskId } = data;
// Validation du taskId
// Appel à l'API Suno
// Parsing de la réponse
// Retour des données
});
```
## Utilisation côté client
```javascript
// Après avoir généré la musique et récupéré le taskId
const checkStatus = async (taskId) => {
try {
const result = await firebase
.functions()
.httpsCallable('getSunoStatus')({ taskId });
console.log('Statut:', result.data);
return result.data;
} catch (error) {
console.error('Erreur:', error);
}
};
// Polling pour suivre la progression
const pollStatus = async (taskId) => {
const interval = setInterval(async () => {
const status = await checkStatus(taskId);
if (status?.data?.status === 'completed') {
clearInterval(interval);
console.log('🎵 Génération terminée!');
}
}, 5000); // Vérifier toutes les 5 secondes
};
```
## Réponse de la fonction
### Succès
```json
{
"success": true,
"taskId": "aa6920a5a84317c40688b6c4e457c630",
"data": {
"status": "processing", // ou "completed", "failed"
"progress": 75,
"audio_url": "https://...",
"video_url": "https://...",
"image_url": "https://..."
}
}
```
### Erreur
```json
{
"error": "Erreur lors de la vérification du statut: TaskId manquant"
}
```
## Statuts possibles
- `pending` : En attente de traitement
- `processing` : En cours de génération
- `completed` : Génération terminée avec succès
- `failed` : Échec de la génération
- `cancelled` : Génération annulée
## Gestion des erreurs
- ✅ Validation du taskId obligatoire
- ✅ Gestion des erreurs de réseau
- ✅ Parsing sécurisé de la réponse JSON
- ✅ Logs avec émojis pour le debugging
- ✅ Messages d'erreur explicites
## Prochaines étapes
- [ ] Déployer les fonctions : `firebase deploy --only functions`
- [ ] Tester la fonction avec un taskId réel
- [ ] Implémenter le polling côté client
- [ ] Ajouter une interface utilisateur pour afficher la progression
- [ ] Gérer les cas d'erreur côté client
## Exemple d'intégration complète
```javascript
// 1. Générer la musique
const generateResult = await firebase
.functions()
.httpsCallable('music-generateMusic')(musicData);
const taskId = generateResult.data.response.data.taskId;
// 2. Suivre la progression
if (taskId) {
pollStatus(taskId);
} else {
console.error('❌ TaskId manquant');
}
```
## Notes importantes
- ⚠️ Ne pas interroger l'API trop fréquemment (max toutes les 5 secondes)
- ⚠️ Implémenter un timeout pour éviter les boucles infinies
- ⚠️ Gérer les cas où le taskId n'existe plus
- ⚠️ La génération peut prendre 2-3 minutes selon la complexité
## Fichiers modifiés
-`/functions/src/music.js` - Ajout de getSunoStatus
-`/functions/index.js` - Export de la fonction
- ✅ `/plans/suno-status-tracking.md` - Ce fichier de documentation