From baacf83974ed483d75aa7aa644c5ebfce151c56b Mon Sep 17 00:00:00 2001 From: arabcoders Date: Thu, 1 Jan 2026 20:19:31 +0300 Subject: [PATCH] Refactor: run extract_info in separate thread --- app/routes/api/conditions.py | 24 +++++++++++++++++------- app/routes/api/yt_dlp.py | 23 ++++++++++++++++------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/app/routes/api/conditions.py b/app/routes/api/conditions.py index 6ce20818..a5102701 100644 --- a/app/routes/api/conditions.py +++ b/app/routes/api/conditions.py @@ -1,3 +1,5 @@ +import asyncio +import functools import logging import uuid from collections import OrderedDict @@ -153,14 +155,22 @@ async def conditions_test(request: Request, encoder: Encoder, cache: Cache, conf preset: str = params.get("preset", config.default_preset) key: str = cache.hash(url + str(preset)) if not cache.has(key): - data: dict = extract_info( - config=YTDLPOpts.get_instance().preset(name=preset).get_all(), - url=url, - debug=False, - no_archive=True, - follow_redirect=True, - sanitize_info=True, + data: dict | None = await asyncio.wait_for( + fut=asyncio.get_running_loop().run_in_executor( + None, + functools.partial( + extract_info, + config=YTDLPOpts.get_instance().preset(name=preset).get_all(), + url=url, + debug=False, + no_archive=True, + follow_redirect=True, + sanitize_info=True, + ), + ), + timeout=120, ) + if not data: return web.json_response( data={"error": f"Failed to extract info from '{url!s}'."}, diff --git a/app/routes/api/yt_dlp.py b/app/routes/api/yt_dlp.py index e11ec531..eeb6d9f6 100644 --- a/app/routes/api/yt_dlp.py +++ b/app/routes/api/yt_dlp.py @@ -1,3 +1,5 @@ +import asyncio +import functools import json import logging import time @@ -163,13 +165,20 @@ async def get_info(request: Request, cache: Cache, config: Config) -> Response: }, } - data = extract_info( - config=ytdlp_opts, - url=url, - debug=False, - no_archive=True, - follow_redirect=True, - sanitize_info=True, + data: dict | None = await asyncio.wait_for( + fut=asyncio.get_running_loop().run_in_executor( + None, + functools.partial( + extract_info, + config=ytdlp_opts, + url=url, + debug=False, + no_archive=True, + follow_redirect=True, + sanitize_info=True, + ), + ), + timeout=120, ) if not data or not isinstance(data, dict):