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é.
Crée un espace vide et propre en bas à droite (25% de la largeur), sans texte, logo ou marquage. Cet espace servira à insérer un logo plus tard manuellement.
Personnes, visages ou silhouettes reconnaissables.
Fonds blancs ou bordures délimitant l'image.
Tout texte promotionnel, filigrane ou logo (y compris "MusicLand Production").
Texte illisible ou trop petit.
`.trim();
return prompt;
};