From 1464ea326ef5699d1f0185860571abd78ac56958 Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Sat, 13 Sep 2025 00:06:36 +0300 Subject: [PATCH] refactor api_server: streamline RSS feed generation by consolidating error handling and removing redundant loop structure --- api_server.py | 87 ++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/api_server.py b/api_server.py index 4bf180e..b0fed6c 100644 --- a/api_server.py +++ b/api_server.py @@ -803,50 +803,51 @@ async def get_rss_feed(channel: str, elif Config["token"] and is_local_request(request): logger.info(f"Local request, skipping token check for RSS endpoint.") - while True: - try: - start_time = time.time() - - if output_type == 'rss': - rss_content = await generate_channel_rss(channel, - client=client.client, - limit=limit, - exclude_flags=exclude_flags, - exclude_text=exclude_text, - merge_seconds=merge_seconds) - elapsed_time = time.time() - start_time - logger.info(f"rss_generation_timing: channel {channel}, generated in {elapsed_time:.3f} seconds") - return Response(content=rss_content, media_type="application/xml") - elif output_type == 'html': - rss_content = await generate_channel_html(channel, - client=client.client, - limit=limit, - exclude_flags=exclude_flags, - exclude_text=exclude_text, - merge_seconds=merge_seconds) - elapsed_time = time.time() - start_time - logger.info(f"html_generation_timing: channel {channel}, generated in {elapsed_time:.3f} seconds") - return Response(content=rss_content, media_type="text/html") - except ValueError as e: - error_message = f"invalid_parameters_error: {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 - random_additional_wait = random.uniform(0, wait_time * 2.5) - total_wait_time = wait_time + random_additional_wait - if total_wait_time > 190: total_wait_time = 190 + try: + start_time = time.time() - logger.warning(f"flood_wait_error: channel {channel}, retry after {total_wait_time:.1f} seconds (base: {wait_time}s, random: {random_additional_wait:.1f}s)") - return Response( - status_code=429, - headers={"Retry-After": str(int(total_wait_time))}, - content="Too many requests, please try again later" - ) - except Exception as e: - error_message = f"rss_generation_error: channel {channel}, error {str(e)}" - logger.error(error_message) - raise HTTPException(status_code=500, detail=error_message) from e + if output_type == 'rss': + rss_content = await generate_channel_rss(channel, + client=client.client, + limit=limit, + exclude_flags=exclude_flags, + exclude_text=exclude_text, + merge_seconds=merge_seconds) + elapsed_time = time.time() - start_time + logger.info(f"rss_generation_timing: channel {channel}, generated in {elapsed_time:.3f} seconds") + return Response(content=rss_content, media_type="application/xml") + elif output_type == 'html': + rss_content = await generate_channel_html(channel, + client=client.client, + limit=limit, + exclude_flags=exclude_flags, + exclude_text=exclude_text, + merge_seconds=merge_seconds) + elapsed_time = time.time() - start_time + logger.info(f"html_generation_timing: channel {channel}, generated in {elapsed_time:.3f} seconds") + return Response(content=rss_content, media_type="text/html") + else: + raise HTTPException(status_code=400, detail=f"invalid_output_type: {output_type}") + except ValueError as e: + error_message = f"invalid_parameters_error: {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 + random_additional_wait = random.uniform(0, wait_time * 2.5) + total_wait_time = wait_time + random_additional_wait + if total_wait_time > 190: total_wait_time = 190 + + logger.warning(f"flood_wait_error: channel {channel}, retry after {total_wait_time:.1f} seconds (base: {wait_time}s, random: {random_additional_wait:.1f}s)") + return Response( + status_code=429, + headers={"Retry-After": str(int(total_wait_time))}, + content="Too many requests, please try again later" + ) + except Exception as e: + error_message = f"rss_generation_error: channel {channel}, error {str(e)}" + logger.error(error_message) + raise HTTPException(status_code=500, detail=error_message) from e @app.get("/flags", response_model=List[str]) @app.get("/flags/{token}", response_model=List[str])