добавлена возможность задать глобальный 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(f'self.{method}(', f'await self.{method}(')
code = code.replace('proxies=self.proxies', 'proxy=self.proxy_url') 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( 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 # download method

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

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

ファイルの表示

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

ファイルの表示

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