/** * Интегрированный Smart Montage Planner с подключением к backend */ import { AlertCircle, Download, Settings, Upload, Wand2 } from "lucide-react" import * as React from "react" import { Alert, AlertDescription } from "@/components/ui/alert" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Progress } from "@/components/ui/progress" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Slider } from "@/components/ui/slider" import { useMediaFiles } from "@/features/app-state/hooks/use-media-files" import type { MediaFile } from "@/features/media/types/media" import type { MediaItem } from "@/types/generated/tauri-bindings" import { useIntegratedAnalysis } from "../../hooks/use-integrated-analysis" import { MONTAGE_STYLES } from "../../types" import { PlanViewer } from "./plan-viewer" import { ProjectAnalyzer } from "./project-analyzer" import { Suggestions } from "./suggestions" // Добавляем React import для useState export function IntegratedPlannerDashboard() { const { mediaFiles } = useMediaFiles() const { analyzeProject, generateSmartPlan, isAnalyzing, isGenerating, analysisProgress, generationProgress, error, analysisResults, planGenerator, } = useIntegratedAnalysis() // Локальное состояние для настроек const [selectedStyle, setSelectedStyle] = React.useState("dynamic") const [targetDuration, setTargetDuration] = React.useState([120]) // в секундах const hasMedia = mediaFiles.length > 0 const hasAnalysis = analysisResults !== null const hasPlan = planGenerator.currentPlan !== null const canAnalyze = hasMedia && !isAnalyzing && !isGenerating const canGenerate = hasAnalysis && !isAnalyzing && !isGenerating /** * Запуск анализа проекта */ const handleAnalyzeProject = async () => { try { // Convert MediaItem[] to MediaFile[] const convertedMediaFiles: MediaFile[] = mediaFiles.map((item: MediaItem) => ({ id: item.id, path: item.path, name: item.name, isVideo: item.media_type === "Video", isAudio: item.media_type === "Audio", duration: item.duration || 0, format: item.metadata?.format || "", codec: item.metadata?.codec || "", width: item.metadata?.resolution?.width || 0, height: item.metadata?.resolution?.height || 0, frameRate: item.metadata?.frame_rate || 0, bitrate: item.metadata?.bitrate || 0, })) await analyzeProject(convertedMediaFiles) } catch (error) { console.error("Analysis failed:", error) } } /** * Генерация умного плана */ const handleGenerateSmartPlan = async () => { try { await generateSmartPlan(selectedStyle, targetDuration[0]) } catch (error) { console.error("Plan generation failed:", error) } } /** * Экспорт плана */ const handleExportPlan = () => { if (planGenerator.currentPlan) { const planData = JSON.stringify(planGenerator.currentPlan, null, 2) const blob = new Blob([planData], { type: "application/json" }) const url = URL.createObjectURL(blob) const a = document.createElement("a") a.href = url a.download = `montage-plan-${planGenerator.currentPlan.name}.json` document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) } } /** * Форматирование времени */ const formatDuration = (seconds: number) => { const mins = Math.floor(seconds / 60) const secs = Math.floor(seconds % 60) return `${mins}:${secs.toString().padStart(2, "0")}` } return (
{/* Header */}

Smart Montage Planner

AI-powered automatic montage plan generation with YOLO and FFmpeg analysis

{hasPlan && ( )}
{/* Error Alert */} {error && ( {error} )} {/* Progress Bar */} {(isAnalyzing || isGenerating) && (
{isAnalyzing ? "Analyzing media files..." : "Generating montage plan..."} {Math.round(isAnalyzing ? analysisProgress : generationProgress)}%
)} {/* Main Control Panel */}
{/* Project Overview */} Project Overview Current project statistics
Media Files {mediaFiles.length}
Total Duration {formatDuration( mediaFiles.reduce((sum: number, file: MediaItem) => { const duration = file.duration return sum + (typeof duration === "number" ? duration : 0) }, 0), )}
{analysisResults && ( <>
Video Files {analysisResults.videoCount}
Audio Files {analysisResults.audioCount}
Key Moments {analysisResults.momentsDetected}
Avg Quality {analysisResults.averageQuality.toFixed(0)}%
)}
{/* Montage Settings */} Montage Settings Configure your montage plan
{/* Style Selection */}

{selectedStyle in MONTAGE_STYLES ? MONTAGE_STYLES[selectedStyle].description : ""}

{/* Target Duration */}
30s 10min
{/* Actions */} Actions Montage planning workflow
{hasPlan && ( )}
{/* Backend Integration Status */} Backend Integration Status Real-time connection to Tauri backend commands
YOLO Analysis
FFmpeg Video
FFmpeg Audio
Moment Detection
Plan Generation
Timeline Integration
{/* Analysis Results */} {hasAnalysis && } {/* Plan Viewer */} {hasPlan && planGenerator.currentPlan && } {/* Suggestions */} {hasPlan && }
) }