import asyncio from typing import Optional from app.config import settings from app.internal.logger import logger async def upload_audio(data: bytes, filename: str) -> Optional[str]: """Upload audio bytes to GCS and return the public URL, or None if disabled.""" if not settings.gcs_bucket: logger.info("GCS_BUCKET not configured — skipping audio upload.") return None def _upload() -> str: from google.cloud import storage if settings.gcp_credentials_path: client = storage.Client.from_service_account_json(settings.gcp_credentials_path) else: client = storage.Client() bucket = client.bucket(settings.gcs_bucket) blob = bucket.blob(f"calls/{filename}") blob.upload_from_string(data, content_type="audio/mpeg") blob.make_public() return blob.public_url try: url = await asyncio.to_thread(_upload) logger.info(f"Audio uploaded: {url}") return url except Exception as e: logger.error(f"GCS upload failed: {e}") return None