Enkacard / main.py
ambon's picture
Update main.py
6df42e3 verified
from enkacard import encbanner
import asyncio
import os
import concurrent.futures
# from enkanetwork import EnkaNetworkAPI
from fastapi import FastAPI
from io import BytesIO
import enkanetwork
from fastapi.responses import (
JSONResponse,
)
import enkacard
import uvicorn
import requests
# client = EnkaNetworkAPI()
# import asyncio
# async def card():
# print("cret")
# async with encbanner.ENC(uid = "811455610") as encard:
# print("creting")
# return await encard.creat()
# result = asyncio.run(card())
# print(result)
# data_dir = "/tmp/data"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# data_dir = "/tmp/langs"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# async def main():
# async with client:
# await client.update_assets(lang = ["EN", "CHT"], path="/tmp")
# asyncio.run(main())
app = FastAPI()
# app = FastAPI(lifespan=lifespan)
async def card(id, designtype):
async with encbanner.ENC(uid = str(id)) as encard:
return await encard.creat(template = (2 if str(designtype) == "2" else 1))
@app.get("/{id}") # Correct route definition without prefix
async def characters(id: int, design: str = "1"): # Use async and await
try:
# characters = []
result = await card(id, design) # Use await instead of asyncio.run()
print(result)
characters = process_images(result)
print(characters)
# Return valid JSON response using FastAPI's JSONResponse
return JSONResponse(content={'response': characters})
except enkanetwork.exception.VaildateUIDError:
return JSONResponse(content={'error': 'Invalid UID. Please check your UID.'}, status_code=400)
except enkacard.enc_error.ENCardError:
return JSONResponse(content={'error': 'Enable display of the showcase in the game or add characters there.'}, status_code=400)
except Exception as e:
return JSONResponse(content={'error': 'UNKNOWN ERR: ' + str(e)}, status_code=500)
@app.get("/")
def hello_world():
return 'AMERICA YA HALLO!!'
# @app.route("/update_char")
# def upload():
# data_dir = "/tmp/data"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# data_dir = "/tmp/langs"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# asyncio.run(update_genshin())
# return 'Update smth ig!!'
def upload_image(data):
print(data)
url = "https://fighter-programmer-uploader.hf.space/upload"
files = {'file': ('file', data, "image/png")}
response = requests.post(url, files=files)
if response.status_code != 200:
raise Exception(f"HTTP Error: {response.status_code}")
try:
body = response.json()
if body["url"]:
return body["url"]
else:
raise Exception(f"Telegraph error: {body.get('error', 'Unknown error')}")
except (ValueError, KeyError, IndexError) as e:
raise Exception(f"Failed to parse response: {str(e)}")
def process_image(dt):
with BytesIO() as byte_io:
dt.card.save(byte_io, "PNG")
byte_io.seek(0)
image_url = upload_image(byte_io)
return {
"name": dt.name,
"url": image_url
}
def process_images(result):
characters = []
with concurrent.futures.ThreadPoolExecutor() as executor:
# Execute image uploads in parallel
futures = [executor.submit(process_image, dt) for dt in result.card]
for future in concurrent.futures.as_completed(futures):
try:
characters.append(future.result())
except Exception as e:
print(f"Error processing image: {e}")
return characters
if __name__ == "__main__":
# data_dir = "/tmp/data"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# data_dir = "/tmp/langs"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# asyncio.run(update_genshin())
uvicorn.run("main:app", host="0.0.0.0", port=7860, workers=8, timeout_keep_alive=60000)
# import enkacard
# import enkacard.encbanner
# import enkanetwork
# import asyncio
# import requests
# from io import BytesIO
# from enkanetwork import EnkaNetworkAPI
# import os
# from contextlib import asynccontextmanager
# from fastapi import FastAPI
# from fastapi.responses import (
# JSONResponse,
# )
# from enkacard import enkatools
# import uvicorn
# enka_update = EnkaNetworkAPI()
# async def update_genshin():
# try:
# async with enka_update:
# await enka_update.update_assets(path="/tmp", lang=["EN"])
# # lang=["EN"],
# print("Finished update")
# except Exception as e:
# print(f"Update failed: {e}")
# async def card(id, designtype):
# async with enkacard.encbanner.ENC(uid = str(id)) as encard:
# return await encard.creat(template = (2 if str(designtype) == "2" else 1))
# @asynccontextmanager
# async def lifespan(app: FastAPI):
# data_dir = "/tmp/data"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# data_dir = "/tmp/langs"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# await update_genshin()
# yield
# print("Goodbye")
# app = FastAPI()
# # app = FastAPI(lifespan=lifespan)
# @app.get("/{id}") # Correct route definition without prefix
# async def characters(id: int, design: str = "1"): # Use async and await
# try:
# characters = []
# result = await card(id, design) # Use await instead of asyncio.run()
# for dt in result.card:
# with BytesIO() as byte_io:
# dt.card.save(byte_io, "PNG")
# byte_io.seek(0)
# image_url = upload_image(byte_io)
# characters.append({
# "name": dt.name,
# "url": image_url
# })
# # Return valid JSON response using FastAPI's JSONResponse
# return JSONResponse(content={'response': characters})
# except enkanetwork.exception.VaildateUIDError:
# return JSONResponse(content={'error': 'Invalid UID. Please check your UID.'}, status_code=400)
# except enkacard.enc_error.ENCardError:
# return JSONResponse(content={'error': 'Enable display of the showcase in the game or add characters there.'}, status_code=400)
# except Exception as e:
# return JSONResponse(content={'error': 'UNKNOWN ERR: ' + str(e)}, status_code=500)
# @app.get("/")
# def hello_world():
# return 'AMERICA YA HALLO!!'
# # @app.route("/update_char")
# # def upload():
# # data_dir = "/tmp/data"
# # if not os.path.exists(data_dir):
# # os.makedirs(data_dir)
# # data_dir = "/tmp/langs"
# # if not os.path.exists(data_dir):
# # os.makedirs(data_dir)
# # asyncio.run(update_genshin())
# # return 'Update smth ig!!'
# def upload_image(data):
# url = "https://telegra.ph/upload"
# files = {'file': ('file', data, "image/png")}
# response = requests.post(url, files=files)
# if response.status_code != 200:
# raise Exception(f"HTTP Error: {response.status_code}")
# try:
# body = response.json()
# if isinstance(body, list) and 'src' in body[0]:
# return "https://telegra.ph" + body[0]['src']
# else:
# raise Exception(f"Telegraph error: {body.get('error', 'Unknown error')}")
# except (ValueError, KeyError, IndexError) as e:
# raise Exception(f"Failed to parse response: {str(e)}")
# if __name__ == "__main__":
# data_dir = "/tmp/data"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# data_dir = "/tmp/langs"
# if not os.path.exists(data_dir):
# os.makedirs(data_dir)
# asyncio.run(update_genshin())
# uvicorn.run("main:app", host="0.0.0.0", port=7860, workers=8, timeout_keep_alive=600)