Enkacard / main.py
ambon's picture
Update main.py
14051b6 verified
raw
history blame
3.72 kB
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)