import React from "react"; import { Stack, Typography, Paper, Alert, alpha } from "@mui/material"; import { Download as DownloadIcon, Refresh as RefreshIcon } from "@mui/icons-material"; import { useScriptEditor } from "../ScriptEditorContext"; import { PrimaryButton, SecondaryButton } from "../../ui"; import { InlineAudioPlayer } from "../../InlineAudioPlayer"; import { aiApiClient } from "../../../../api/client"; interface ScriptEditorDownloadPanelProps { projectId: string; } export const ScriptEditorDownloadPanel: React.FC = ({ projectId }) => { const { allScenesHaveAudio, scenesWithAudio, combiningAudio, combinedAudioResult, combineAudio, setCombinedAudioResult } = useScriptEditor(); if (!(allScenesHaveAudio ?? false)) { return null; } const handleDownloadAgain = async () => { if (!combinedAudioResult) return; try { let audioPath = combinedAudioResult.url.startsWith('/') ? combinedAudioResult.url : `/${combinedAudioResult.url}`; if (!audioPath.includes('/api/podcast/audio/')) { const filename = audioPath.split('/').pop() || combinedAudioResult.filename; audioPath = `/api/podcast/audio/${filename}`; } audioPath = audioPath.split('?')[0]; const response = await aiApiClient.get(audioPath, { responseType: 'blob' }); const blob = response.data; const blobUrl = URL.createObjectURL(blob); const link = document.createElement("a"); link.href = blobUrl; link.download = combinedAudioResult.filename || `podcast-episode-${projectId.slice(-8)}.mp3`; document.body.appendChild(link); link.click(); document.body.removeChild(link); setTimeout(() => URL.revokeObjectURL(blobUrl), 100); } catch (error) { console.error('Failed to download audio:', error); } }; return ( Download Audio-Only Podcast {!combinedAudioResult ? ( <> } sx={{ minWidth: 280, fontSize: "1rem", py: 1.5, background: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)" }}> {combiningAudio ? "Combining Audio..." : "Download Audio-Only Podcast"} This will combine all {scenesWithAudio} scene audio files into one complete podcast episode. ) : ( ✅ Combined audio generated successfully! ({combinedAudioResult.sceneCount} scenes, {Math.round(combinedAudioResult.duration)}s) }>Download Again { setCombinedAudioResult(null); combineAudio(); }} disabled={combiningAudio} loading={combiningAudio} startIcon={}>Regenerate )} ); };