добавлена возможность задать глобальный timeout для всех запросов close #362

このコミットが含まれているのは:
Ilya (Marshal) 2022-10-31 14:57:28 +01:00
コミット d0d58c3ff4
5個のファイルの変更295行の追加716行の削除

ファイルの表示

@ -29,10 +29,9 @@ def gen_request(output_request_filename):
code = code.replace(f'self.{method}(', f'await self.{method}(')
code = code.replace('proxies=self.proxies', 'proxy=self.proxy_url')
code = code.replace('timeout=timeout', 'timeout=aiohttp.ClientTimeout(total=timeout)')
# undo one specific case
code = code.replace(
'self.retrieve(url, timeout=aiohttp.ClientTimeout(total=timeout)', 'self.retrieve(url, timeout=timeout'
"kwargs['timeout'] = self._timeout",
f"kwargs['timeout'] = aiohttp.ClientTimeout(total=self._timeout)\n{' ' * 8}else:\n{' ' * 12}kwargs['timeout'] = aiohttp.ClientTimeout(total=kwargs['timeout'])",
)
# download method

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイルの表示

@ -29,11 +29,14 @@ USER_AGENT = 'Yandex-Music-API'
HEADERS = {
'X-Yandex-Music-Client': 'YandexMusicAndroid/23020251',
}
DEFAULT_TIMEOUT = 5
reserved_names = keyword.kwlist + ['client']
logging.getLogger('urllib3').setLevel(logging.WARNING)
default_timeout = object()
class Request:
"""Вспомогательный класс для yandex_music, представляющий методы для выполнения POST и GET запросов, скачивания
@ -45,9 +48,12 @@ class Request:
proxy_url (:obj:`str`, optional): Прокси.
"""
def __init__(self, client=None, headers=None, proxy_url=None):
def __init__(self, client=None, headers=None, proxy_url=None, timeout=default_timeout):
self.headers = headers or HEADERS.copy()
self._timeout = DEFAULT_TIMEOUT
self.set_timeout(timeout)
self.client = self.set_and_return_client(client)
# aiohttp
@ -67,6 +73,16 @@ class Request:
"""
self.headers.update({'Accept-Language': lang})
def set_timeout(self, timeout: Union[int, float, object] = default_timeout):
"""Устанавливает время ожидания для всех запросов.
Args:
timeout (:obj:`int` | :obj:`float`): Время ожидания от сервера.
"""
self._timeout = timeout
if timeout is default_timeout:
self._timeout = DEFAULT_TIMEOUT
def set_authorization(self, token: str) -> None:
"""Добавляет заголовок авторизации для каждого запроса.
@ -192,6 +208,9 @@ class Request:
kwargs['headers']['User-Agent'] = USER_AGENT
if kwargs['timeout'] is default_timeout:
kwargs['timeout'] = self._timeout
try:
resp = requests.request(*args, **kwargs)
except requests.Timeout:
@ -222,7 +241,9 @@ class Request:
else:
raise NetworkError(f'{message} ({resp.status_code}): {resp.content}')
def get(self, url: str, params: dict = None, timeout: Union[int, float] = 5, *args, **kwargs) -> Union[dict, str]:
def get(
self, url: str, params: dict = None, timeout: Union[int, float] = default_timeout, *args, **kwargs
) -> Union[dict, str]:
"""Отправка GET запроса.
Args:
@ -245,7 +266,7 @@ class Request:
return self._parse(result).get_result()
def post(self, url, data=None, timeout=5, *args, **kwargs) -> Union[dict, str]:
def post(self, url, data=None, timeout=default_timeout, *args, **kwargs) -> Union[dict, str]:
"""Отправка POST запроса.
Args:
@ -268,7 +289,7 @@ class Request:
return self._parse(result).get_result()
def retrieve(self, url, timeout=5, *args, **kwargs) -> bytes:
def retrieve(self, url, timeout=default_timeout, *args, **kwargs) -> bytes:
"""Отправка GET запроса и получение содержимого без обработки (парсинга).
Args:
@ -286,7 +307,7 @@ class Request:
"""
return self._request_wrapper('GET', url, proxies=self.proxies, timeout=timeout, *args, **kwargs)
def download(self, url, filename, timeout=5, *args, **kwargs) -> None:
def download(self, url, filename, timeout=default_timeout, *args, **kwargs) -> None:
"""Отправка запроса на получение содержимого и его запись в файл.
Args:

ファイルの表示

@ -35,11 +35,14 @@ USER_AGENT = 'Yandex-Music-API'
HEADERS = {
'X-Yandex-Music-Client': 'YandexMusicAndroid/23020251',
}
DEFAULT_TIMEOUT = 5
reserved_names = keyword.kwlist + ['client']
logging.getLogger('urllib3').setLevel(logging.WARNING)
default_timeout = object()
class Request:
"""Вспомогательный класс для yandex_music, представляющий методы для выполнения POST и GET запросов, скачивания
@ -51,9 +54,12 @@ class Request:
proxy_url (:obj:`str`, optional): Прокси.
"""
def __init__(self, client=None, headers=None, proxy_url=None):
def __init__(self, client=None, headers=None, proxy_url=None, timeout=default_timeout):
self.headers = headers or HEADERS.copy()
self._timeout = DEFAULT_TIMEOUT
self.set_timeout(timeout)
self.client = self.set_and_return_client(client)
# aiohttp
@ -73,6 +79,16 @@ class Request:
"""
self.headers.update({'Accept-Language': lang})
def set_timeout(self, timeout: Union[int, float, object] = default_timeout):
"""Устанавливает время ожидания для всех запросов.
Args:
timeout (:obj:`int` | :obj:`float`): Время ожидания от сервера.
"""
self._timeout = timeout
if timeout is default_timeout:
self._timeout = DEFAULT_TIMEOUT
def set_authorization(self, token: str) -> None:
"""Добавляет заголовок авторизации для каждого запроса.
@ -198,6 +214,11 @@ class Request:
kwargs['headers']['User-Agent'] = USER_AGENT
if kwargs['timeout'] is default_timeout:
kwargs['timeout'] = aiohttp.ClientTimeout(total=self._timeout)
else:
kwargs['timeout'] = aiohttp.ClientTimeout(total=kwargs['timeout'])
try:
async with aiohttp.request(*args, **kwargs) as _resp:
resp = _resp
@ -231,7 +252,7 @@ class Request:
raise NetworkError(f'{message} ({resp.status}): {content}')
async def get(
self, url: str, params: dict = None, timeout: Union[int, float] = 5, *args, **kwargs
self, url: str, params: dict = None, timeout: Union[int, float] = default_timeout, *args, **kwargs
) -> Union[dict, str]:
"""Отправка GET запроса.
@ -250,19 +271,12 @@ class Request:
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
"""
result = await self._request_wrapper(
'GET',
url,
params=params,
headers=self.headers,
proxy=self.proxy_url,
timeout=aiohttp.ClientTimeout(total=timeout),
*args,
**kwargs,
'GET', url, params=params, headers=self.headers, proxy=self.proxy_url, timeout=timeout, *args, **kwargs
)
return self._parse(result).get_result()
async def post(self, url, data=None, timeout=5, *args, **kwargs) -> Union[dict, str]:
async def post(self, url, data=None, timeout=default_timeout, *args, **kwargs) -> Union[dict, str]:
"""Отправка POST запроса.
Args:
@ -280,19 +294,12 @@ class Request:
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
"""
result = await self._request_wrapper(
'POST',
url,
headers=self.headers,
proxy=self.proxy_url,
data=data,
timeout=aiohttp.ClientTimeout(total=timeout),
*args,
**kwargs,
'POST', url, headers=self.headers, proxy=self.proxy_url, data=data, timeout=timeout, *args, **kwargs
)
return self._parse(result).get_result()
async def retrieve(self, url, timeout=5, *args, **kwargs) -> bytes:
async def retrieve(self, url, timeout=default_timeout, *args, **kwargs) -> bytes:
"""Отправка GET запроса и получение содержимого без обработки (парсинга).
Args:
@ -308,11 +315,9 @@ class Request:
Raises:
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
"""
return await self._request_wrapper(
'GET', url, proxy=self.proxy_url, timeout=aiohttp.ClientTimeout(total=timeout), *args, **kwargs
)
return await self._request_wrapper('GET', url, proxy=self.proxy_url, timeout=timeout, *args, **kwargs)
async def download(self, url, filename, timeout=5, *args, **kwargs) -> None:
async def download(self, url, filename, timeout=default_timeout, *args, **kwargs) -> None:
"""Отправка запроса на получение содержимого и его запись в файл.
Args: