feat: Suno sunoapi.org v1 스펙 적용 + 팩 상세 섹션 재구성

- Suno API: /api/v1/generate (taskId) + record-info 폴링으로 전환
- SUNO_API_URL 기본값 https://api.sunoapi.org, SUNO_API_KEY만 필수
- 모델: V4 / V4_5 / V3_5, customMode·callBackUrl 지원
- 결과 카드: sunoData 배열(오디오·이미지·태그·duration) 렌더
- 팩 상세: 팩 구성품 + 추천 대상 섹션 추가, Before/After 제거
This commit is contained in:
2026-04-15 03:34:44 +09:00
parent a362f7b387
commit b8c5a202ce
4 changed files with 249 additions and 186 deletions

View File

@@ -204,36 +204,31 @@ export default function MusicServicePage() {
</div>
</section>
{/* BEFORE / AFTER */}
<section className="px-6 py-20 lg:px-14 bg-slate-950 border-t border-white/5">
<div className="max-w-5xl mx-auto">
<p className="font-mono text-xs text-violet-300/70 tracking-widest uppercase mb-2 text-center">
Before vs After
</p>
<h2 className="text-3xl md:text-4xl font-extrabold text-center mb-12">
AI , ?
</h2>
<div className="grid md:grid-cols-2 gap-5">
<div className="border border-rose-500/20 bg-rose-500/5 rounded-2xl p-8">
<div className="text-4xl mb-3">😵</div>
<h3 className="font-extrabold text-rose-300 mb-3 text-lg">Before · </h3>
<ul className="space-y-2 text-sm text-slate-300 leading-relaxed">
<li> Suno 10 </li>
<li> </li>
<li> </li>
<li> 0</li>
</ul>
</div>
<div className="border border-emerald-500/30 bg-emerald-500/5 rounded-2xl p-8 shadow-[0_0_40px_rgba(16,185,129,0.15)]">
<div className="text-4xl mb-3">🎯</div>
<h3 className="font-extrabold text-emerald-300 mb-3 text-lg">After · </h3>
<ul className="space-y-2 text-sm text-slate-200 leading-relaxed">
<li> 1 </li>
<li> 30 </li>
<li> · </li>
<li> SEO 릿 </li>
</ul>
</div>
{/* 팩 구성품 */}
<section className="px-6 py-16 lg:px-14 bg-slate-950 border-t border-white/5">
<div className="max-w-6xl mx-auto">
<p className="font-mono text-xs text-violet-300/70 tracking-widest uppercase mb-2">What's Included</p>
<h2 className="text-2xl md:text-3xl font-extrabold mb-8">팩 구성품</h2>
<div className="grid md:grid-cols-2 gap-4">
{[
{ icon: '📄', title: 'Suno (PDF)', desc: '·· 20+. .' },
{ icon: '🎼', title: ' 릿 ', desc: 'Verse·Chorus·Bridge + Suno Custom .' },
{ icon: '🎬', title: 'MV ', desc: 'Midjourney · Runway · Luma로 .' },
{ icon: '', title: ' & ', desc: 'Suno/Runway + .' },
{ icon: '📦', title: ' (·)', desc: ' .prj + . .' },
{ icon: '🔄', title: '12 ', desc: 'Suno · . Notion에서 .' },
].map((item) => (
<div
key={item.title}
className="flex gap-4 p-5 rounded-xl border border-white/10 bg-white/[0.02]"
>
<div className="text-2xl flex-shrink-0">{item.icon}</div>
<div>
<h3 className="font-bold text-white mb-1">{item.title}</h3>
<p className="text-sm text-slate-400 leading-relaxed">{item.desc}</p>
</div>
</div>
))}
</div>
</div>
</section>
@@ -327,6 +322,39 @@ export default function MusicServicePage() {
</div>
</section>
{/* 추천 대상 */}
<section className="px-6 py-20 lg:px-14 bg-slate-950 border-t border-white/5">
<div className="max-w-5xl mx-auto">
<p className="font-mono text-xs text-violet-300/70 tracking-widest uppercase mb-2 text-center">
Who It's For
</p>
<h2 className="text-3xl md:text-4xl font-extrabold text-center mb-12">
</h2>
<div className="grid md:grid-cols-2 gap-5">
<div className="border border-emerald-500/30 bg-emerald-500/5 rounded-2xl p-8 shadow-[0_0_40px_rgba(16,185,129,0.12)]">
<div className="text-4xl mb-3">🎯</div>
<h3 className="font-extrabold text-emerald-300 mb-3 text-lg"> </h3>
<ul className="space-y-2 text-sm text-slate-200 leading-relaxed">
<li> Suno를 </li>
<li> · 1 </li>
<li> · BGM을 </li>
<li> AI </li>
</ul>
</div>
<div className="border border-white/10 bg-white/[0.02] rounded-2xl p-8">
<div className="text-4xl mb-3">🙅</div>
<h3 className="font-extrabold text-slate-300 mb-3 text-lg"> </h3>
<ul className="space-y-2 text-sm text-slate-400 leading-relaxed">
<li> (B2B )</li>
<li> DAW· </li>
<li> Suno ( )</li>
</ul>
</div>
</div>
</div>
</section>
{/* B2B */}
<section className="px-6 py-16 lg:px-14 bg-gradient-to-br from-slate-900 to-slate-950 border-y border-white/5">
<div className="max-w-5xl mx-auto">