AI Researcher and Video Studio implementation complete
This commit is contained in:
84
backend/services/wavespeed/generators/video/base.py
Normal file
84
backend/services/wavespeed/generators/video/base.py
Normal file
@@ -0,0 +1,84 @@
|
||||
"""
|
||||
Base functionality for video operations.
|
||||
|
||||
Shared utilities for HTTP requests, video download, and common operations.
|
||||
"""
|
||||
|
||||
import requests
|
||||
from typing import Optional
|
||||
from fastapi import HTTPException
|
||||
|
||||
from utils.logger_utils import get_service_logger
|
||||
|
||||
logger = get_service_logger("wavespeed.generators.video.base")
|
||||
|
||||
|
||||
class VideoBase:
|
||||
"""Base class for video operations with shared functionality."""
|
||||
|
||||
def __init__(self, api_key: str, base_url: str, polling):
|
||||
"""Initialize video base.
|
||||
|
||||
Args:
|
||||
api_key: WaveSpeed API key
|
||||
base_url: WaveSpeed API base URL
|
||||
polling: WaveSpeedPolling instance for async operations
|
||||
"""
|
||||
self.api_key = api_key
|
||||
self.base_url = base_url
|
||||
self.polling = polling
|
||||
|
||||
def _get_headers(self) -> dict:
|
||||
"""Get HTTP headers for API requests."""
|
||||
return {
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": f"Bearer {self.api_key}",
|
||||
}
|
||||
|
||||
def _download_video(self, video_url: str, timeout: int = 180) -> bytes:
|
||||
"""Download video from URL.
|
||||
|
||||
Args:
|
||||
video_url: URL to download video from
|
||||
timeout: Request timeout in seconds
|
||||
|
||||
Returns:
|
||||
bytes: Video bytes
|
||||
|
||||
Raises:
|
||||
HTTPException: If download fails
|
||||
"""
|
||||
logger.info(f"[WaveSpeed] Downloading video from: {video_url}")
|
||||
video_response = requests.get(video_url, timeout=timeout)
|
||||
|
||||
if video_response.status_code != 200:
|
||||
raise HTTPException(
|
||||
status_code=502,
|
||||
detail={
|
||||
"error": "Failed to download video",
|
||||
"status_code": video_response.status_code,
|
||||
"response": video_response.text[:200],
|
||||
}
|
||||
)
|
||||
|
||||
return video_response.content
|
||||
|
||||
def _extract_video_url(self, outputs: list) -> Optional[str]:
|
||||
"""Extract video URL from outputs array.
|
||||
|
||||
Args:
|
||||
outputs: Array of outputs (can be strings or dicts)
|
||||
|
||||
Returns:
|
||||
Optional[str]: Video URL if found, None otherwise
|
||||
"""
|
||||
if not outputs:
|
||||
return None
|
||||
|
||||
output = outputs[0]
|
||||
if isinstance(output, str):
|
||||
return output if output.startswith("http") else None
|
||||
elif isinstance(output, dict):
|
||||
return output.get("url") or output.get("video_url")
|
||||
|
||||
return None
|
||||
Reference in New Issue
Block a user