'use client' import { useState } from 'react' import type { TrainingMedia } from '@/lib/sdk/training/types' import { generateAudio, publishMedia } from '@/lib/sdk/training/api' interface AudioPlayerProps { moduleId: string audio: TrainingMedia | null onMediaUpdate: () => void } export default function AudioPlayer({ moduleId, audio, onMediaUpdate }: AudioPlayerProps) { const [generating, setGenerating] = useState(false) const [error, setError] = useState(null) async function handleGenerate() { setGenerating(true) setError(null) try { await generateAudio(moduleId) onMediaUpdate() } catch (e) { setError(e instanceof Error ? e.message : 'Audio-Generierung fehlgeschlagen') } finally { setGenerating(false) } } async function handlePublishToggle() { if (!audio) return try { await publishMedia(audio.id, !audio.is_published) onMediaUpdate() } catch (e) { setError(e instanceof Error ? e.message : 'Fehler beim Aendern des Status') } } function formatDuration(seconds: number): string { const mins = Math.floor(seconds / 60) const secs = Math.floor(seconds % 60) return `${mins}:${secs.toString().padStart(2, '0')}` } function formatSize(bytes: number): string { if (bytes < 1024) return `${bytes} B` if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB` return `${(bytes / (1024 * 1024)).toFixed(1)} MB` } return (

Audio

{!audio && ( )}
{error && (
{error}
)} {generating && !audio && (
Audio wird generiert (kann einige Minuten dauern)...
)} {audio && audio.status === 'processing' && (
Audio wird verarbeitet...
)} {audio && audio.status === 'failed' && (
Generierung fehlgeschlagen: {audio.error_message}
)} {audio && audio.status === 'completed' && (
Dauer: {formatDuration(audio.duration_seconds)} Groesse: {formatSize(audio.file_size_bytes)} Stimme: {audio.voice_model}
)}
) }