70 lines
2.2 KiB
JavaScript
70 lines
2.2 KiB
JavaScript
exports.generatePicturePrompt = (project = {}) => {
|
|
const { title = "", lyrics: lyricsRaw, musicConfig = {} } = 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)";
|
|
|
|
// Prompt simplifié et optimisé pour Gemini
|
|
const prompt = `
|
|
Crée une pochette d'album musicale abstraite et colorée au format carré 1024x1024.
|
|
|
|
Contexte:
|
|
- Titre: ${title || "Sans titre"}
|
|
- Style musical: ${tags.join(" ; ")}
|
|
|
|
Directives essentielles:
|
|
- Style: Abstrait, graphique, avec formes géométriques et dégradés de couleurs
|
|
- Couleurs: ${paletteHint}
|
|
- IMPORTANT: Image plein cadre sans AUCUN bord blanc ou espace vide
|
|
- Composition: Éléments visuels répartis sur TOUTE la surface de l'image
|
|
|
|
Contraintes:
|
|
- PAS de texte ou typographie
|
|
- PAS de personnes ou visages
|
|
- PAS de fond blanc ou bordures
|
|
- PAS de filigrane
|
|
`.trim();
|
|
|
|
return prompt;
|
|
};
|