File size: 1,648 Bytes
966ebb2
 
75e20e0
966ebb2
75e20e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
966ebb2
 
75e20e0
 
 
 
 
 
 
 
 
 
 
966ebb2
75e20e0
 
 
966ebb2
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
import httpx
from fastapi.responses import StreamingResponse
from fastapi import HTTPException

client = httpx.AsyncClient(timeout=10.0)

# async def get_manga_page_stream(target_url: str):
#     try:
#         stream = client.stream("GET", target_url)
#         response = await stream.__aenter__() 
#     except httpx.RequestError:
#         raise HTTPException(status_code=502, detail="Upstream request failed")

#     if response.status_code != 200:
#         await stream.__aexit__(None, None, None)
#         raise HTTPException(status_code=response.status_code, detail="Image not found")

#     async def generator():
#         try:
#             async for chunk in response.aiter_bytes():
#                 yield chunk
#         finally:
#             await stream.__aexit__(None, None, None)  # ensure cleanup

#     return StreamingResponse(
#         generator(),
#         media_type=response.headers.get("Content-Type", "image/jpeg"),
#     )

async def get_manga_page_stream(target_url: str):
    req = client.build_request("GET", target_url)
    
    try:
        response = await client.send(req, stream=True)
    except httpx.RequestError:
        raise HTTPException(status_code=502, detail="Upstream unreachable")

    if response.status_code != 200:
        await response.aclose() # Must close if we aren't streaming
        raise HTTPException(status_code=response.status_code, detail="MangaDex error")

    return StreamingResponse(
        response.aiter_bytes(),
        media_type=response.headers.get("Content-Type", "image/jpeg"),
        background=response.aclose, # Ensures connection closes after stream finish
    )