From 8d2efd35ff210ae8157b1d5793fc5e2ddf6333bf Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Wed, 5 Feb 2025 04:56:53 +0300 Subject: [PATCH] Implement retry mechanism for FloodWait errors in RSS feed generation --- api_server.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/api_server.py b/api_server.py index b1aa513..c950937 100644 --- a/api_server.py +++ b/api_server.py @@ -426,18 +426,21 @@ async def get_rss_feed(channel: str, token: str | None = None, limit: int = 20): else: logger.info(f"Valid token for RSS feed: {token}") - try: - rss_content = await generate_channel_rss(channel, client=client.client, limit=limit) - return Response(content=rss_content, media_type="application/xml") - except ValueError as e: - error_message = f"Invalid parameters for RSS feed generation: {str(e)}" - logger.error(error_message) - raise HTTPException(status_code=400, detail=error_message) from e - except errors.FloodWait as e: - error_message = f"Too many requests for channel {channel}, wait {e.value} seconds" - logger.error(error_message) - raise HTTPException(status_code=429, detail=error_message) from e - except Exception as e: - error_message = f"Failed to generate RSS feed for channel {channel}: {str(e)}" - logger.error(error_message) - raise HTTPException(status_code=500, detail=error_message) from e + while True: + try: + rss_content = await generate_channel_rss(channel, client=client.client, limit=limit) + return Response(content=rss_content, media_type="application/xml") + except ValueError as e: + error_message = f"Invalid parameters for RSS feed generation: {str(e)}" + logger.error(error_message) + raise HTTPException(status_code=400, detail=error_message) from e + except errors.FloodWait as e: + wait_time = e.value + logger.warning(f"FloodWait detected for channel {channel}, waiting {wait_time} seconds") + await asyncio.sleep(wait_time) + logger.info(f"FloodWait finished for channel {channel}, retrying RSS feed generation") + continue + except Exception as e: + error_message = f"Failed to generate RSS feed for channel {channel}: {str(e)}" + logger.error(error_message) + raise HTTPException(status_code=500, detail=error_message) from e