Files
musicland/functions/helpers/prompts.js
T
2025-10-23 10:16:36 +02:00

84 lines
3.2 KiB
JavaScript

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 = `<BRIEF>
<OBJECTIF>Créer une pochette d'album en adéquation avec les paroles de la musique</OBJECTIF>
<TITRE>${title || "Sans titre"}</TITRE>
<STYLE_MUSICAL>${tagsLine}</STYLE_MUSICAL>
<EXTRAITS_PAROLES>${lyricsLine}</EXTRAITS_PAROLES>
</BRIEF>
<CONTEXTES_VISUELS>
<FORMAT>Image carrée 1024x1024 pixels, résolution haute.</FORMAT>
<STYLE>${styleLine}</STYLE>
<COMPOSITION>La composition doit être dynamique et remplir toute la surface, sans laisser de bordures ni de zones vides.</COMPOSITION>
<TYPOGRAPHIE>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é.</TYPOGRAPHIE>
<LOGO_RESERVE>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.</LOGO_RESERVE>
</CONTEXTES_VISUELS>
<CONTRAINTES>
<INTERDIT>Personnes, visages ou silhouettes reconnaissables.</INTERDIT>
<INTERDIT>Fonds blancs ou bordures délimitant l'image.</INTERDIT>
<INTERDIT>Tout autre logo, filigrane ou texte promotionnel que le titre, l'artiste et la zone réservée pour "MusicLand Production".</INTERDIT>
<INTERDIT>Texte illisible ou trop petit.</INTERDIT>
</CONTRAINTES>
`.trim();
return prompt;
};