custom-gpt / src /config /cloudinary.py
ABAO77's picture
Upload 65 files
744b763 verified
import os
import cloudinary
import cloudinary.uploader
import cloudinary.api
from cloudinary.utils import cloudinary_url
from typing import Dict, Any, Optional, Union, List, Tuple
import os
# Configuration
def configure_cloudinary() -> None:
"""Configure Cloudinary with credentials from environment variables or directly."""
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,
)
# Initialize configuration
configure_cloudinary()
def upload_image(file_path: str, **options) -> Dict[str, Any]:
"""Upload an image to Cloudinary and return the result.
Args:
file_path: Local path to the image file or URL of an image
**options: Additional options for the upload
- public_id: Custom public ID for the image
- folder: Folder in Cloudinary to store the image
- resource_type: Type of resource ('image', 'video', 'raw', etc.)
- tags: List of tags to assign to the image
- transformation: Transformation to apply during upload
- format: Format to convert the image to
- overwrite: Whether to overwrite existing images with the same public_id
Returns:
Dictionary containing upload result with keys like 'public_id', 'secure_url', etc.
"""
# Set default options if not provided
if "resource_type" not in options:
options["resource_type"] = "image"
# Upload the image
result = cloudinary.uploader.upload(file_path, **options)
return result
def delete_image(public_id: str, **options) -> Dict[str, Any]:
"""Delete an image from Cloudinary.
Args:
public_id: Public ID of the image to delete
**options: Additional options for deletion
- resource_type: Type of resource ('image', 'video', 'raw', etc.)
- invalidate: Whether to invalidate CDN cache
Returns:
Dictionary containing the deletion result
"""
# Set default options if not provided
if "resource_type" not in options:
options["resource_type"] = "image"
# Delete the image
result = cloudinary.uploader.destroy(public_id, **options)
return result
def update_image(public_id: str, file_path: str, **options) -> Dict[str, Any]:
"""Update an existing image by uploading a new one with the same public_id.
Args:
public_id: Public ID of the image to update
file_path: Local path to the new image file or URL of an image
**options: Additional options for the upload
Returns:
Dictionary containing upload result
"""
# Ensure we're overwriting the existing image
options["public_id"] = public_id
options["overwrite"] = True
# Upload the new image with the same public_id
result = upload_image(file_path, **options)
return result
def get_image_url(public_id: str, **options) -> str:
"""Generate a URL for an image with optional transformations.
Args:
public_id: Public ID of the image
**options: Transformation options
- width: Width to resize to
- height: Height to resize to
- crop: Cropping method ('fill', 'fit', 'limit', 'thumb', 'crop', etc.)
- fetch_format: Format to deliver the image in ('auto', 'jpg', 'png', etc.)
- quality: Quality of the image ('auto', or 1-100)
- effect: Effects to apply
- gravity: How to position the image ('auto', 'face', 'center', etc.)
Returns:
URL string for the transformed image
"""
url, _ = cloudinary_url(public_id, **options)
return url
def list_images(prefix: Optional[str] = None, **options) -> Dict[str, Any]:
"""List images in your Cloudinary account.
Args:
prefix: Filter images by prefix
**options: Additional options for listing
- type: Resource type ('upload', 'private', etc.)
- max_results: Maximum number of results to return
- next_cursor: For pagination
- tags: Filter by tags
Returns:
Dictionary containing the list of images
"""
if prefix:
options["prefix"] = prefix
result = cloudinary.api.resources(**options)
return result