diff --git a/server/prompts.mjs b/server/prompts.mjs index 10e3caa..0f3f3da 100644 --- a/server/prompts.mjs +++ b/server/prompts.mjs @@ -26,10 +26,10 @@ REQUIRED JSON STRUCTURE: "Title 2: direct/strong (max 4 words)", "Title 3: abstract/intriguing (max 4 words)" ], - "lyrics": "Full lyrics with Suno section tags [Verse], [Chorus], [Bridge], [Outro], etc. Use AABB or ABAB rhyme scheme consistently. Lines must be rhythmically singable. CRITICAL: The lyrics must NOT reference the genre, instruments, or music production. No references to pianos, guitars, beats, orchestras, or any musical elements. Write about universal human themes: emotion, nature, love, time, memory, journey, longing.", + "lyrics": "If instrumental, return an empty string \"\". Otherwise: Full lyrics with Suno section tags [Verse], [Chorus], [Bridge], [Outro], etc. Use AABB or ABAB rhyme scheme consistently. Lines must be rhythmically singable. CRITICAL: The lyrics must NOT reference the genre, instruments, or music production. No references to pianos, guitars, beats, orchestras, or any musical elements. Write about universal human themes: emotion, nature, love, time, memory, journey, longing.", "style": "Comma-separated Suno style description, max 120 words. Include: tempo with BPM range, key instruments, production style, texture, energy level, mood, vocal style (or 'instrumental, no vocals'). NEVER name any artist, band, or use 'sounds like'.", "negative_style": "Comma-separated list of genres, instruments, moods, and styles that should NOT appear.", - "youtube_description": "In the same language as the lyrics. Follow this exact structure:\\n\\n[One evocative hook sentence tied to the mood]\\n\\n[2-3 sentences describing the music, mood, and emotional experience]\\n\\n────────────────────────────\\n\\n[Full lyrics, copied exactly]\\n\\n────────────────────────────\\n\\n[Warm, genuine call to action: ask viewers to like, subscribe, and comment what the music makes them feel or imagine]\\n\\n#hashtag1 #hashtag2 ... (12-15 hashtags: mix of genre, mood, and tool tags like #SunoAI #AIMusic)", + "youtube_description": "In the same language as the lyrics. Follow this exact structure:\\n\\n[One evocative hook sentence tied to the mood]\\n\\n[2-3 sentences describing the music, mood, and emotional experience]\\n\\n────────────────────────────\\n\\n[Full lyrics, copied exactly. IF INSTRUMENTAL, OMIT THIS SECTION AND THE DIVIDERS COMPLETELY]\\n\\n────────────────────────────\\n\\n[Warm, genuine call to action: ask viewers to like, subscribe, and comment what the music makes them feel or imagine]\\n\\n#hashtag1 #hashtag2 ... (12-15 hashtags: mix of genre, mood, and tool tags like #SunoAI #AIMusic)", "video_prompts": [ { "type": "Abstract", diff --git a/src/components/ResultsPanel.tsx b/src/components/ResultsPanel.tsx index 8a2938a..1a0915b 100644 --- a/src/components/ResultsPanel.tsx +++ b/src/components/ResultsPanel.tsx @@ -98,13 +98,15 @@ export function ResultsPanel({ onRegenerate={() => onRegenerateSection("titles")} regenerating={Boolean(regenerating.titles)} /> - onChange("lyrics", v)} - onRegenerate={(selectedText) => onRegenerateSection("lyrics", selectedText)} - regenerating={Boolean(regenerating.lyrics)} - /> + {assets.lyrics && assets.lyrics.trim().length > 0 && ( + onChange("lyrics", v)} + onRegenerate={(selectedText) => onRegenerateSection("lyrics", selectedText)} + regenerating={Boolean(regenerating.lyrics)} + /> + )} { const zip = new JSZip(); zip.file("Style.txt", buildStyleTxt(assets)); - zip.file("Text.txt", buildTextTxt(assets)); + if (assets.lyrics && assets.lyrics.trim().length > 0) { + zip.file("Text.txt", buildTextTxt(assets)); + } zip.file("Videodescription.txt", buildYouTubeDescriptionTxt(assets)); zip.file("Videoprompt.txt", buildVideoPromptTxt(assets)); return zip.generateAsync({ type: "blob" });