from typing import Any import requests from fastapi import APIRouter, HTTPException from app.api.deps import CurrentUser _FOLDER_USER_AGENT = ( "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/98.0.4758.102 Safari/537.36" ) router = APIRouter(prefix="/gdrive", tags=["gdrive"]) def _serialize_node(node: Any) -> dict: return { "id": node.id, "name": node.name, "type": node.type, "children": [_serialize_node(c) for c in node.children], } @router.get("/folder/{folder_id}") def browse_gdrive_folder( folder_id: str, current_user: CurrentUser, ) -> Any: """Return the recursive file/folder tree for a public Google Drive folder.""" from gdown.download_folder import _download_and_parse_google_drive_link # type: ignore[import] sess = requests.Session() sess.headers["User-Agent"] = _FOLDER_USER_AGENT try: tree = _download_and_parse_google_drive_link( sess=sess, folder_id=folder_id, quiet=True, ) except Exception as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return _serialize_node(tree)