157 lines
5.8 KiB
Python
157 lines
5.8 KiB
Python
"""
|
|
Video enhancement endpoints.
|
|
"""
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Form, BackgroundTasks
|
|
from sqlalchemy.orm import Session
|
|
from typing import Optional, Dict, Any
|
|
import uuid
|
|
|
|
from ...database import get_db
|
|
from ...models.content_asset_models import AssetSource, AssetType
|
|
from ...services.video_studio import VideoStudioService
|
|
from ...services.asset_service import ContentAssetService
|
|
from ...utils.auth import get_current_user, require_authenticated_user
|
|
from ...utils.logger_utils import get_service_logger
|
|
|
|
logger = get_service_logger("video_studio.endpoints.enhance")
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/enhance")
|
|
async def enhance_video(
|
|
background_tasks: BackgroundTasks,
|
|
file: UploadFile = File(..., description="Video file to enhance"),
|
|
enhancement_type: str = Form(..., description="Type of enhancement: upscale, stabilize, colorize, etc"),
|
|
target_resolution: Optional[str] = Form(None, description="Target resolution for upscale"),
|
|
provider: str = Form("wavespeed", description="AI provider to use"),
|
|
model: str = Form("wavespeed/flashvsr", description="Specific AI model to use"),
|
|
current_user: Dict[str, Any] = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
) -> Dict[str, Any]:
|
|
"""
|
|
Enhance existing video using AI models.
|
|
|
|
Supports upscaling, stabilization, colorization, and other enhancements.
|
|
"""
|
|
try:
|
|
user_id = require_authenticated_user(current_user)
|
|
|
|
if not file.content_type.startswith('video/'):
|
|
raise HTTPException(status_code=400, detail="File must be a video")
|
|
|
|
# Initialize services
|
|
video_service = VideoStudioService()
|
|
asset_service = ContentAssetService(db)
|
|
|
|
logger.info(f"[VideoStudio] Video enhancement request: user={user_id}, type={enhancement_type}, model={model}")
|
|
|
|
# Read video file
|
|
video_data = await file.read()
|
|
|
|
# Enhance video
|
|
result = await video_service.enhance_video(
|
|
video_data=video_data,
|
|
enhancement_type=enhancement_type,
|
|
target_resolution=target_resolution,
|
|
provider=provider,
|
|
model=model,
|
|
user_id=user_id,
|
|
)
|
|
|
|
if not result.get("success"):
|
|
raise HTTPException(
|
|
status_code=500,
|
|
detail=f"Video enhancement failed: {result.get('error', 'Unknown error')}"
|
|
)
|
|
|
|
# Store enhanced version in asset library
|
|
video_url = result.get("video_url")
|
|
if video_url:
|
|
asset_metadata = {
|
|
"original_file": file.filename,
|
|
"enhancement_type": enhancement_type,
|
|
"target_resolution": target_resolution,
|
|
"provider": provider,
|
|
"model": model,
|
|
"generation_type": "enhancement",
|
|
}
|
|
|
|
asset_service.create_asset(
|
|
user_id=user_id,
|
|
filename=f"enhanced_{uuid.uuid4().hex[:8]}.mp4",
|
|
file_url=video_url,
|
|
asset_type=AssetType.VIDEO,
|
|
source_module=AssetSource.VIDEO_STUDIO,
|
|
asset_metadata=asset_metadata,
|
|
cost=result.get("cost", 0),
|
|
tags=["video_studio", "enhancement", "ai-enhanced"]
|
|
)
|
|
|
|
logger.info(f"[VideoStudio] Video enhancement successful: user={user_id}, url={video_url}")
|
|
|
|
return {
|
|
"success": True,
|
|
"video_url": video_url,
|
|
"cost": result.get("cost", 0),
|
|
"enhancement_type": enhancement_type,
|
|
"model_used": model,
|
|
"provider": provider,
|
|
}
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"[VideoStudio] Video enhancement error: {e}", exc_info=True)
|
|
raise HTTPException(status_code=500, detail=f"Video enhancement failed: {str(e)}")
|
|
|
|
|
|
@router.post("/enhance/estimate-cost")
|
|
async def estimate_enhance_cost(
|
|
target_resolution: str = Form("1080p", description="Target resolution (720p, 1080p, 2k, 4k)"),
|
|
estimated_duration: float = Form(10.0, description="Estimated video duration in seconds", ge=5.0),
|
|
current_user: Dict[str, Any] = Depends(get_current_user),
|
|
) -> Dict[str, Any]:
|
|
"""
|
|
Estimate cost for video enhancement operation.
|
|
|
|
Returns estimated cost based on target resolution and duration.
|
|
"""
|
|
try:
|
|
require_authenticated_user(current_user)
|
|
|
|
# Validate resolution
|
|
if target_resolution not in ("720p", "1080p", "2k", "4k"):
|
|
raise HTTPException(
|
|
status_code=400,
|
|
detail="Target resolution must be '720p', '1080p', '2k', or '4k'"
|
|
)
|
|
|
|
# FlashVSR pricing: $0.06-$0.16 per 5 seconds based on resolution
|
|
pricing = {
|
|
"720p": 0.06 / 5, # $0.012 per second
|
|
"1080p": 0.09 / 5, # $0.018 per second
|
|
"2k": 0.12 / 5, # $0.024 per second
|
|
"4k": 0.16 / 5, # $0.032 per second
|
|
}
|
|
|
|
cost_per_second = pricing.get(target_resolution.lower(), pricing["1080p"])
|
|
estimated_cost = max(5.0, estimated_duration) * cost_per_second # Minimum 5 seconds
|
|
|
|
return {
|
|
"estimated_cost": estimated_cost,
|
|
"target_resolution": target_resolution,
|
|
"estimated_duration": estimated_duration,
|
|
"cost_per_second": cost_per_second,
|
|
"pricing_model": "per_second",
|
|
"min_duration": 5.0,
|
|
"max_duration": 600.0, # 10 minutes max
|
|
"min_charge": cost_per_second * 5.0,
|
|
}
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"[VideoStudio] Failed to estimate cost: {e}", exc_info=True)
|
|
raise HTTPException(status_code=500, detail=f"Failed to estimate cost: {str(e)}") |