|
|
from fastapi import FastAPI, HTTPException |
|
|
from pydantic import BaseModel |
|
|
import asyncio |
|
|
from typing import List, Union |
|
|
import uvicorn |
|
|
import logging |
|
|
from datetime import datetime |
|
|
import pytz |
|
|
from main import main |
|
|
|
|
|
|
|
|
logging.basicConfig(filename="dataExtractOCR.log", filemode='w') |
|
|
logger = logging.getLogger("NID") |
|
|
logger.setLevel(logging.DEBUG) |
|
|
file_handler = logging.FileHandler("dataExtractOCR.log") |
|
|
logger.addHandler(file_handler) |
|
|
|
|
|
total_done = 0 |
|
|
total_error = 0 |
|
|
|
|
|
app = FastAPI() |
|
|
|
|
|
class Item(BaseModel): |
|
|
url: str |
|
|
|
|
|
def get_bd_time(): |
|
|
bd_timezone = pytz.timezone("Asia/Dhaka") |
|
|
time_now = datetime.now(bd_timezone) |
|
|
current_time = time_now.strftime("%I:%M:%S %p") |
|
|
return current_time |
|
|
|
|
|
async def process_item(item: Item): |
|
|
try: |
|
|
result = await main(item.url) |
|
|
return result |
|
|
except Exception as e: |
|
|
raise HTTPException(status_code=500, detail=f"Error in process_item: {str(e)}") |
|
|
|
|
|
async def process_items(items: Union[Item, List[Item]]): |
|
|
try: |
|
|
if isinstance(items, list): |
|
|
coroutines = [process_item(item) for item in items] |
|
|
results = await asyncio.gather(*coroutines) |
|
|
else: |
|
|
results = await process_item(items) |
|
|
return results |
|
|
except Exception as e: |
|
|
raise HTTPException(status_code=500, detail=f"Error in process_items: {str(e)}") |
|
|
|
|
|
@app.get("/status") |
|
|
async def status(): |
|
|
try: |
|
|
return "Server is running" |
|
|
except Exception as e: |
|
|
raise HTTPException(status_code=500, detail=f"Status Error: {str(e)}") |
|
|
|
|
|
@app.post("/ocr") |
|
|
async def create_items(items: Union[Item, List[Item]]): |
|
|
global total_done, total_error |
|
|
try: |
|
|
total_done += 1 |
|
|
results = await process_items(items) |
|
|
if results: |
|
|
logger.info(f"Time: {get_bd_time()}, Successful Execution: {total_done}, BODY: {items}, Result: {results}") |
|
|
return {"extractedData": results} |
|
|
except Exception as e: |
|
|
total_error += 1 |
|
|
logger.info(f"Time: {get_bd_time()}, Failed Execution: {total_error}, BODY: {items}") |
|
|
logger.error(str(e)) |
|
|
raise HTTPException(status_code=500, detail=f"create_items Error: {str(e)}") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
uvicorn.run(app, host="127.0.0.1", port=8080) |
|
|
|