| # python/src/server/utils/google_storage.py | |
| import asyncio | |
| import logging | |
| from typing import Any | |
| logger = logging.getLogger(__name__) | |
| class GoogleStorageHandler: | |
| """ | |
| Physical Handler for Google Files API (Phase 4.6.46 Hardened). | |
| Specialized in large file uploads (20MB+) with async polling. | |
| """ | |
| async def upload_and_wait(client: Any, path: str, display_name: str = "Audio File") -> Any: | |
| """ | |
| Uploads a file and polls until its state is 'ACTIVE'. | |
| Ensures resilience for Alice's long field recordings. | |
| """ | |
| try: | |
| # 1. Physical Upload | |
| uploaded_file = client.files.upload(path=path) | |
| logger.info(f"GoogleStorage: File {uploaded_file.name} ({display_name}) uploaded. Polling...") | |
| # 2. Resilience Polling (Restored from 4/16 golden standard) | |
| max_retries = 45 # Increased to 90s for extra large files | |
| poll_interval = 2 | |
| for i in range(max_retries): | |
| file_info = client.files.get(name=uploaded_file.name) | |
| state = file_info.state.name | |
| if state == "ACTIVE": | |
| logger.info(f"GoogleStorage: File {uploaded_file.name} is ACTIVE after {i * poll_interval}s.") | |
| return file_info | |
| elif state == "FAILED": | |
| raise Exception(f"Google Files API reported FAILURE for {uploaded_file.name}") | |
| await asyncio.sleep(poll_interval) | |
| raise TimeoutError(f"GoogleStorage: Timeout waiting for {display_name} to become ACTIVE.") | |
| except Exception as e: | |
| logger.error(f"GoogleStorage: Upload/Poll failed: {e}") | |
| raise e | |