import React, { useState, useEffect } from 'react'; import { Grid, Box, Button, Typography, Stack, CircularProgress, LinearProgress, Alert } from '@mui/material'; import { VideoStudioLayout } from '../../VideoStudioLayout'; import { useEnhanceVideo } from './hooks/useEnhanceVideo'; import { VideoUpload, EnhancementSettings } from './components'; import { aiApiClient } from '../../../../api/client'; import PlayArrowIcon from '@mui/icons-material/PlayArrow'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import ErrorIcon from '@mui/icons-material/Error'; const EnhanceVideo: React.FC = () => { const { videoFile, videoPreview, targetResolution, enhancementType, setVideoFile, setTargetResolution, setEnhancementType, canEnhance, costHint, } = useEnhanceVideo(); const [enhancing, setEnhancing] = useState(false); const [progress, setProgress] = useState(0); const [statusMessage, setStatusMessage] = useState(''); const [error, setError] = useState(null); const [result, setResult] = useState<{ video_url: string; cost: number } | null>(null); const [progressInterval, setProgressInterval] = useState(null); // Cleanup progress interval on unmount useEffect(() => { return () => { if (progressInterval) { clearInterval(progressInterval); } }; }, [progressInterval]); const handleEnhance = async () => { if (!videoFile) return; setEnhancing(true); setError(null); setResult(null); setProgress(0); setStatusMessage('Starting video enhancement...'); try { // Create FormData const formData = new FormData(); formData.append('file', videoFile); formData.append('enhancement_type', enhancementType); formData.append('target_resolution', targetResolution); formData.append('provider', 'wavespeed'); formData.append('model', 'flashvsr'); // Submit enhancement request setStatusMessage('Uploading video...'); const response = await aiApiClient.post('/api/video-studio/enhance', formData, { headers: { 'Content-Type': 'multipart/form-data', }, onUploadProgress: (progressEvent) => { if (progressEvent.total) { const uploadProgress = Math.round((progressEvent.loaded * 20) / progressEvent.total); setProgress(uploadProgress); setStatusMessage(`Uploading video... ${uploadProgress}%`); } }, timeout: 600000, // 10 minutes timeout for long videos }); setProgress(30); setStatusMessage('Processing video with FlashVSR... This may take a few minutes...'); // FlashVSR processing can take 3-20 seconds per 1 second of video // Simulate progress updates while waiting for response let simulatedProgress = 30; const interval = setInterval(() => { simulatedProgress = Math.min(90, simulatedProgress + 5); setProgress(simulatedProgress); setStatusMessage(`Processing... ${simulatedProgress}% (This may take several minutes for long videos)`); }, 2000); setProgressInterval(interval); try { if (response.data.success) { clearInterval(interval); setProgressInterval(null); setEnhancing(false); setResult(response.data); setProgress(100); setStatusMessage('Video enhancement complete!'); } else { clearInterval(interval); setProgressInterval(null); throw new Error(response.data.error || 'Enhancement failed'); } } catch (err) { clearInterval(interval); setProgressInterval(null); throw err; } } catch (err: any) { if (progressInterval) { clearInterval(progressInterval); setProgressInterval(null); } setEnhancing(false); setProgress(0); setError(err.response?.data?.detail || err.message || 'Failed to enhance video'); setStatusMessage('Enhancement failed'); } }; const handleReset = () => { setEnhancing(false); setProgress(0); setStatusMessage(''); setError(null); setResult(null); if (progressInterval) { clearInterval(progressInterval); setProgressInterval(null); } }; return ( {/* Left Panel - Upload & Settings */} {enhancing && ( {statusMessage} )} {error && ( setError(null)}> {error} )} {/* Right Panel - Preview & Results */} {result ? ( // Side-by-side comparison view Comparison Enhancement Complete! Cost: ${result.cost.toFixed(4)} | Resolution: {targetResolution.toUpperCase()} ) : videoPreview ? ( // Original video preview Original Video Preview ) : ( Upload a video to see preview Your enhanced video will appear here )} {/* Info Box */} About FlashVSR FlashVSR is the most advanced video upscaler, delivering: Temporal consistency for stable motion Detail reconstruction for fine textures Artifact cleanup for compression blocks Natural look without overprocessing ); }; export default EnhanceVideo; export { EnhanceVideo };