from fastapi import FastAPI, UploadFile, HTTPException from fastapi.responses import FileResponse import subprocess import os import shutil from pathlib import Path import uuid from fastapi.middleware.cors import CORSMiddleware app = FastAPI(title="Document Conversion API") # Create directories for file handling UPLOAD_DIR = Path("uploads") OUTPUT_DIR = Path("outputs") UPLOAD_DIR.mkdir(exist_ok=True) OUTPUT_DIR.mkdir(exist_ok=True) @app.post("/convert/") async def convert_document( file: UploadFile, output_format: str, filter_options: str = None ): try: # Generate unique filenames input_filename = f"{uuid.uuid4()}_{file.filename}" output_filename = f"{Path(input_filename).stem}.{output_format}" input_path = UPLOAD_DIR / input_filename output_path = OUTPUT_DIR / output_filename # Save uploaded file with open(input_path, "wb") as buffer: shutil.copyfileobj(file.file, buffer) # Prepare conversion command command = ["unoconvert"] if filter_options: command.extend(["--filter-options", filter_options]) command.extend([str(input_path), str(output_path)]) # Execute conversion process = subprocess.run( command, capture_output=True, text=True ) if process.returncode != 0: raise HTTPException( status_code=500, detail=f"Conversion failed: {process.stderr}" ) # Return converted file return FileResponse( path=output_path, filename=output_filename, media_type="application/octet-stream" ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) finally: # Cleanup if input_path.exists(): input_path.unlink() if output_path.exists(): output_path.unlink() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) from fastapi.staticfiles import StaticFiles app.mount("/", StaticFiles(directory="static/ui", html=True), name="index") @app.get("/health") async def health_check(): return {"status": "healthy"}