mirror of
https://github.com/python-kasa/python-kasa.git
synced 2025-10-12 10:28:01 +00:00
Handle smartcam partial list responses (#1411)
This commit is contained in:
@@ -180,7 +180,9 @@ class SmartProtocol(BaseProtocol):
|
||||
# make mypy happy, this should never be reached..
|
||||
raise KasaException("Query reached somehow to unreachable")
|
||||
|
||||
async def _execute_multiple_query(self, requests: dict, retry_count: int) -> dict:
|
||||
async def _execute_multiple_query(
|
||||
self, requests: dict, retry_count: int, iterate_list_pages: bool
|
||||
) -> dict:
|
||||
debug_enabled = _LOGGER.isEnabledFor(logging.DEBUG)
|
||||
multi_result: dict[str, Any] = {}
|
||||
smart_method = "multipleRequest"
|
||||
@@ -275,9 +277,11 @@ class SmartProtocol(BaseProtocol):
|
||||
response, method, raise_on_error=raise_on_error
|
||||
)
|
||||
result = response.get("result", None)
|
||||
await self._handle_response_lists(
|
||||
result, method, retry_count=retry_count
|
||||
)
|
||||
request_params = rp if (rp := requests.get(method)) else None
|
||||
if iterate_list_pages and result:
|
||||
await self._handle_response_lists(
|
||||
result, method, request_params, retry_count=retry_count
|
||||
)
|
||||
multi_result[method] = result
|
||||
|
||||
# Multi requests don't continue after errors so requery any missing.
|
||||
@@ -303,7 +307,9 @@ class SmartProtocol(BaseProtocol):
|
||||
smart_method = next(iter(request))
|
||||
smart_params = request[smart_method]
|
||||
else:
|
||||
return await self._execute_multiple_query(request, retry_count)
|
||||
return await self._execute_multiple_query(
|
||||
request, retry_count, iterate_list_pages
|
||||
)
|
||||
else:
|
||||
smart_method = request
|
||||
smart_params = None
|
||||
@@ -330,12 +336,21 @@ class SmartProtocol(BaseProtocol):
|
||||
result = response_data.get("result")
|
||||
if iterate_list_pages and result:
|
||||
await self._handle_response_lists(
|
||||
result, smart_method, retry_count=retry_count
|
||||
result, smart_method, smart_params, retry_count=retry_count
|
||||
)
|
||||
return {smart_method: result}
|
||||
|
||||
def _get_list_request(
|
||||
self, method: str, params: dict | None, start_index: int
|
||||
) -> dict:
|
||||
return {method: {"start_index": start_index}}
|
||||
|
||||
async def _handle_response_lists(
|
||||
self, response_result: dict[str, Any], method: str, retry_count: int
|
||||
self,
|
||||
response_result: dict[str, Any],
|
||||
method: str,
|
||||
params: dict | None,
|
||||
retry_count: int,
|
||||
) -> None:
|
||||
if (
|
||||
response_result is None
|
||||
@@ -355,8 +370,9 @@ class SmartProtocol(BaseProtocol):
|
||||
)
|
||||
)
|
||||
while (list_length := len(response_result[response_list_name])) < list_sum:
|
||||
request = self._get_list_request(method, params, list_length)
|
||||
response = await self._execute_query(
|
||||
{method: {"start_index": list_length}},
|
||||
request,
|
||||
retry_count=retry_count,
|
||||
iterate_list_pages=False,
|
||||
)
|
||||
|
Reference in New Issue
Block a user