Spaces:
Sleeping
Sleeping
File size: 1,920 Bytes
f4003e8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import os
from fastapi import FastAPI, Request, HTTPException
from concurrent.futures import ProcessPoolExecutor
from typing import List, Optional
from commonmeta import Metadata
from pydantic import BaseModel
app = FastAPI()
executor = ProcessPoolExecutor(max_workers=os.cpu_count())
def parse(string: str, via: str = None, to: str = None, **kwargs):
try:
metadata = Metadata(string=string, via=via, **kwargs)
if not metadata.is_valid:
raise ValueError(f"Error in parsing metadata, please verify the format.")
except Exception as e:
raise ValueError(f"Metadata fetch error: {str(e)}")
try:
parsed_metadata = metadata.write(to=to)
return parsed_metadata
except Exception as e:
raise ValueError(f"Metadata write error: {str(e)}")
def process_single(args):
string, via, to, kwargs = args
try:
return parse(string, via=via, to=to, **kwargs)
except ValueError as e:
return {"error": str(e), "string": string}
@app.get("/parse")
async def parse_one(request: Request, string: str, to: str = None, via: str = None):
kwargs = dict(request.query_params)
kwargs.pop('string', None)
kwargs.pop('to', None)
kwargs.pop('via', None)
try:
parsed_metadata = parse(string, via=via, to=to, **kwargs)
return {'data': parsed_metadata}
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
class BatchParseRequest(BaseModel):
strings: str = ""
to: str = None
via: str = None
@app.post("/parse_batch")
async def batch_parse(payload: BatchParseRequest):
kwargs = payload.dict()
strings = kwargs.pop("strings").split(",")
to = kwargs.pop("to", None)
via = kwargs.pop("via", None)
task_args = [(s, via, to, kwargs) for s in strings]
results = list(executor.map(process_single, task_args))
return {"batch": results}
|