fix: hide lyrics and exclude from zip and descriptions for instrumental tracks
This commit is contained in:
1 parent
d157d34fca
commit
07156d8ea0
3 files changed
+14
-10
No files matched your search
+2
-2
@@ -26,10 +26,10 @@ REQUIRED JSON STRUCTURE:
|
|||||||
"Title 2: direct/strong (max 4 words)",
|
"Title 2: direct/strong (max 4 words)",
|
||||||
"Title 3: abstract/intriguing (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'.",
|
"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.",
|
"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": [
|
"video_prompts": [
|
||||||
{
|
{
|
||||||
"type": "Abstract",
|
"type": "Abstract",
|
||||||
|
|||||||
@@ -98,13 +98,15 @@ export function ResultsPanel({
|
|||||||
onRegenerate={() => onRegenerateSection("titles")}
|
onRegenerate={() => onRegenerateSection("titles")}
|
||||||
regenerating={Boolean(regenerating.titles)}
|
regenerating={Boolean(regenerating.titles)}
|
||||||
/>
|
/>
|
||||||
<LyricsCard
|
{assets.lyrics && assets.lyrics.trim().length > 0 && (
|
||||||
lyrics={assets.lyrics}
|
<LyricsCard
|
||||||
originalLyrics={originalAssets.lyrics}
|
lyrics={assets.lyrics}
|
||||||
onChange={(v) => onChange("lyrics", v)}
|
originalLyrics={originalAssets.lyrics}
|
||||||
onRegenerate={(selectedText) => onRegenerateSection("lyrics", selectedText)}
|
onChange={(v) => onChange("lyrics", v)}
|
||||||
regenerating={Boolean(regenerating.lyrics)}
|
onRegenerate={(selectedText) => onRegenerateSection("lyrics", selectedText)}
|
||||||
/>
|
regenerating={Boolean(regenerating.lyrics)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
<StyleCard
|
<StyleCard
|
||||||
style={assets.style}
|
style={assets.style}
|
||||||
negativeStyle={assets.negative_style}
|
negativeStyle={assets.negative_style}
|
||||||
|
|||||||
+3
-1
@@ -65,7 +65,9 @@ export async function buildSongZip(
|
|||||||
): Promise<Blob> {
|
): Promise<Blob> {
|
||||||
const zip = new JSZip();
|
const zip = new JSZip();
|
||||||
zip.file("Style.txt", buildStyleTxt(assets));
|
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("Videodescription.txt", buildYouTubeDescriptionTxt(assets));
|
||||||
zip.file("Videoprompt.txt", buildVideoPromptTxt(assets));
|
zip.file("Videoprompt.txt", buildVideoPromptTxt(assets));
|
||||||
return zip.generateAsync({ type: "blob" });
|
return zip.generateAsync({ type: "blob" });
|
||||||
|
|||||||
Reference in new issue
Block a user