news-whisper-api / backend /utils /cloudinary_utils.py
Devang1290
feat: deploy News Whisper on-demand search API (FastAPI + Docker)
2cb327c
"""
Cloudinary Upload Utility
=========================
Uploads files (audio, JSON) to Cloudinary, maintaining folder structure.
Used by:
- backend.text_to_speech.english_tts (upload MP3/WAV audio files)
- backend.text_to_speech.hindi_tts (upload MP3 audio files)
- backend.summarization.english_summary (upload summarized JSON)
- backend.web_scraping.news_scrape (upload scraped JSON)
Configuration (all required in .env):
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
Usage:
from backend.utils.cloudinary_utils import upload_to_cloudinary
result = upload_to_cloudinary(
file_path="/path/to/audio.mp3",
folder_path="audios/english/categories/sports/24_mar_10_37_pm",
resource_type="video" # Cloudinary uses "video" for audio files
)
if result:
print(result['secure_url'])
"""
import os
import cloudinary
import cloudinary.uploader
from dotenv import load_dotenv
from pathlib import Path
load_dotenv()
cloudinary.config(
cloud_name=os.getenv('CLOUDINARY_CLOUD_NAME'),
api_key=os.getenv('CLOUDINARY_API_KEY'),
api_secret=os.getenv('CLOUDINARY_API_SECRET'),
secure=True
)
def upload_to_cloudinary(file_path: str, folder_path: str, resource_type: str = "auto"):
"""Upload a file to Cloudinary, preserving the specified folder layout.
Args:
file_path: Absolute path to the local file.
folder_path: Cloudinary folder path (e.g. "audios/english/categories/sports").
resource_type: One of "auto", "image", "video", "raw".
Use "video" for audio files, "raw" for JSON.
Returns:
dict with Cloudinary response (contains 'secure_url'), or None on failure.
"""
try:
if not os.path.exists(file_path):
print(f"File not found: {file_path}")
return None
file_name = Path(file_path).stem
folder_path = folder_path.strip("/")
print(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
)
print(f"Upload successful: {response.get('secure_url')}")
return response
except Exception as e:
print(f"Cloudinary upload failed: {str(e)}")
return None