from fastapi import FastAPI, File, UploadFile, HTTPException, Form from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles import requests import os import uuid import shutil from tempfile import NamedTemporaryFile app = FastAPI() # Mount a static directory to serve files STATIC_DIR = "/app/static" os.makedirs(STATIC_DIR, exist_ok=True) app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") # API endpoint for ChangeClothesAI CHANGE_CLOTHES_API = os.environ.get('URL') @app.post("/try-on/") async def try_on( human_img: UploadFile = File(...), garment_img: UploadFile = File(...), garment_desc: str = Form("dresses"), category: str = Form("dresses") ): try: # Generate unique filenames human_filename = f"{uuid.uuid4()}_{human_img.filename}" garment_filename = f"{uuid.uuid4()}_{garment_img.filename}" # Save files temporarily in the static directory human_path = os.path.join(STATIC_DIR, human_filename) garment_path = os.path.join(STATIC_DIR, garment_filename) try: # Save human image with open(human_path, "wb") as f: shutil.copyfileobj(human_img.file, f) # Save garment image with open(garment_path, "wb") as f: shutil.copyfileobj(garment_img.file, f) # Generate public URLs (assuming the Space is hosted at a public URL) # Replace YOUR_SPACE_URL with the actual Hugging Face Space URL base_url = "https://tejani-tryapi.hf.space" # e.g., https://your-username-your-space.hf.space human_url = f"{base_url}/static/{human_filename}" garment_url = f"{base_url}/static/{garment_filename}" # Prepare headers and data for the original API headers = { "accept": "*/*", "content-type": "multipart/form-data; boundary=----WebKitFormBoundary90rchhPtvEuSQa34" } data = ( '------WebKitFormBoundary90rchhPtvEuSQa34\r\n' f'Content-Disposition: form-data; name="humanImg"\r\n\r\n{human_url}\r\n' '------WebKitFormBoundary90rchhPtvEuSQa34\r\n' f'Content-Disposition: form-data; name="garment"\r\n\r\n{garment_url}\r\n' '------WebKitFormBoundary90rchhPtvEuSQa34\r\n' f'Content-Disposition: form-data; name="garmentDesc"\r\n\r\n{garment_desc}\r\n' '------WebKitFormBoundary90rchhPtvEuSQa34\r\n' f'Content-Disposition: form-data; name="category"\r\n\r\n{category}\r\n' '------WebKitFormBoundary90rchhPtvEuSQa34--\r\n' ) # Call the ChangeClothesAI API response = requests.post(CHANGE_CLOTHES_API, headers=headers, data=data) # Check if the API call was successful if response.status_code != 200: raise HTTPException(status_code=response.status_code, detail="Error calling ChangeClothesAI API") # Delete temporary files #os.remove(human_path) print(human_url) #os.remove(garment_path) return response.json() except Exception as e: # Clean up in case of any errors if os.path.exists(human_path): os.remove(human_path) if os.path.exists(garment_path): os.remove(garment_path) raise HTTPException(status_code=500, detail=str(e)) finally: human_img.file.close() garment_img.file.close() except Exception as e: raise HTTPException(status_code=500, detail=f"Error processing files: {str(e)}") if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=7860)