Spaces:
Running
on
T4
Running
on
T4
Commit
·
033a45d
1
Parent(s):
078d18a
added authorization
Browse files
app.py
CHANGED
|
@@ -12,8 +12,9 @@ import insightface
|
|
| 12 |
from insightface.app import FaceAnalysis
|
| 13 |
from huggingface_hub import hf_hub_download
|
| 14 |
|
| 15 |
-
from fastapi import FastAPI, UploadFile, File, HTTPException, Response
|
| 16 |
from fastapi.responses import RedirectResponse
|
|
|
|
| 17 |
from pydantic import BaseModel
|
| 18 |
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorGridFSBucket
|
| 19 |
from bson import ObjectId
|
|
@@ -127,6 +128,17 @@ async def shutdown_db():
|
|
| 127 |
client.close()
|
| 128 |
logger.info("MongoDB connection closed")
|
| 129 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
# -------------------------------------------------
|
| 131 |
# Lock for face swap
|
| 132 |
# -------------------------------------------------
|
|
@@ -209,13 +221,13 @@ async def health():
|
|
| 209 |
return {"status": "healthy"}
|
| 210 |
|
| 211 |
@fastapi_app.post("/source")
|
| 212 |
-
async def upload_source(image: UploadFile = File(...)):
|
| 213 |
contents = await image.read()
|
| 214 |
file_id = await fs_bucket.upload_from_stream(image.filename, contents, metadata={"type": "source"})
|
| 215 |
return {"source_id": str(file_id)}
|
| 216 |
|
| 217 |
@fastapi_app.get("/targets")
|
| 218 |
-
async def list_targets():
|
| 219 |
files = []
|
| 220 |
async for file in database.fs.files.find({"metadata.type": "target", "metadata.predefined": True}):
|
| 221 |
files.append({
|
|
@@ -225,7 +237,7 @@ async def list_targets():
|
|
| 225 |
return {"targets": files}
|
| 226 |
|
| 227 |
@fastapi_app.post("/target")
|
| 228 |
-
async def upload_target(image: UploadFile = File(...)):
|
| 229 |
contents = await image.read()
|
| 230 |
file_id = await fs_bucket.upload_from_stream(image.filename, contents, metadata={"type": "target"})
|
| 231 |
return {"target_id": str(file_id)}
|
|
@@ -235,7 +247,7 @@ class FaceSwapRequest(BaseModel):
|
|
| 235 |
target_id: str
|
| 236 |
|
| 237 |
@fastapi_app.post("/faceswap")
|
| 238 |
-
async def perform_faceswap(request: FaceSwapRequest):
|
| 239 |
try:
|
| 240 |
src_stream = await fs_bucket.open_download_stream(ObjectId(request.source_id))
|
| 241 |
src_bytes = await src_stream.read()
|
|
@@ -266,7 +278,7 @@ async def perform_faceswap(request: FaceSwapRequest):
|
|
| 266 |
return {"result_id": str(result_id)}
|
| 267 |
|
| 268 |
@fastapi_app.get("/download/{result_id}")
|
| 269 |
-
async def download_result(result_id: str):
|
| 270 |
try:
|
| 271 |
stream = await fs_bucket.open_download_stream(ObjectId(result_id))
|
| 272 |
data = await stream.read()
|
|
|
|
| 12 |
from insightface.app import FaceAnalysis
|
| 13 |
from huggingface_hub import hf_hub_download
|
| 14 |
|
| 15 |
+
from fastapi import FastAPI, UploadFile, File, HTTPException, Response, Depends, Security
|
| 16 |
from fastapi.responses import RedirectResponse
|
| 17 |
+
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
| 18 |
from pydantic import BaseModel
|
| 19 |
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorGridFSBucket
|
| 20 |
from bson import ObjectId
|
|
|
|
| 128 |
client.close()
|
| 129 |
logger.info("MongoDB connection closed")
|
| 130 |
|
| 131 |
+
# -------------------------------------------------
|
| 132 |
+
# Auth Setup
|
| 133 |
+
# -------------------------------------------------
|
| 134 |
+
security = HTTPBearer()
|
| 135 |
+
API_SECRET_TOKEN = os.getenv("API_SECRET_TOKEN")
|
| 136 |
+
|
| 137 |
+
def verify_token(credentials: HTTPAuthorizationCredentials = Security(security)):
|
| 138 |
+
if credentials.credentials != API_SECRET_TOKEN:
|
| 139 |
+
raise HTTPException(status_code=401, detail="Invalid or missing token")
|
| 140 |
+
return credentials.credentials
|
| 141 |
+
|
| 142 |
# -------------------------------------------------
|
| 143 |
# Lock for face swap
|
| 144 |
# -------------------------------------------------
|
|
|
|
| 221 |
return {"status": "healthy"}
|
| 222 |
|
| 223 |
@fastapi_app.post("/source")
|
| 224 |
+
async def upload_source(image: UploadFile = File(...), token: str = Depends(verify_token)):
|
| 225 |
contents = await image.read()
|
| 226 |
file_id = await fs_bucket.upload_from_stream(image.filename, contents, metadata={"type": "source"})
|
| 227 |
return {"source_id": str(file_id)}
|
| 228 |
|
| 229 |
@fastapi_app.get("/targets")
|
| 230 |
+
async def list_targets(token: str = Depends(verify_token)):
|
| 231 |
files = []
|
| 232 |
async for file in database.fs.files.find({"metadata.type": "target", "metadata.predefined": True}):
|
| 233 |
files.append({
|
|
|
|
| 237 |
return {"targets": files}
|
| 238 |
|
| 239 |
@fastapi_app.post("/target")
|
| 240 |
+
async def upload_target(image: UploadFile = File(...), token: str = Depends(verify_token)):
|
| 241 |
contents = await image.read()
|
| 242 |
file_id = await fs_bucket.upload_from_stream(image.filename, contents, metadata={"type": "target"})
|
| 243 |
return {"target_id": str(file_id)}
|
|
|
|
| 247 |
target_id: str
|
| 248 |
|
| 249 |
@fastapi_app.post("/faceswap")
|
| 250 |
+
async def perform_faceswap(request: FaceSwapRequest, token: str = Depends(verify_token)):
|
| 251 |
try:
|
| 252 |
src_stream = await fs_bucket.open_download_stream(ObjectId(request.source_id))
|
| 253 |
src_bytes = await src_stream.read()
|
|
|
|
| 278 |
return {"result_id": str(result_id)}
|
| 279 |
|
| 280 |
@fastapi_app.get("/download/{result_id}")
|
| 281 |
+
async def download_result(result_id: str, token: str = Depends(verify_token)):
|
| 282 |
try:
|
| 283 |
stream = await fs_bucket.open_download_stream(ObjectId(result_id))
|
| 284 |
data = await stream.read()
|