from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse import config import api_client from pathlib import Path import shutil import os from datetime import datetime router = APIRouter() @router.get("/viewer/list", response_class=HTMLResponse) async def viewer_list(request: Request): """Liste les nuages de points disponibles - Endpoint autonome frontend""" pointclouds = [] # Récupérer la liste des nuages directement depuis le système de fichiers ept_dir = Path(config.EPT_DIR) if ept_dir.exists(): for item in sorted(ept_dir.iterdir(), key=lambda x: x.stat().st_ctime, reverse=True): if item.is_dir(): # Lire le manifeste manifest_path = item / "manifest.json" manifest = {} if manifest_path.exists(): try: manifest = {"ept_dir": item.name} except: pass # Calculer la taille et le nombre de fichiers total_size = 0 file_count = 0 for f in item.rglob("*"): if f.is_file(): total_size += f.stat().st_size file_count += 1 if file_count > 0: pointclouds.append({ "id": item.name, "size_mb": round(total_size / (1024 * 1024), 2), "file_count": file_count, "manifest": manifest, "created": item.stat().st_ctime, }) return request.app.state.templates.TemplateResponse( "partials/cloud_list.html", {"request": request, "pointclouds": pointclouds}, ) @router.get("/viewer/{pc_id}", response_class=HTMLResponse) async def viewer(request: Request, pc_id: str): embed_url = f"{config.POTREE_URL}/viewer-embed/{pc_id}" return request.app.state.templates.TemplateResponse( "partials/viewer.html", {"request": request, "pc_id": pc_id, "embed_url": embed_url}, )