From 3eff9519dbb02581707c41274ad9148e6ada4972 Mon Sep 17 00:00:00 2001 From: ubuntu Date: Sun, 30 Aug 2026 23:35:57 +0000 Subject: [PATCH] Stop Xtream imports from freezing the server while fetching from the provider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit run_xtream_import made 6 sequential synchronous requests.get() calls (60s timeout each) directly inside an asyncio task, so the whole event loop — and every other request/socket the server was handling — stalled for the full duration of each Xtream import, same failure mode as the logo-download freeze fixed earlier. Run them through run_in_executor instead so the loop stays free. Co-Authored-By: Claude Sonnet 5 --- server.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/server.py b/server.py index a32c53e..b927bec 100644 --- a/server.py +++ b/server.py @@ -741,19 +741,20 @@ async def run_xtream_import(id_playlist, import_key, collection_channels, try: await emit_analysis_progress({'percentage': 0.02}, sidClient) - live_categories = parse_xtream_category_map( - fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_live_categories') - ) - vod_categories = parse_xtream_category_map( - fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_vod_categories') - ) - series_categories = parse_xtream_category_map( - fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_series_categories') - ) + loop = asyncio.get_running_loop() - live_streams = fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_live_streams') - vod_streams = fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_vod_streams') - series_list = fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_series') + async def fetch(action, **extra_params): + return await loop.run_in_executor( + None, lambda: fetch_xtream_json(xtream_server, xtream_username, xtream_password, action, **extra_params) + ) + + live_categories = parse_xtream_category_map(await fetch('get_live_categories')) + vod_categories = parse_xtream_category_map(await fetch('get_vod_categories')) + series_categories = parse_xtream_category_map(await fetch('get_series_categories')) + + live_streams = await fetch('get_live_streams') + vod_streams = await fetch('get_vod_streams') + series_list = await fetch('get_series') total_steps = max(1, len(live_streams) + len(vod_streams) + len(series_list)) processed_steps = 0