feat: MP3 download/export capability
Backend:
- New endpoint: GET /api/clips/{id}/download
- Returns MP3 with Content-Disposition: attachment header
- Filename derived from clip title (sanitized) or prompt, falls back to clip ID
- Sanitization: alphanumeric + spaces/hyphens/underscores only, max 60 chars
- Uses FastAPI FileResponse with media_type=audio/mpeg
Frontend:
- Gallery ribbons: Download button (downward arrow icon) next to delete button
- Uses window.open() to trigger browser download
- Hover: lyria-accent color
- Gallery tiles: Download button in tile footer action row
- Small icon (w-3 h-3), same hover behavior
- DetailPanel: Full-width 'Download MP3' button above Delete Track
- lyria-accent styled, with download icon
- Uses <a href> with download attribute for native browser handling
Architecture KB updated with Export/Download section.
This commit is contained in:
1 parent
57b9f9d78e
commit
119b75fbcd
3 files changed
+60
-1
No files matched your search
@@ -302,7 +302,17 @@ export default function DetailPanel({ clip, onClose, onRename, onDelete, onUploa
|
||||
</div>
|
||||
|
||||
{/* Actions */}
|
||||
<div className="pt-3 border-t border-white/5">
|
||||
<div className="pt-3 border-t border-white/5 space-y-2">
|
||||
<a
|
||||
href={`/api/clips/${clip.id}/download`}
|
||||
download
|
||||
className="w-full py-2 text-sm text-lyria-accent bg-lyria-accent/10 hover:bg-lyria-accent/20 rounded-md transition-colors flex items-center justify-center gap-2"
|
||||
>
|
||||
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" />
|
||||
</svg>
|
||||
Download MP3
|
||||
</a>
|
||||
<button
|
||||
onClick={() => { onDelete(clip.id); onClose() }}
|
||||
className="w-full py-2 text-sm text-red-400 bg-red-500/10 hover:bg-red-500/20 rounded-md transition-colors"
|
||||
|
||||
Reference in new issue
Block a user