52 lines
No EOL
1.8 KiB
Python
52 lines
No EOL
1.8 KiB
Python
from fastapi import APIRouter, Request
|
|
from fastapi.responses import HTMLResponse
|
|
import config
|
|
import api_client
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/viewer/list", response_class=HTMLResponse)
|
|
async def viewer_list(request: Request):
|
|
"""
|
|
Liste les nuages de points — retourne uniquement le contenu intérieur
|
|
(cloud_list_body.html) pour injection dans #cloud-list-body.
|
|
La card enveloppe et le bouton Actualiser vivent dans index.html, pas ici.
|
|
"""
|
|
pointclouds = []
|
|
|
|
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():
|
|
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": {},
|
|
"created": item.stat().st_ctime,
|
|
})
|
|
|
|
return request.app.state.templates.TemplateResponse(
|
|
"partials/cloud_list_body.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},
|
|
) |