exports.generatePicturePrompt = (project = {}) => { const { title = "", lyrics: lyricsRaw, musicConfig = {}, coverStyle: coverStyleRaw = "", } = project || {}; const { genres = [], tempo = "", voice = "", instruments = [], mood = "", } = musicConfig || {}; // Normalise les paroles en tableau de sections { type, lyrics } const lyricsSections = Array.isArray(lyricsRaw) ? lyricsRaw : [ lyricsRaw?.couplet ? { type: "couplet", lyrics: lyricsRaw.couplet } : null, lyricsRaw?.refrain ? { type: "refrain", lyrics: lyricsRaw.refrain } : null, ].filter(Boolean); // Échantillon pour l'ambiance (courtes bribes pour inspirer la direction créative) const lyricsSample = (lyricsSections || []) .map((s) => (s?.lyrics || "").split("\n").slice(0, 2).join(" ")) .filter(Boolean) .slice(0, 6) .join(" | "); // Etiquettes d'ambiance const tags = []; if (Array.isArray(genres) && genres.length) tags.push(`Genres: ${genres.join(", ")}`); if (tempo) tags.push(`Tempo: ${tempo}`); if (Array.isArray(instruments) && instruments.length) tags.push(`Instruments: ${instruments.join(", ")}`); if (voice) tags.push(`Vocal: ${voice}`); if (mood) tags.push(`Mood: ${mood}`); // Guidance palette selon tempo (simple heuristique) const paletteHint = tempo && /\b(rapid|fast|vite|agité|upbeat|energ)/i.test(String(tempo)) ? "Palette vive et contrastée (magenta, cyan, jaune, bleu électrique)" : "Palette harmonieuse et douce (bleu nuit, violet, corail, or pâle)"; const coverStyle = String(coverStyleRaw || "").trim(); const tagsLine = tags.join(" ; ") || "Non spécifié"; const lyricsLine = lyricsSample || "Pas d'extraits fournis"; const styleLine = coverStyle ? `${coverStyle}. ${paletteHint}` : `${paletteHint}. Style libre, artistique et lumineux.`; const prompt = ` Créer une pochette d'album en adéquation avec les paroles de la musique ${title || "Sans titre"} ${tagsLine} ${lyricsLine} Image carrée 1024x1024 pixels, résolution haute. La composition doit être dynamique et remplir toute la surface, sans laisser de bordures ni de zones vides. Intègre de manière artistique et lisible le titre de la chanson ${title || "Sans titre"}. La typographie doit compléter le style abstrait et lumineux de la pochette. Priorise la lisibilité. Réserve un espace net et dégagé en bas à droite, occupant environ 25% de la largeur totale. Cette zone doit être légèrement plus sombre ou avoir un contraste suffisant. Personnes, visages ou silhouettes reconnaissables. Fonds blancs ou bordures délimitant l'image. Tout autre logo, filigrane ou texte promotionnel que le titre, l'artiste et la zone réservée pour "MusicLand Production". Texte illisible ou trop petit. `.trim(); return prompt; };