diff --git a/default.jpg b/default.jpg new file mode 100644 index 0000000..cf01222 Binary files /dev/null and b/default.jpg differ diff --git a/main.py b/main.py index fe49599..0755090 100644 --- a/main.py +++ b/main.py @@ -1,10 +1,16 @@ +import io +import traceback import uuid +import PIL.Image +from httpx import AsyncClient from fastapi import FastAPI -from starlette.responses import RedirectResponse +from starlette.responses import RedirectResponse, StreamingResponse from utils import gen_url, get_auth app = FastAPI() +with open("default.jpg", "rb") as f: + default_jpg = io.BytesIO(f.read()) @app.get('/gen') @@ -18,6 +24,30 @@ async def gen( return RedirectResponse(gen_url(username, host, back_host, session)) +@app.get('/1.jpg') +async def jpg( + *, + url: str, +) -> StreamingResponse: + if "/proxy/avatar" not in url: + return StreamingResponse(default_jpg, media_type="image/jpg") + url = url.replace("/proxy/avatar.webp", "/proxy/avatar.png") + # jpg png webp gif to jpg + try: + async with AsyncClient() as client: + print(f"get jpg {url}") + r = await client.get(url) + remote = PIL.Image.open(io.BytesIO(r.content)) + remote = remote.convert("RGB") + file_like = io.BytesIO() + remote.save(file_like, "jpeg") + file_like.seek(0) + return StreamingResponse(file_like, media_type="image/jpg") + except Exception: + traceback.print_exc() + return StreamingResponse(default_jpg, media_type="image/jpg") + + @app.get("/{username}/{host}") async def back_to_telegram( *, diff --git a/requirements.txt b/requirements.txt index fbb816c..0cbd8ef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ httpx==0.23.3 fastapi~=0.85.2 starlette~=0.20.4 uvicorn~=0.18.3 +pillow diff --git a/run.py b/run.py new file mode 100644 index 0000000..90f4477 --- /dev/null +++ b/run.py @@ -0,0 +1,6 @@ +from main import app + + +if __name__ == "__main__": + import uvicorn + uvicorn.run(app)