From 45266c8b51f782199ff018ae73eebfbd224979b8 Mon Sep 17 00:00:00 2001 From: mhdzumair Date: Tue, 24 Dec 2024 21:43:55 +0530 Subject: [PATCH] Fallback to cinemeta poster if failed to generate poster for imdb title --- api/main.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/api/main.py b/api/main.py index 0ff0c6d..65ae411 100644 --- a/api/main.py +++ b/api/main.py @@ -732,6 +732,18 @@ async def encrypt_user_data( return {"status": "success", "encrypted_str": encrypted_str} +def raise_poster_error(meta_id: str, error_message: str): + if meta_id.startswith("tt"): + # Fall back to Cinemeta poster + return RedirectResponse( + f"https://live.metahub.space/poster/small/{meta_id}/img", status_code=302 + ) + raise HTTPException( + status_code=404, + detail=f"Failed to create poster for {meta_id}: {error_message}", + ) + + @app.get("/poster/{catalog_type}/{mediafusion_id}.jpg", tags=["poster"]) @wrappers.exclude_rate_limit async def get_poster( @@ -757,10 +769,10 @@ async def get_poster( mediafusion_data = await crud.get_tv_data_by_id(mediafusion_id) if not mediafusion_data: - raise HTTPException(status_code=404, detail="MediaFusion ID not found.") + return raise_poster_error(mediafusion_id, "MediaFusion ID not found.") if mediafusion_data.is_poster_working is False or not mediafusion_data.poster: - raise HTTPException(status_code=404, detail="Poster not found.") + return raise_poster_error(mediafusion_id, "Poster not found.") try: image_byte_io = await poster.create_poster(mediafusion_data) @@ -772,23 +784,20 @@ async def get_poster( return StreamingResponse(image_byte_io, media_type="image/jpeg") except asyncio.TimeoutError: - logging.error("Poster generation timeout.") - raise HTTPException(status_code=404, detail="Poster generation timeout.") + return raise_poster_error(mediafusion_id, "Poster generation timeout.") except aiohttp.ClientResponseError as e: - logging.error(f"Failed to create poster: {e}, status: {e.status}") - if e.status != 404: - raise HTTPException(status_code=404, detail="Failed to create poster.") + if e.status == 404 and catalog_type != "events": + mediafusion_data.is_poster_working = False + await mediafusion_data.save() + return raise_poster_error(mediafusion_id, f"Poster generation failed: {e}") except (aiohttp.ClientConnectorError, aiohttp.ServerDisconnectedError) as e: - logging.error(f"Failed to create poster: {e}") + return raise_poster_error(mediafusion_id, f"Poster generation failed: {e}") except Exception as e: logging.error( f"Unexpected error while creating poster: {mediafusion_data.poster} {e}", exc_info=True, ) - mediafusion_data.is_poster_working = False - if catalog_type != "events": - await mediafusion_data.save() - raise HTTPException(status_code=404, detail="Failed to create poster.") + return raise_poster_error(mediafusion_id, f"Unexpected error: {e}") @app.get(