Devang1290
feat: deploy News Whisper on-demand search API (FastAPI + Docker)
2cb327c
import os
import cloudinary
import cloudinary.uploader
from pathlib import Path
import sys
sys.path.append(str(Path(__file__).resolve().parent.parent.parent))
from backend.core.logger import logger
from backend.core.config import config
# Lazy initialize Cloudinary config
_is_configured = False
def _configure_cloudinary():
global _is_configured
if not _is_configured:
if not config.CLOUDINARY_CLOUD_NAME:
logger.warning("Cloudinary config missing, skipping Cloudinary uploads.")
return False
cloudinary.config(
cloud_name=config.CLOUDINARY_CLOUD_NAME,
api_key=config.CLOUDINARY_API_KEY,
api_secret=config.CLOUDINARY_API_SECRET,
secure=True
)
_is_configured = True
return True
def upload_file(file_path: str, folder_path: str, resource_type: str = "auto") -> str:
"""
Uploads a local file to Cloudinary.
Returns the secure URL on success, or an empty string on failure/if missing.
"""
if not _configure_cloudinary():
return ""
try:
if not os.path.exists(file_path):
logger.error(f"File not found for Cloudinary upload: {file_path}")
return ""
file_name = Path(file_path).stem
folder_path = folder_path.strip("/")
logger.info(f"Uploading to Cloudinary: {folder_path}/{file_name}")
response = cloudinary.uploader.upload(
file_path,
folder=folder_path,
public_id=file_name,
resource_type=resource_type,
use_filename=True,
unique_filename=False,
overwrite=True
)
url = response.get('secure_url', "")
if url:
logger.success(f"Upload successful: {url}")
return url
except Exception as e:
logger.error(f"Cloudinary upload failed: {str(e)}")
return ""