Hateshield-bn / main.py
sgAtdbd's picture
updated frontend new api link
e06c835 verified
from fastapi import FastAPI, HTTPException, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, HttpUrl
from typing import Optional
import uvicorn
from services.analyzer import analyze_content
from services.text_extractor import extract_from_url, extract_from_document
app = FastAPI(
title="HateShield-BN API",
description="Bilingual Hate Speech Detection System",
version="1.0.0"
)
# CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:5173", "http://localhost:3000","https://hate-shield-bn-frontend.vercel.app"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Request models
class TextRequest(BaseModel):
text: str
class URLRequest(BaseModel):
url: HttpUrl
# Routes
@app.get("/")
async def root():
return {
"message": "HateShield-BN API is running!",
"version": "1.0.0",
"endpoints": {
"text": "/api/analyze/text",
"url": "/api/analyze/url",
"document": "/api/analyze/document"
}
}
@app.post("/api/analyze/text")
async def analyze_text(request: TextRequest):
"""Analyze text for hate speech"""
try:
if not request.text or len(request.text.strip()) == 0:
raise HTTPException(status_code=400, detail="Text cannot be empty")
result = await analyze_content(request.text)
return result
except Exception as e:
print(f"Error analyzing text: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.post("/api/analyze/url")
async def analyze_url(request: URLRequest):
"""Analyze content from URL"""
try:
# Note: extract_from_url is now synchronous
text = extract_from_url(str(request.url))
if not text:
raise HTTPException(status_code=400, detail="Could not extract text from URL")
result = await analyze_content(text)
return result
except HTTPException:
raise
except Exception as e:
print(f"Error analyzing URL: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.post("/api/analyze/document")
async def analyze_document(file: UploadFile = File(...)):
"""Analyze uploaded document"""
try:
# Check file type
allowed_types = [".pdf", ".docx", ".txt"]
file_ext = f".{file.filename.split('.')[-1].lower()}"
if file_ext not in allowed_types:
raise HTTPException(
status_code=400,
detail=f"File type {file_ext} not supported. Allowed: {', '.join(allowed_types)}"
)
# Read file content
content = await file.read()
# Note: extract_from_document is now synchronous
text = extract_from_document(content, file_ext)
if not text:
raise HTTPException(status_code=400, detail="Could not extract text from document")
result = await analyze_content(text)
return result
except HTTPException:
raise
except Exception as e:
print(f"Error analyzing document: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
async def health_check():
return {"status": "healthy"}
if __name__ == "__main__":
uvicorn.run(
"main:app",
host="0.0.0.0",
port=8000,
reload=True
)