import os, json from google.oauth2.service_account import Credentials from googleapiclient.discovery import build from googleapiclient.http import MediaFileUpload SCOPES = ["https://www.googleapis.com/auth/drive.file"] def _get_env(name: str) -> str: v = os.getenv(name, "").strip() if not v: raise RuntimeError(f"Missing env secret: {name}") return v def _get_drive_service(): creds_json = _get_env("GOOGLE_SERVICE_ACCOUNT_JSON") info = json.loads(creds_json) creds = Credentials.from_service_account_info(info, scopes=SCOPES) return build("drive", "v3", credentials=creds, cache_discovery=False) def upload_file(local_path: str, filename: str, mime_type: str): folder_id = _get_env("DRIVE_FOLDER_ID") service = _get_drive_service() file_metadata = {"name": filename, "parents": [folder_id]} media = MediaFileUpload(local_path, mimetype=mime_type, resumable=True) created = service.files().create( body=file_metadata, media_body=media, fields="id, webViewLink" ).execute() file_id = created["id"] return { "driveFileId": file_id, "webViewLink": created.get("webViewLink"), "directDownloadLink": f"https://drive.google.com/uc?id={file_id}" }